2010-08-13 15 views
13

Ich denke, es mag keinen Unterschied, aber persönliche Vorliebe, aber beim Lesen verschiedener PHP-Code finde ich beide Möglichkeiten, um die Methoden-Klasse zugreifen.self :: vs className :: innerhalb static className Metoden in PHP

Was ist der Unterschied:

class Myclass 
{ 
    public static $foo; 

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

Leider habe ich eine falsche Antwort das erste Mal . Siehe die aktualisierte Antwort. – Artefacto

Antwort

30

(Hinweis: die erste Version sagte, dass es keinen Unterschied Eigentlich gibt es.)

Es ist in der Tat eine kleine diference. self:: leitet statische Anrufe weiter, während className:: nicht funktioniert. Dies betrifft nur late static bindings in PHP 5.3+.

In statischen Aufrufen erinnert sich PHP 5.3+ an die anfänglich aufgerufene Klasse. Die Verwendung von className:: lässt PHP diesen Wert "vergessen" (d. H. Setzt ihn auf className zurück), während self:: ihn bewahrt. Bedenken Sie:

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

sehr wichtige Informationen, danke. – raveren

+0

Wichtige Korrektur/Ergänzung: Zu diesem Zweck wurde das Schlüsselwort 'static' eingeführt. Füge ein 'const FOO = __CLASS __;' zu jedem A, B und C hinzu und mache 'A :: foo()' print sowohl 'self :: FOO' als auch' static :: FOO'. Nur letzteres wird tatsächlich für 'C :: baz()' korrekt sein. – janmoesen

+0

@Artefacto Welche würden Sie für eine typische Anwendung empfehlen, die keine späte statische Bindungen verwendet? Würden Sie sich für 'self ::' oder 'MyClass ::' entscheiden? Was haben Sie vorgeschlagen, effizienter durchgeführt zu werden? Danke –

1

Mit Selbst Sie es innerhalb der Klasse verwenden können, und mit den „MyClass“, wie Sie haben, können Sie es von außen verweisen können:

$instance = new Myclass(); 
$variable = $instance::$foo 
Verwandte Themen