【问题标题】:PHP: Access static function / method with object propertyPHP:使用对象属性访问静态函数/方法
【发布时间】:2014-05-26 14:11:16
【问题描述】:

虽然我知道可以通过多种方法调用静态方法,例如:

A::staticFunction();

$class = 'A';
$class::staticFunction();

$a = new A(); // Assume class has been defined elsewhere
$a->staticFunction();

但是,有人可以解释一下为什么以下方法不起作用,如果可能的话,如何做到这一点(不求助于提供的解决方案):

// Assume object $b has been defined & instantiated elsewhere
$b->funcName::staticFunction(); // Where funcName contains the string 'A'

这会产生以下 PHP 解析错误:

解析错误:语法错误,意外'::' (T_PAAMAYIM_NEKUDOTAYIM)

典型的工作解决方案(遵循第二种方法)(如果可能,最好避免):

// Assume object $b has been defined & instantiated elsewhere
$funcName = $b->funcName; // Where funcName contains the string 'A'
$funcName::staticFunction();

【问题讨论】:

    标签: php oop static static-methods static-functions


    【解决方案1】:

    :: 运算符用于引用非实例化类。这意味着您正在引用static 方法或变量,或conststatic 方法的标志是它们不能与您的实例一起使用。它们本质上是独立的函数,不能使用$this 来引用您的类的实例。

    因此,您不能通过引用实例来引用静态方法。你需要使用

    self::function();
    

    $this->function();
    

    虽然后者使它看起来可能是实例的一部分,但它只是为了完整性而包含在内。

    【讨论】:

    • 感谢您这么快的响应,但它不是通过引用实例来引用静态方法。它引用了一个实例的属性,它是一个字符串,而不是一个对象。
    • 您不能通过引用实例来引用static 属性。 $b 是一个实例(用-> 表示)。
    • 我明白你在说什么,但从技术上讲,正如我所说,当一个实例包含在语句中时,它引用了一个实例的属性,而不是使用实例本身来调用静态方法,而是实例属性的结果,它是一个字符串。因此,实际上,它的行为方式应该与第二个示例 ($class::staticFunction()) 相同。你知道如何按照我最初描述的方式复制这种行为吗?
    猜你喜欢
    • 2013-06-11
    • 2013-10-02
    • 2013-02-13
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多