我有一些已经使用了很长时间的代码,但是现在却产生了令人困惑的错误。我必须假设这是由于我转向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,但问题仍然存在。我应该使用更好的做法吗?
编辑添加:
在尝试制作一个简单的案例来重现此问题后,我不得不继续前进。相关因素包括:
self::MY_CONSTANT
)中的常量也会创建有毒变量我的解决方案是回滚到正常运行的php 7.2.14。我只能在php 7.3的一个错误中假定这一点。
答案 0 :(得分:1)
作为解决方法,您可以这样做:
[SBV Person]
这假设*Main> cspAncestors
Solution #1:
person = Claudia :: Person
Solution #2:
person = Stephen :: Person
Found 2 different solutions.
对于该参数不是有效值;如果有的话,请用其他无效值替换它。如果参数可以合法地是任何值,则此解决方法将不起作用。