[英]what does this mean in PHP ()->
我已經在Yii框架上看到了這種語法的用法。 我嘗試尋找解釋,但沒有示例。 如果可能的話,鏈接會很好。 它類似於class::model()->function();
我的理解是模型是類的對象,因此它可以訪問該函數。 因此,我嘗試對其進行編碼,但得到“在非對象中調用成員函數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();
還有什么好處呢?
這稱為對象運算符 ,而->
則從您在該類中定義的創建對象中調用類方法。
這是一個解釋和一些示例。
$obj = new Class; // Object of the class
$obj->classMethod(); // Calling a method from that class with the object
echo cat::obj()->sound();
這將顯示sound()
方法的輸出,該方法在cat::obj()
返回的對象上調用。
失敗的原因是因為cat::obj()
沒有返回有效的對象。
這樣做的原因是因為obj()
方法返回靜態obj
屬性,但實際上您並未在任何地方設置該obj
屬性。
您在此處嘗試使用的模式稱為“ Singleton”對象。 在這種模式下,您調用obj()
方法來獲取該類的單個實例。 每次調用該方法都會給您相同的對象。
但是,第一次調用該方法需要實例化該對象。 這就是你所缺少的。
public static function obj($className = __CLASS__){
if(!static::$obj) {static::$obj = new static;}
return static::$obj;
}
如果對象不存在,請參見在其中創建對象的新行。
另請注意,我已將self
更改為static
。 在類繼承中使用此方法的方式意味着,您可能希望每種類類型都有一個不同的靜態對象, self
將始終返回根animal::$obj
屬性,而static
將為每個類返回$obj
屬性。你是從那里打來的。
您還需要注意其他一些錯誤。 例如,您已經將sound()
方法定義為static
,但是使用->
調用了它,因此它不應該是靜態的。
希望能有所幫助。
cat::obj()
返回一個cat類型的對象。 使用->sound();
您正在執行cat類的sound()函數。 所有這些都應該返回“喵”。
cat::obj()
返回一個對象; ->sound();
執行此對象的方法。 等效為
$o = cat::obj();
$o->sound();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.