【问题标题】:Strange result using instance methods in PHP 5.3在 PHP 5.3 中使用实例方法的奇怪结果
【发布时间】:2012-01-12 20:12:51
【问题描述】:

想知道下面的示例实际上是如何工作的,以及如何能够动态地执行类似的操作。使用call_user_funccall_user_func_array 不允许这种情况发生。

<?php
class Person
{
    public $name = "George";

    public function say_hi()
    {
            return ExtraMethods::hi();
    }
}

class ExtraMethods
{
    public function hi()
    {
            return "Hi, ".$this->name;
    }
}

$george = new Person();
echo $george->say_hi();
?>

这应该是:

Hi, George

想知道为什么实例方法 hi 不仅可以静态调用(这在 PHP 中会发生并不奇怪),而且为什么我能够使用 $this

【问题讨论】:

    标签: php methods instance


    【解决方案1】:

    来自manual

    当从对象上下文中调用方法时,伪变量 $this 可用。 $this 是对调用对象的引用(通常是方法所属的对象,但也可能是另一个对象,如果该方法是从辅助对象的上下文中静态调用的)。

    因此,根据第二部分,设计。请记住,它使用了实际存在的对象实例(换句话说,如果将public $name = "SomethingElse"; 添加到ExtraMethods,结果仍然是Hi, George)。

    静态调用方法不是正确的编码,但是 PHP 原谅你,并且只发出一个严格错误:

    "Strict Standards: Non-static method ExtraMethods::hi() should not be called statically, assuming $this from incompatible context in ..."
    

    当然,在这种情况下,将对象作为参数传递会更加清晰和可取。

    【讨论】:

    • 啊,非常有道理。我想这是为了某种遗留支持而完成的?
    • 好吧,也许是 PHP4 遗留的,'static' 关键字/静态方法当时不可用。
    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多