-1

我在 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();

还有它有什么好处?

4

4 回答 4

6

这称为对象运算符,而 this,->则从您创建的对象中调用类方法,该对象在该类中定义。

是一个解释和一些例子。

$obj = new Class; // Object of the class
$obj->classMethod(); // Calling a method from that class with the object
于 2013-10-22T14:56:24.327 回答
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;
}

如果对象不存在,请查看创建对象的新行。

另请注意,我已更改selfstatic. 将其与类继承一起使用的方式意味着您可能希望每种类类型都有一个不同的静态对象,self将始终返回根animal::$obj属性,而static将返回$obj您从中调用它的任何类的属性。

您还需要注意一些其他错误。例如,您已将sound()方法定义为static,但您使用 调用它->,因此它不应该是静态的。

希望有帮助。

于 2013-10-22T15:12:13.740 回答
1

返回一个 cat 类型的cat::obj()对象。->sound();你正在执行 cat 类中的函数 sound() 。所有这些都应该返回“喵”。

于 2013-10-22T15:00:58.553 回答
0

cat::obj()返回一个对象;->sound();执行此对象的方法。等价于

$o = cat::obj();
$o->sound();
于 2013-10-22T15:01:52.673 回答