2010-10-05 72 views
0

如何从已创建的对象访问扩展类功能?帮助访问扩展类功能 - PHP OOP

(A) - 这工作的,按不创建一个对象:

$UserType = 'User_Vote'; 
$vote = User::getVote($UserType)->getVoteQuery(); 

(B) - 试图从已经创建的对象同样的想法(这是我想做的事情)将返回错误:意外T_PAAMAYIM_NEKUDOTAYIM(意外 '::')

$UserType = 'User_Vote'; 
$object = new User(); 
$vote = $object::getVote($UserType)->getVoteQuery(); 

(C) - 但这种工作原理:

$UserType = 'User_Vote'; 
$object = new User(); 
$objectUserType = $object->getVote($UserType); 
$finalObject = $objectUserType->getVoteQuery(); 

为什么不会阻止(B)双重'::'工作?它看起来与块(A)相同,除了该对象已经创建。我需要像块(C)那样分别调用每个函数来解决这个问题吗?

+0

*(reference)* [Scope Resolution Operator](http://de.php.net/manual/en/language.oop5.paamayim-nekudotayim.php) – Gordon 2010-10-05 07:51:15

+0

您还在使用PHP4吗? – Matthew 2010-10-05 07:54:51

+1

感谢Gordon,它说:“从PHP 5.3.0开始,可以使用变量引用类。”我在5.2.6上。所以我不能拥有这个功能。 – JMC 2010-10-05 08:00:35

回答

3

::用于访问静态方法或属性。关键字是,而不是对象
->用于访问对象方法或属性。它不适用于类。

两者不可互换。

+0

这解释了它。谢谢 – JMC 2010-10-05 08:10:29

+2

@JMC BTW,事先决定你的方法应该被称为静态*(作为类方法)还是作为对象方法并坚持这个决定。不要在整个代码中都调用它们,或者当你开始使用类/对象上下文特定的关键字,如'self'或'$ this'时,它最终会中断。 – deceze 2010-10-05 08:16:06

+0

感谢您的额外建议并提供了坚实的基础。在做出决定之前,我会先阅读更多内容。当前代码从返回'self ::'的对象中调用静态类方法。这是导致问题的混合类型吗? – JMC 2010-10-05 08:43:18

1

您仍然可以使用->访问器链接PHP 5中的方法。例如。

$vote = $object->getVote($UserType)->getVoteQuery(); 

的一类情况下访问static方法和属性时,您应该只使用Paamayim Nekudotayim,或::,没有对象上下文。