我在 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
属性。
您尝试在此处使用的模式称为"单例"对象。在此模式中,调用 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();