2010-08-13 5 views
13

Je suppose qu'il n'y a pas de différence mais une préférence personnelle, mais en lisant divers codes PHP, je trouve les deux façons d'accéder à la classe des méthodes.self :: vs className :: inside static className metods en PHP

Quelle est la différence:

class Myclass 
{ 
    public static $foo; 

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

Désolé je lui ai donné une mauvaise réponse la première fois . Voir la réponse mise à jour. – Artefacto

Répondre

30

(Note: la version initiale a dit qu'il n'y avait pas de différence En fait, il est.)

Il y a en effet une petite diférence. self:: transmet les appels statiques, tandis que className:: ne le fait pas. Cela ne concerne que late static bindings en PHP 5.3+.

Dans les appels statiques, PHP 5.3+ se souvient de la classe initialement appelée. En utilisant className::, PHP "oublie" cette valeur (c'est-à-dire la réinitialise à className), tandis que self:: le conserve. Tenir compte:

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

des informations très importantes, merci. – raveren

+0

Correction/ajout important: le mot-clé 'static' a été introduit à cette fin. Ajouter un 'const FOO = __CLASS __;' à chaque A, B et C, et faire 'A :: foo()' imprimer à la fois 'self :: FOO' et' static :: FOO'. Seul ce dernier sera correct pour 'C :: baz()'. – janmoesen

+0

@Artefacto que recommanderiez-vous pour une application typique qui n'utilise pas de liaisons statiques tardives? Opteriez-vous pour 'self ::' ou 'MyClass ::'? Lequel avez-vous suggéré de faire plus efficacement? Merci –

1

Avec l'auto vous pouvez l'utiliser au sein de la classe et avec les « MyClass », que vous avez, vous pouvez référencer l'extérieur:

$instance = new Myclass(); 
$variable = $instance::$foo 
Questions connexes