可以在 PHP 中测试变量是否是静态的吗?

发布于 2024-11-18 08:30:57 字数 148 浏览 6 评论 0 原文

PHP 中是否可以测试变量是否是静态的?我正在尝试创建一个神奇的方法 __get ,它也查看静态变量。我发现当变量是静态时,property_exists() 也会返回 true。但我需要使用 :: 而不是我期望的 ->

Is it possible to test if a variable is static in PHP? I am trying create a magic method __get that also looks at static variables. I find that property_exists() returns true when a variable is static too. But I will need to use :: instead of -> I'd expect?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

春庭雪 2024-11-25 08:30:57

可以通过反射测试变量是否是静态的:

class Foo { static $bar; }
$prop = new ReflectionProperty('Foo', 'bar');
var_dump($prop->isStatic()); // TRUE

但是,这仍然不允许您将它们与魔术方法 __get__set 一起使用,因为它们只能工作在对象上下文中。 来自 PHP 魔法方法手册:

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

另请参阅 PHP 内部邮件列表上关于引入 __getStatic 的讨论:

It is possible to test if a variable is static via Reflection:

class Foo { static $bar; }
$prop = new ReflectionProperty('Foo', 'bar');
var_dump($prop->isStatic()); // TRUE

However, that still won't allow you to use them with magic methods __get or __set, because those only work in object context. From the PHP Manual on Magic Methods:

Property overloading only works in object context. These magic methods will not be triggered in static context. Therefore these methods should not be declared static. As of PHP 5.3.0, a warning is issued if one of the magic overloading methods is declared static.

Also see this discussion on the PHP Internals Mailing List about introducing __getStatic:

我不在是我 2024-11-25 08:30:57

我认为您不能使用魔术 __get() 方法访问未声明的静态属性。它将引发 PHP 致命错误。至少 PHP 版本为 5.3。

当然,如果您尝试以静态 ClassName::$propertyName 方式访问该属性,这就是结果。

I don't think you can access undeclared static property using magic __get() method. It will raise PHP Fatal error. At least with PHP of version 5.3.

That's the result if you will try to access the property as static ClassName::$propertyName of course.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文