2010-08-13 63 views
13

我想可能沒有任何區別,但個人喜好,但是當閱讀各種PHP代碼時,我遇到了訪問方法類的兩種方法。self :: vs className :: PHP中的靜態className metods

什麼的區別:

class Myclass 
{ 
    public static $foo; 

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

對不起,我給了一個錯誤的答案在第一時間。查看更新後的答案。 – Artefacto 2010-08-14 02:30:08

回答

30

(注:最初的版本說沒有差別其實是有的。)

確實是有一個小性差異。 self::轉發靜態呼叫,而className::不轉發。這隻適用於PHP 5.3+以上的late static bindings

在靜態調用中,PHP 5.3+會記住最初調用的類。使用className::會使PHP「忘記」該值(即,將其重置爲className),而self::會將其保留。試想一下:

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

非常重要的信息,謝謝。 – raveren 2010-08-14 10:14:25

+0

重要的修正/添加:爲此,引入了'static'關鍵字。爲每個A,B和C添加一個'const FOO = __CLASS __;',並使'A :: foo()'同時打印self :: FOO和static :: FOO。只有後者對於'C :: baz()'實際上是正確的。 – janmoesen 2010-09-02 11:20:08

+0

@Artefacto你會推薦一個不使用晚期靜態綁定的典型應用程序嗎?你會選擇'self ::'還是'MyClass ::'?你建議哪種方式更高效?謝謝 – 2011-07-19 22:05:55

1

有了自我,你可以在類中,並與「MyClass的」使用它,因爲你有,你可以在外部引用它:

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