2010-08-13 12 views
13

Supongo que puede no haber ninguna diferencia, pero la preferencia personal, pero al leer varios códigos PHP me encuentro con las dos formas de acceder a la clase de métodos.self :: vs className :: dentro de los métodos static className en PHP

Lo es la diferencia:

class Myclass 
{ 
    public static $foo; 

    public static function myMethod() 
    { 
     // between: 
     self::$foo; 
     // and 
     MyClass::$foo; 
    } 
} 
+0

Lo siento, dio una respuesta equivocada la primera vez . Ver la respuesta actualizada. – Artefacto

Respuesta

30

(Nota: la versión inicial dijo que no había ninguna diferencia realidad no lo es.)

En efecto, existe una pequeña diference. self:: reenvía las llamadas estáticas, mientras que className:: no lo hace. Esto solo importa para late static bindings en PHP 5.3+.

En llamadas estáticas, PHP 5.3+ recuerda la clase inicialmente llamada. El uso de className:: hace que PHP "olvide" este valor (es decir, lo restablece a className), mientras que self:: lo conserva. Consideremos:

<?php 
class A { 
    static function foo() { 
     echo get_called_class(); 
    } 
} 
class B extends A { 
    static function bar() { 
     self::foo(); 
    } 
    static function baz() { 
     B::foo(); 
    } 
} 
class C extends B {} 

C::bar(); //C 
C::baz(); //B 
+1

información muy importante, gracias. – raveren

+0

Corrección/adición importante: la palabra clave 'static' se introdujo para este propósito. Agregue un 'const FOO = __CLASS __;' a cada A, B y C, y haga que 'A :: foo()' imprima tanto 'self :: FOO' como' static :: FOO'. Solo el último será en realidad correcto para 'C :: baz()'. – janmoesen

+0

@Artefacto, ¿cuál recomendaría para una aplicación típica que no utiliza enlaces estáticos tardíos? ¿Optaría por 'self ::' o 'MyClass ::'? ¿Qué sugirió que se realizara de manera más eficiente? Gracias –

1

Con uno mismo se puede usar dentro de la clase y con los "MyClass", ya que tienes, puede hacer referencia de forma externa:

$instance = new Myclass(); 
$variable = $instance::$foo 
Cuestiones relacionadas