【发布时间】:2019-06-19 19:55:49
【问题描述】:
我有一些代码已经运行了很长时间,但现在却产生了令人困惑的错误。我不得不假设这是由于我迁移到 php 7.3 造成的,但我找不到任何可以解释正在发生的事情的参考资料。
我在一个类中有一个方法,看起来像:
class Foo {
function bar($param = OtherClass::MY_CONSTANT) {
logger(__METHOD__);
logger(OtherClass::MY_CONSTANT);
logger($param);
logger('ready to do stuff');
// does stuff
}
}
其中 OtherClass::MY_CONSTANT = 1。
当我从另一个类调用该方法时:
$foo = new Foo();
$foo->bar();
输出类似于:
DEBUG - Foo::bar
DEBUG - 1
然后php执行突然停止,甚至没有调用我注册的关闭函数。我可以直接在方法体中使用类常量,但不能使用默认设置为类常量值的参数。
如果我将方法更改为
function bar($param = 1) {
一切正常。
另外,如果我在调用它的工作方法时传递常量:
$foo = new Foo();
$foo->bar(OtherClass::MY_CONSTANT);
我得到了快乐
DEBUG - Foo::bar
DEBUG - 1
DEBUG - 1
DEBUG - ready to do stuff
然后继续正常执行。
使用类常量作为默认值会使变量有毒,即使我可以在方法中使用类常量而没有任何问题。
我尝试创建一个简单的单文件示例来重现此问题,但效果很好。啊。
在 php 7.3 中有什么改变会导致这种行为吗?我刚刚升级到 7.3.1,但问题仍然存在。我应该使用更好的做法吗?
编辑添加:
在尝试制作一个简单的案例来重现这一点几个小时后,我必须继续前进。相关因素包括:
- 在 php-fpm 中运行
- 关闭与浏览器的连接后运行的代码。
- 即使是同一类 (
self::MY_CONSTANT) 中的常量也会创建毒变量
我的解决方案是回滚到运行正常的 php 7.2.14。我只能在 php 7.3 中的一个错误中假设这一点。
【问题讨论】:
-
你是从哪个版本迁移过来的?
-
WFM 3v4l.org/ecDZE
-
检查您的日志。如果您无法获得有关该问题的重现、错误消息、日志或任何具体信息,那么无论他们多么想帮助,都无法提供帮助。
-
请显示其他 cass 和包含的内容。确凿的事实胜于黑盒猜测。
-
如果您能想出一种方法来重现它,您可能希望将其作为 PHP 错误报告提交。
标签: php default-value