2011-01-17 19 views
46

Estoy un poco confundido con este asunto. Estoy diseñando una clase ORM que intenta comportarse de manera muy similar a ActiveRecord en ruby ​​on rails, pero eso está al lado del punto.PHP Can static :: replace self ::?

Lo que estoy tratando de decir es que mi clase hace un uso extensivo de la herencia de atributos estáticos, especialmente para el manejo de bases de datos y tablas. Mi pregunta es, ¿debería usar Self :: en absoluto?

+0

pienso 'static' es el enfoque equivocado en primer lugar. Parece que (y corrija si está mal) acaba de hacer que su código no sea comprobable. – PeeHaa

Respuesta

94

Tienes que preguntarte: "¿Me estoy dirigiendo al problema con el enfoque adecuado?"

self:: y static:: hacen dos cosas diferentes. Por ejemplo, self:: o __CLASS__ son referencias a la clase actual, por lo que se define en cierto ámbito NO será suficiente la necesidad de realizar llamadas estáticas en reenvío.

¿Qué pasará con la herencia?

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     self::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 

B::test(); 

Esto imprimirá

A 

En el otro lado con static:: Tiene el comportamiento esperado

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     static::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 


B::test(); 

Esto imprimirá

B 

que se llama late static binding in PHP 5.3.0. Resuelve la limitación de llamar a la clase que fue referenciada en el tiempo de ejecución.

Con esto en mente, creo que ahora puede ver y resolver el problema adecuadamente. Si está heredando varios miembros estáticos y necesita acceso a los miembros principales y secundarios self:: no será suficiente.

+8

Entonces, básicamente, si quiero que las cosas se comporten como siempre, como en cualquier otro idioma, ¿debería usar estática? Y luego, cuando tales cosas realmente no importen, también podría usar yo para la compatibilidad. ¿Es eso correcto? – elite5472

+7

Así es, si quieres compatibilidad con versiones anteriores, tendrás que lidiar contigo mismo. Si desea acceder a miembros estáticos de esa manera, tendrá que hacer un método estático que envuelva a los miembros. – DarkThrone

+0

bien, gracias por aclarar las cosas para mí. – elite5472

6

intenta utilizar el código de abajo para ver la diferencia entre auto y estática:

<?php 
class Parent_{ 
    protected static $x = "parent"; 
    public static function makeTest(){ 
     echo "self => ".self::$x."<br>"; 
     echo "static => ".static::$x;  
    } 
} 

class Child_ extends Parent_{ 
    protected static $x = "child"; 
} 

echo "<h4>using the Parent_ class</h4>"; 
Parent_::makeTest(); 

echo "<br><h4>using the Child_ class</h4>"; 
Child_::makeTest(); 
?> 

y se obtiene este resultado:

utilizando la clase Parent_

  • auto => padres
  • estática => padres

utilizando la clase Child_

  • auto => padres
  • estática => niño