2011-06-03 76 views
2

這裏是我處理的類的一個簡化版本家長靜態函數調用靜態子變量

class A { 
    static protected function getVal() { 
       return self::$valB; 
      } 
} 
class B extend A { 
    static protected $valB = 'Hello'; 
} 
B::getVal(); // Hello 

如若這項工作的PHP版本5.2.17或我有它的設置是錯誤的。我目前收到錯誤,說它找不到A::$valB

+0

實際的錯誤「訪問未聲明的靜態屬性:A :: $ valB「 – Clutch 2011-06-03 20:59:00

回答

1

首先,你的代碼的語法是錯誤的。開始修復它:

class A { 
    static protected function getVal() { 
     return self::$valB; 
    } 
} 
class B extends A { 
    static protected $valB = 'Hello'; 
} 
B::getVal(); 

現在,這將永遠不會工作,因爲getVal受保護。除非您從A或其孩子之一撥打電話,否則無法使用。

關鍵字self解析爲調用它的類。由於self用於Aself == A

您將需要使用後期靜態綁定表來解決它:

return static::$valB; 

最後,我建議你也A聲明$valB以避免致命錯誤:

class A { 
    static protected $valB; 
    static protected function getVal() { ... } 
} 
+0

在B中聲明$ valB的原因是因爲會有一個BC D,將擴展A的E類將爲$ valB具有不同的值。靜態調用就像一個魅力,但在生產中只有PHP v5.2可用。也許這應該是擺在首位的問題。 – Clutch 2011-06-03 21:16:15

+0

@Clutch:是的,我想你會在子類中實現'$ valB',但要記住這是一個「語言功能」,其他語言不會允許這樣做。(請參見[本答案](http:/ /stackoverflow.com/questions/6165135/this-in-php-is-bound-dynamically-right/6165380#6165380))。至於5.2,不幸的是,沒有解決方法。 – netcoder 2011-06-03 21:22:20

+0

@Clutch你應該試着說服你的僱主或客戶更新到PHP 5.3,下面是一些彈藥:PHP 5.2現在不被Zend支持,並且不再提供安全補丁。 :) – damianb 2011-06-04 00:16:58