PHP常量不存在:注意

时间:2009-01-31 15:01:43

标签: php error-handling constants

我想在我的PHP应用程序中使用常量作为配置变量,只有当一个常量不存在时(无论出于何种原因)它才会引发通知但是我希望它是一个错误(或异常)就像我试图回应一个不存在的变量一样。

如果不使用单独的函数来获取常量值,这是可能的,例如:

echo $non_existing_variable; // Error
echo NON_EXISTING_CONSTANT; // Now also an error

一直在寻找但找不到任何东西。

对我来说似乎有点逻辑,当我尝试使用不存在的变量时,代码执行立即退出并抛出错误,为什么不是常量?

8 个答案:

答案 0 :(得分:11)

我建议使用defined,你可以做一些像

这样的事情
if (defined('CONSTANT')) {
    echo CONSTANT;
} else {
    throw new Exception('Undefined Constant.');
}

编辑:

我在下面的评论中所说的使用此方法的替代方法是使用自定义错误处理程序,使用set_error_handler您应该能够捕获通知并采取措施。

答案 1 :(得分:2)

你可以创建

a custom error handler
  1. 检查错误是否为通知
  2. 检查错误字符串是否包含“未定义的类常量”
  3. 如果同时如此,请抛出异常
  4. 这会让你得到你想要的。这种方法的问题是你现在负责处理所有错误。 PHP的错误处理将被完全绕过。

    另一种方法是定义一个配置类,并使用它的常量

    class Config{
        const CONFIG_ONE = 42;
    }
    //will produce a fatal error 
    if(Config::CONFIG_TWO){
       //...
    }
    

    而不是通知你会得到一个致命的错误,这似乎更正确。不幸的是,如果没有类似的hijink,你就无法捕获致命错误(参见手册set_error_handler条目中的注释)。

    最后一个选项,离我们开始的路径是创建配置单例,私有类变量为您提供值。这使您可以完全控制当有人试图访问未定义的配置值时会发生什么,但是您确实失去了常量的好处。

答案 2 :(得分:2)

您可以编写自己的错误处理程序。 更多信息:

http://php.net/manual/en/errorfunc.examples.php

http://www.w3schools.com/php/php_error.asp

答案 3 :(得分:1)

我建议您安装一个错误处理程序,将所有错误(无论级别)转换为异常。您的代码不应有任何错误,无论是警告还是通知。

请参阅:handling-errors-as-exceptions-best-methods

答案 4 :(得分:0)

使用defined function检查是否存在具有给定名称的常量。

答案 5 :(得分:0)

是的我知道定义的函数,但每次检查是否存在常量是一项工作,所以我正在寻找某种php设置或技巧而不使用额外的函数来自动抛出错误或异常当一个常数不存在时,而不是通知。

对我来说似乎有点合乎逻辑,当我尝试使用不存在的变量时,代码执行立即退出并抛出错误,为什么不是常量?

到目前为止感谢( - :

答案 6 :(得分:0)

我遇到了同样的问题,而我必须捕捉错误的唯一方法是:

try {
   echo CONSTANT;
} catch(\Exception $e) {
   // do something else
}

如果(defined('CONSTANT')){...对我不起作用!

答案 7 :(得分:0)

如果您属于同一类,则可以使用它来访问常量

const audioObj_1 = new Audio('/some_audio_file.m4a');
playSegment(audioObj_1 , 1.11, 2.45); // this will play from 1.11 sec to 2.45 sec

function playSegment(audioObj, start, stop){
    let audioObjNew = audioObj.cloneNode(true); //this is to prevent "play() request was interrupted" error. 
    audioObjNew.currentTime = start;
    audioObjNew.play();
    audioObjNew.int = setInterval(function() {
        if (audioObjNew.currentTime > stop) {
            audioObjNew.pause();
            clearInterval(audioObjNew.int);
        }
    }, 10);
} 

基本上添加self ::

如果您在另一个班级中,请使用班级名称进行访问

self::CONSTANT