我在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();
它还有什么好处?
答案 0 :(得分:6)
这称为对象运算符,这个->
从您在该类中定义的已创建对象调用类方法。
Here是一个解释和一些例子。
$obj = new Class; // Object of the class
$obj->classMethod(); // Calling a method from that class with the object
答案 1 :(得分:2)
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
,但您使用->
调用它,因此它不应该是静态的。
希望有所帮助。
答案 2 :(得分:1)
cat::obj()
会返回cat类型的对象。使用->sound();
,您将从类cat执行函数sound()。所有应该回归“喵”。
答案 3 :(得分:0)
cat::obj()
返回一个对象; ->sound();
执行此对象的方法。等价是
$o = cat::obj();
$o->sound();