2013-10-22 54 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