如果您嘗試運行下面的代碼,並期待在回溯輸出,你會看到PHP轉換instanceFunc ()在靜態上下文中調用時使用靜態方法。但是,在實例上下文中,它會將其視爲實例調用。
如果您將實例變量引入mix(刪除註釋掉的行),那麼當從靜態調用調用instanceFunc()時會遇到致命錯誤。
這意味着PHP允許所有本質上是靜態的方法(沒有實例變量可以處理)從靜態上下文中調用,只要此合約被破壞,將會產生錯誤。因此,使用靜態函數似乎只是與其他面嚮對象語言保持一致的良好實踐。
至於staticFunc()兩個呼叫顯示,PHP解釋這些靜態調用,這是可以預料的。
class A {
private $x = 5;
private $y = 6;
private $z;
public function instanceFunc() {
//$this->z = $this->y * $this->x;
//echo $this->z;
var_dump(reset(debug_backtrace()));
}
public static function staticFunc() {
var_dump(reset(debug_backtrace()));
}
}
$a = new A();
A::instanceFunc(); // static call of intended instance method
$a->instanceFunc(); // instance call of instance method
A::staticFunc();
$a->staticFunc();
示例輸出(帶有註釋運行的代碼):
array(6) { ["file"]=> string(59) "test.php" ["line"]=> int(19) ["function"]=> string(12) "instanceFunc" ["class"]=> string(1) "A" ["type"]=> string(2) "::" ["args"]=> array(0) { } }
array(7) { ["file"]=> string(59) "test.php" ["line"]=> int(22) ["function"]=> string(12) "instanceFunc" ["class"]=> string(1) "A" ["object"]=> object(A)#8 (3) { ["x:private"]=> int(5) ["y:private"]=> int(6) ["z:private"]=> NULL } ["type"]=> string(2) "->" ["args"]=> array(0) { } }
array(6) { ["file"]=> string(59) "test.php" ["line"]=> int(24) ["function"]=> string(10) "staticFunc" ["class"]=> string(1) "A" ["type"]=> string(2) "::" ["args"]=> array(0) { } }
array(6) { ["file"]=> string(59) "test.php" ["line"]=> int(26) ["function"]=> string(10) "staticFunc" ["class"]=> string(1) "A" ["type"]=> string(2) "::" ["args"]=> array(0) { } }
測試你的代碼讓我哭了... – Shoe 2011-04-19 17:18:46
套用伊恩·馬爾科姆:「僅僅因爲你可以並不意味着你應該」 :)的 – 2011-04-19 17:38:19
可能重複[是否在PHP的靜態方法與非靜態方法有什麼區別?(http://stackoverflow.com/questions/2439036/does-static-method-in-php-have-any-difference -with-非靜態方法) – danorton 2014-03-25 18:58:38