Reason for Undefined class constant NOTICE in PHP (Use of undefined constant)
我在代码中发现了一个关于类常量的奇怪问题。虽然代码看起来工作正常,但我无法找出我收到PHP通知的原因:
Use of undefined constant PAYMENT_ERROR - assumed 'PAYMENT_ERROR' in /src/Micro/Payments/Manager.php on line 146
manager.php函数中的代码如下:
1 2
| $code = Result::PAYMENT_ERROR;
return new Result($code, $errMsg); // <- line 146 - causes PHP Notice |
奇怪的是,$code变量设置正确,不会触发任何通知。只有实例化结果才能。
结果类非常简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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班上有这句话:
1
| protected $code = PAYMENT_ERROR; |
这引起了上面的注意,因为我没有正确地定义这一点。在实例化新类时,我希望PHP能够准确地告诉我错误消息来自何处,而不是仅仅指向该类所在的行。
所以解决办法是把它改成:
1
| 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常量。你可以在我提供的答案中找到更多信息。