PHP未定义的常量的使用,PHP中未定义类常量NOTICE的原因(使用未定义常量)

我在代码中发现了一个关于类常量的奇怪问题。虽然代码看起来工作正常,但我无法找出我收到PHP通知的原因:

Use of undefined constant PAYMENT_ERROR - assumed 'PAYMENT_ERROR' in /src/Micro/Payments/Manager.php on line 146

manager.php函数中的代码如下:

$code = Result::PAYMENT_ERROR;

return new Result($code, $errMsg); //

奇怪的是,$code变量设置正确,不会触发任何通知。只有实例化结果才能。

结果类非常简单:

class Result

{

// ... boilerplate code skipped ...

// constant is defined like this:

const PAYMENT_ERROR = 2;

public function __construct($code, array $messages)

{

$this->code = $code;

$this->messages = $messages;

}

// ... other functions skipped as they are not relevat ...

}

是否存在将结果常量传递给它自己的构造函数的问题?

如果必须在您写入Result::PAYMENT_ERROR的前一行触发任何通知。使用$code不可能触发此通知。这使得您可能看到了错误的文件,或者在识别正确的源代码时遇到了其他问题。

@Dezece:我和你想的一样,但是我已经这样测试过了:我在分配了$code之后添加了die(var_dump($code));,$code输出了$code的正确值(取自result::payment错误常数),没有显示出注意。所以这个错误确实是由return new Result($code, $errMsg);引起的。不过,谢谢您的反馈。这也是我添加$code的原因,因为我以前通过直接传递常量而不是通过$code来实例化结果。但这也抛出了同样的通知,所以我贴在这里。

注意,它表示使用了未定义的常量,而不是类常量…

是的,但是我不认为PHP注意到类常量和非类常量之间的区别。

有:3v4l.org/8bfnj

谢谢,你的提示让我找到了真正的原因。

我找到了这个通知的原因并把它修好了。

我在Result班上有这句话:

protected $code = PAYMENT_ERROR;

这引起了上面的注意,因为我没有正确地定义这一点。在实例化新类时,我希望PHP能够准确地告诉我错误消息来自何处,而不是仅仅指向该类所在的行。

所以解决办法是把它改成:

protected $code = self::PAYMENT_ERROR;

PHP当然应该指出这一行。很奇怪,没有。

是的,这也是我所期待的。我已经提交了bug报告bugs.php.net/bug.php?ID=67007,看它把我带到哪里。

请参见define()与const的区别

您必须使用付款错误outside the class。

如果要这样做,请使用define()。

这就行了。

好的,这似乎有帮助。但是我如何在特定的类中定义这些常量呢?

@我和你想在哪里使用这个容器?在课堂上?那么这个错误不应该出现,但是您要在类的外面使用这个,您可以继续使用define()。

不,这真的没用。我希望在result中定义这些常量,然后通过将result的常量传递给其中一个构造函数来创建新的结果。与php.net/manual/en/language.oop5.constants.php中描述的方法相同

我的代码很好用,只是通知的原因还不清楚。我开始觉得这可能与结果中的其他事情有关

我发现了问题并解决了这个问题。错误来自Result类中的另一行,该行错误地将$code的初始值指定为默认的PAYMENT_ERROR常量。你可以在我提供的答案中找到更多信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值