2015-10-18 74 views
1

我希望將對象存儲爲類的屬性。然後我希望能夠通過直接引用屬性來調用該類的靜態方法。PHP,調用類屬性的靜態方法

考慮以下幾點:

class myModel { 
    public static function all() 
    { 
     return 1; 
    } 
} 

class myClass { 
    public $models; 

    public function __construct() 
    { 
     $this->models->myModel = new myModel; 
     $results = $this->models->myModel::all(); 
    } 
} 

$result = new myClass; 

PHP失敗的$results = $this->models->myModel::all();

如果我修改此通過分配class屬性一個局部變量,事情如預期:

$myModel = $this->models->myModel; 
$results = $myModel::all(); 

我'喜歡消除將類屬性分配給局部變量的需要。

這是可能的PHP 5.3.x(我使用的版本)或甚至在更高版本?

解決方案應該是可讀的,代碼的目的不應該被混淆。

爲了清楚起見,這是對工作代碼的簡化。將對象存儲在類屬性中的好處在我發佈的示例代碼中不明顯。

+0

您正在獲取_Parse錯誤:語法錯誤,意外的'::'(T_PAAMAYIM_NEKUDOTAYIM)_? – davidkonrad

回答

5

這句法會給你的錯誤是:

Parse error: syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)


但是它會在PHP 7感謝工作的Uniform Variable Syntax RFC。所有以前的版本都需要中間變量。

+0

我懷疑這是PHP目前不支持的安排。感謝您澄清並指向相關文檔。 – michaelward82

0

它在$results = $this->models->myModel::all();上失敗的原因是因爲myClass中的公共屬性$ models沒有屬性myModel(因爲它從開始是NULL),您試圖通過 - > myModel訪問它。當你在myModel模型中存儲myModel的實例時,它可能沒有正確創建。您還需要修復此$this->models->myModel = new myModel;$this->models = new myModel;,因爲$ models不是具有屬性myModel的對象,而是嘗試訪問ist。然後,$ this->模型直接指向對象myModel,您可以通過$ this-> models :: all()訪問靜態方法。

+0

類的屬性以廣告方式存在。我可以將它分配給一個局部變量。 – michaelward82