在PHP中从实例调用静态方法,是否会被未来废弃?

28

虽然我理解当一个方法在静态上下文中被调用时,$this变量不可用,但为了帮助解耦应用程序组件之间的关系,我认为从一个实例中调用静态方法是有意义的。例如:

class MyExample{
    private static $_data = array();
    public static function setData($key, $value){
        self::$_data[$key] = $value;
    }
    // other non-static methods, using self::$_data
}

// to decouple, another class or something has been passed an instance of MyExample
// rather than calling MyExample::setData() explicitly
// however, this data is now accessible by other instances
$example->setData('some', 'data');

这种功能是否计划废弃,或者我可以期待今后的支持吗?我使用 error_reporting(-1) 来确保非常严格的开发环境,并且目前还没有任何问题 (PHP 5.3.6),但我知道反过来是不被支持的;也就是说,静态调用实例方法。


$example::method() 将查找一个名为 $example 的类进行评估,因此我不认为这会起作用(除非使用 __toString() 的诡计)... 还是可以? 我没有预料到这会起作用,但它似乎确实起了作用。然而,从语法上(和技术上)来看,这是否是最佳方向值得探讨。 - Dan Lugg
希望它不会很快被弃用...否则会破坏很多代码,哈! - prodigitalson
2个回答

41

根据Php文档:

声明为静态的属性不能通过实例化类对象访问(但可以通过静态方法访问)。

所以我认为它将会得到长期的支持。


1
@bishop 2021年怎么样? - Déjà vu

3

您可以随时使用:

$class = get_class($example);
$class::setData('some', 'data');

如果您想明确指定该方法为静态方法,请使用以下代码:

或者,在类内部,您可以在非静态方法中使用关键字 self 和 static(以及函数 get_called_class):

self::setData('some', 'data');

或者

static::setData('some', 'data');

或者

$class = get_called_class();
$class::setData('some', 'data');
  • 自引用声明方法的类:如果方法在Animal类中,而Parrot扩展了Animal类,则self将引用Animal类,即使在Parrot类型的对象中调用。

  • 静态引用正在使用的对象的类($this的类),因此如果方法在Animal中,并且在Parrot实例上调用它,则引用Parrot类(例如get_class和get_called_class函数)

因此,如果您在扩展Animal类的Parrot对象中,并且以下代码编写在Animal类中:

self::setData('some', 'data');

就像

Animal::setData('some', 'data');

并且

static::setData('some', 'data');

就像

Parrot::setData('some', 'data');

作为建议,我更倾向于创建一个非静态方法,使用一个信息化的名称来调用静态方法,而不是每次从外部获取类。这样做似乎更加简洁、清晰明了。
public function setStaticData($a,$b) {
    return static::setData($a,$b);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接