【问题标题】:Undefined constant error in php 7.2php 7.2 中的未定义常量错误
【发布时间】:2021-07-07 15:15:37
【问题描述】:

我在 php v7.2 中有这些错误,但在使用 php v7.1 时看不到任何 E_WARNING

如何解决以下错误?

/web13/web/boutique/includes/Sites/Shop/NavigationHistory.php 在第 39 行 [12-Jan-2018 22:44:20 America/Toronto] PHP 警告:在 /var/www/clients/client1 中使用未定义的常量 MODULE_HEADER_SELECT_TEMPLATE_STATUS - 假定为“MODULE_HEADER_SELECT_TEMPLATE_STATUS”(这将在 PHP 的未来版本中引发错误) /web13/web/boutique/includes/Sites/Shop/Template.php 在第 356 行

【问题讨论】:

    标签: php


    【解决方案1】:

    这是一个常见的警告,当 PHP 检测到使用未定义的constant 时会出现此警告。

    这是一个在 PHP 中定义常量的例子:

    define('PI', 3.14);
    

    以下是可能导致问题的一些情况的列表:

    • 忘记在变量名的开头使用 $ 符号。

      $name = "Aniket";
      echo name; // forgot to add $ before name
      

      上面的代码会抛出:注意:使用未定义的常量名——假定为“name”。因为变量“name”前面没有美元符号,PHP 假定我试图引用一个名为“name”的常量变量。

    • 忘记在字符串周围加上引号。

      echo $_POST[email];
      

      在上面的示例中,我未能在 $_POST 变量 “email” 周围加上引号。此代码将抛出:注意:使用未定义的常量名称 - 假定为“电子邮件”

      要解决这个问题,我显然必须执行以下操作:

      echo $_POST["email"];
      

    根据Deprecated features in PHP 7.2.x,您不应该使用未定义的常量,因为:

    不存在的全局常量的不带引号的字符串被视为自身的字符串。

    此行为曾经发出 E_NOTICE但现在将发出 E_WARNING。在 PHP 的下一个主要版本中,将会抛出一个 Error 异常。

    只有在使用之前声明常量值,才能防止E_WARNING

    在上述问题中,MODULE_HEADER_SELECT_TEMPLATE_STATUS 没有定义。

    【讨论】:

    • 谢谢,终于找到问题了!
    • 如果您试图有意访问全局常量怎么办?例如WSDL_CACHE_NONE.
    • @jdenoc 如果定义了全局常量,那么 PHP 没有问题。未定义时会出现问题。
    【解决方案2】:

    此外,对于那些不熟悉 wordpress 插件开发并且似乎无法弄清楚在使用之前定义“常量”意味着什么的人...

    下面是一个会引发错误的示例:

    add_action('wp_enqueue_scripts', myprefix_load_styles);
    

    在钩子中直接声明一个函数是产生这样的错误的一种方法。 而是:

    add_action('wp_enqueue_scripts', 'myprefix_load_styles');
    

    注意,函数名现在在引号内。 如果那是您的情况,那应该可行。

    【讨论】:

      【解决方案3】:

      我刚刚创建了一个 PHP 作业,用于递归清理 PHP 项目中的所有文件,并自动引用所有字符串,这些字符串是数组语法中方括号内使用的未定义常量。

      观察:此修复仅针对数组使用,例如 $a[key1],它将自动转换为 $a['key1']。清理过程不会解析和计算项目中定义的常量列表,以便在所有可能的上下文中将它们列入白名单以供在不带引号的情况下使用。

      建议先在 DEV 上为您的项目运行它,检查功能,然后推送到 LIVE。

      快速使用:

      git clone https://github.com/eyroot/lx-utils lx-utils
      cd lx-utils && composer install --no-dev
      php run/cleanUpSquareBrackets.php /path/you/want/to/clean/up
      

      完整的使用说明和源码在页面上:
      https://github.com/eyroot/lx-utils

      【讨论】:

      • 不要使用这个脚本,它甚至可能会替换用作键的实际常量。
      • 这是一个很好的解决 X 问题的 Y 解决方案。
      【解决方案4】:

      Short hand Search replace Regex for Notepad++

      for array(test=>'bla')
      Search: ([ (\t])([aA-zZ]+)([\t ]*=>)
      Replace: \1'\2'\3
      for [test] 
      Search \[([aA-Zz]+)\]
      Replace:['\1']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-16
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        相关资源
        最近更新 更多