为什么没有工具可以在PHP中重载静态属性?


13

介绍

PHP使您可以通过在类中声明魔术方法来重载方法调用和属性访问。这将启用以下代码:

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

除了重载实例属性和方法外,从PHP 5.3.0开始,我们还可以static通过覆盖magic方法来重载方法调用__callStatic

缺少的东西

可用功能中明显缺少的是过载静态属性的能力,例如:

echo Foo::$missingProperty; // fatal error: access to undeclared static property

此限制已明确记录在案

属性重载仅在对象上下文中起作用。这些魔术方法不会在静态上下文中触发。因此,不应声明这些方法static。从PHP 5.3.0开始,如果声明了一种魔术重载方法,则会发出警告static

但为什么?

我的问题是:

  1. 是否出于技术原因当前不支持此功能?还是(颤抖的)政治原因?
  2. 过去是否有过任何中止尝试添加此功能的尝试?

最重要的是,问题不是 “如何在userland PHP中具有动态静态属性?”。也就是说,如果您知道__callStatic要共享的特别可爱的实现,则一定要这样做。

Answers:


11

引用http://marc.info/?l=php-internals&m=121578194822276&w=2

在PHP 5.3中是否添加了静态成员重载?我注意到静态方法重载为(__callStatic)。两者将相互补充,并且将它们添加在一起似乎很自然。我确实注意到它们是“静态类” RFC和错误报告的一部分,但是很高兴在5.3中看到它们。有了这个附加功能和LSB,php类可以做很多事情!例如:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

报价跟进http://marc.info/?l=php-internals&m=121578318524848&w=2

如果将接受静态类的RFC,则静态属性拦截器将成为下一个PHP主版本的一部分(可能为5.4或6)。因此它不会进入5.3,但我们希望在将来能够实现。

链接到静态类RFC:

RFC的状态是“有效”,但鉴于它是2008年以来的,您可能需要在php.internals邮件列表或EFNet IRC的#php.pecl上询问,以了解它的内容。


谢谢,戈登,像往常一样非常有帮助。;-)虽然静态类RFC似乎建议支持静态__getStatic()__setStatic()在其上提供支持,但为可实例化的类提供此功能仍然很有用。您知道朝这个方向的任何动作吗?
David Weinraub

@DavidWeinraub不,对不起。Tbh,我不在乎与静态方法有关的事情。我几乎从来没有发现它们有什么用处,它们会导致不良的耦合和痛苦的测试。
哥顿

绝对同意!;-)但是,强加于我的某些框架使用静态模型作为其模型层。__getStatic()可以使我干燥很多现有代码。谢谢!
David Weinraub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.