2013-10-22 55 views
0

我在Yii框架上看過幾次這種語法的用法。我嘗試尋找解釋,但沒有例子。如果可能的話,鏈接將會很好。它類似於class::model()->function();這是什麼意思在PHP() - >

我的理解是模型是類的一個對象,因此它可以訪問函數。所以我試圖編碼它,但我得到「調用成員函數sound()在非對象」。這裏是我的代碼

class animal 
{ 
    private static $obj; 

    public static function obj($className = __CLASS__) 
    {   
     return self::$obj; 
    } 

    public static function walk() 
    { 
     return "walking"; 
    } 
} 


include('animal.php'); 

class cat extends animal 
{ 
    public static function obj($className = __CLASS__) 
    { 
     return parent::obj($className); 
    } 

    public static function sound() 
    { 
     return "meow"; 
    } 
} 

echo cat::obj()->sound(); 

它也有什麼好處?

回答

2
echo cat::obj()->sound(); 

這將顯示sound()方法的輸出,被稱爲是從cat::obj()返回的對象上。

它失敗的原因是因爲cat::obj()沒有返回有效的對象。

而原因是因爲obj()方法返回靜態obj屬性,但實際上並沒有在任何地方設置obj屬性。

您試圖在此處使用的模式稱爲「單例」對象。在這種模式下,您可以調用obj()方法來獲取該類的單個實例;每次調用該方法都會給你相同的對象。

但是,對方法的第一次調用需要實例化對象;這就是你想要的。

public static function obj($className = __CLASS__){ 
    if(!static::$obj) {static::$obj = new static;} 
    return static::$obj; 
} 

如果該對象不存在,請參閱創建該對象的新行。

另請注意,我已將self更改爲static。你使用類繼承的方式意味着你可能期望每個類類型都有不同的靜態對象,self將始終返回根animal::$obj屬性,而static將返回$obj屬性,無論你調用哪個類從。

還有一些其他bug也需要注意。例如,您已將sound()方法定義爲static,但您將其與->一起調用,因此它不應該是靜態的。

希望有所幫助。

+0

解釋了這麼多,我做了if(!self :: $ obj){self :: $ obj = new $ className;} return self :: $ obj;它的工作。靜態版本給我「不能訪問屬性cat :: $ obj」我應該改變貓類 –

+0

中的東西我看到你的編輯,但錯誤是一樣的。謝謝 –

+0

你使用的是什麼PHP版本? 'static'只在PHP 5.3中引入,所以如果你使用的是舊版本,它將不起作用。 (但是你不應該在這個版本以前,因爲5.2已經不支持三年了,所以如果你不在5.3,這是你的升級提示) – Spudley

6

這就是所謂的對象運算符,而這個->從您在該類中定義的創建對象中調用一個類方法。

Here是一個解釋和一些例子。

$obj = new Class; // Object of the class 
$obj->classMethod(); // Calling a method from that class with the object 
+0

感謝您的回覆,您能否向我展示示例或鏈接? –

+2

@ A.Mo發佈一個鏈接,看看它。 – Houssni

1

cat::obj()返回一個類型爲cat的對象。用->sound();你正在執行類cat的函數sound()。所有應該返回「喵」。

0

cat::obj()返回一個對象; ->sound();執行此對象的方法。當量是

$o = cat::obj(); 
$o->sound(); 
+0

sound()方法不應該是靜態的。所以或者我們應該從定義中刪除關鍵字「static」,或者用'$ o :: sound();' – Asenar

+0

@Asenar調用它你是對的,這是注意或警告。然而'$ o :: sound();'不起作用。 – Marek