2010-08-13 14 views
13

Immagino che non ci possano essere differenze ma preferenze personali, ma leggendo vari codici PHP mi imbatto in entrambi i modi per accedere alla classe dei metodi.self :: vs className :: all'interno di static className metodi in PHP

Cosa è la differenza:

class Myclass 
{ 
    public static $foo; 

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

dispiace ho dato una risposta sbagliata la prima volta . Vedi la risposta aggiornata. – Artefacto

risposta

30

(Nota: la versione iniziale ha detto che vi era alcuna differenza realtà non c'è.)

V'è infatti una piccola diference. self:: inoltra le chiamate statiche, mentre lo className:: no. Questo è importante solo per late static bindings in PHP 5.3+.

Nelle chiamate statiche, PHP 5.3+ ricorda la classe inizialmente chiamata. L'utilizzo di className:: fa sì che PHP "dimentichi" questo valore (ad esempio lo reimposta su className), mentre lo self:: lo conserva. Considerare:

<?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

informazioni molto importanti, grazie. – raveren

+0

Correzione/aggiunta importante: la parola chiave 'static' è stata introdotta per questo scopo. Aggiungi un 'const FOO = __CLASS __;' a ciascuna A, B e C, e fai 'A :: foo()' stampa sia 'self :: FOO' che' static :: FOO'. Solo quest'ultimo sarà effettivamente corretto per 'C :: baz()'. – janmoesen

+0

@Artefacto che consigliereste per un'applicazione tipica che non utilizza i collegamenti statici ritardati? Vorresti optare per 'self ::' o 'MyClass ::'? Quale suggerisci di eseguire in modo più efficiente? Grazie –

1

Con sé è possibile utilizzarlo all'interno della classe e con i "MyClass", come si deve, è possibile fare riferimento esternamente:

$instance = new Myclass(); 
$variable = $instance::$foo 
Problemi correlati