【问题标题】:php 7.3 - Class constants as default param values crashingphp 7.3 - 类常量作为默认参数值崩溃
【发布时间】: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 中的一个错误中假设这一点。

【问题讨论】:

  • 你是从哪个版本迁移过来的?
  • 检查您的日志。如果您无法获得有关该问题的重现、错误消息、日志或任何具体信息,那么无论他们多么想帮助,都无法提供帮助。
  • 请显示其他 cass 和包含的内容。确凿的事实胜于黑盒猜测。
  • 如果您能想出一种方法来重现它,您可能希望将其作为 PHP 错误报告提交。

标签: php default-value


【解决方案1】:

作为一种解决方法,您可以这样做:

function bar($param = null) {
    if ($param === null) {
        $param = OtherClass::MY_CONSTANT;
    }
    logger(__METHOD__);
    logger(OtherClass::MY_CONSTANT);
    logger($param);
    logger('ready to do stuff');

    // does stuff
}

这假定null 不是参数的有效值;如果是,则将其替换为其他一些无效值。如果参数可以是合法的任何值,则此解决方法将不起作用。

【讨论】:

  • 这没有任何区别。如果 OtherClass::MY_CONSTANT 已声明且可访问,则它可以用作默认参数或在代码主体中使用 - 否则不能。
  • @Quasimodo'sclone 它应该按照他最初编写的方式工作。这似乎是一个 PHP 错误,因此是解决方法。
  • 这个变通方法确实有效。正如我上面所说,除了作为默认参数值之外,我可以在任何地方使用常量。
猜你喜欢
  • 2010-11-16
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2013-02-17
  • 2011-06-13
相关资源
最近更新 更多