PHP 未定义常量错误毫无意义


PHP Undefined constant error makes no sense

我真的希望我在这里错过了一些简单的东西,但是我在PHP中使用类常量遇到了一个奇怪的问题。 我创建了一个名为 Utils 的简单类,并添加了两个类常量,CRYPT_SALT 和 LOGIN_PAGE。 我从其他文件中引用了那些,它们起作用了。 然后我又添加了五个类常量,它们不起作用。 我收到"致命错误:/var/www/modx/test.php 中的未定义类常量'',其中是新常量之一,也是我尝试使用它的行。

下面是 Utils 类:

<?php
// 
// Utils.php
//  
// This class is a collection of static utility functions.  Since the methods are static, they should
// all be invoked with:
//
//  Utils::methodName();
//
// This class also contains global constants, which are *not* kept in Config.  They should be accessed with:
//
//  Utils::CONSTANT;
// 
// addToCSVString -- adds an incoming string to a CSV string, possibly prepending a comma and space.  Returns
// addToJSONString -- adds an incoming key/value pair to a JSON string
// jsonify -- takes in a string and replaces control characters and quotes with properly
//
require_once( "logger.php" );
class Utils {
        // Constants 
    const CRYPT_SALT    = '$6$';
    const LOGIN_PAGE    = '/modx/';
        // Session keys
    const SKEY_DEBUG    = 'debug';
    const SKEY_LOGIN    = 'login';
    const SKEY_LANG     = 'curLang';
    const SKEY_UID      = 'userID';
    const SKEY_LOGGER   = 'logger';

        // Members
    public static $debug    = false;
        // Methods
    //
    // addToCSVString -- adds an incoming string to a CSV string, possibly prepending a comma and space.  Returns
    // the new string
    //
    public static function addToCSVString( $csvString, $newVal ) {
        if ( strlen( $csvString ) > 0 ) {
            $csvString  .= ", ";
        }
        return $csvString . $newVal;
    }

    //
    // addToJSONString -- adds an incoming key/value pair to a JSON string
    //
    public static function addToJSONString( $jsonString, $key, $val ) {
        $debug      = self::$debug;
        if ( $debug ) {
            $logger = Logger::singleton();
            $logger->log( "In Utils::addToJSONString" );
            $logger->log( "'$key = [$key]", 1 );
            $logger->log( "'$val = [$val]", 1 );
        }
        if ( strpos( $val, "{" ) === false ) {
            if ( $debug ) {
                $logger->log( "Utils: this is a plain value", 1 );
            }
                // Val is a string
            $val    = self::jsonify( $val );
            return self::addToCSVString( $jsonString, "'"" . $key . "'" : '"" . $val . "'"" );
        } else {
            if ( $debug ) {
                $logger->log( "this is a JSON object", 1 );
            }
                // Val is a JSON object
            return self::addToCSVString( $jsonString, "'"" . $key . "'" : " . $val . "" );
        }
    }

    //
    // jsonify -- takes in a string and replaces control characters and quotes with properly
    // escaped JSON values
    //
    public static function jsonify( $val ) {
        $val    = str_replace( '''', '''''', $val );        // convert backslashes first 
        $val    = str_replace( "'n", '''n', $val );
        $val    = str_replace( "'r", '''r', $val );
        $val    = str_replace( "'t", '''t', $val );
        $val    = str_replace( "'v", '''v', $val );
        $val    = str_replace( "'f", '''f', $val );
        $val    = str_replace( "'n", '''n', $val );
        $val    = str_replace( "'n", '''n', $val );
        return $val;
    }

}
?>

在我添加类常量之前,所有成员函数都已编写和测试,它们正在工作。

这是test.php,一个简单的测试页面来说明这个问题:

<h1>Test.php</h1>
<?php
    // Set up autoloader
spl_autoload_extensions( '.php,.inc' );
spl_autoload_register();
    // Test class constants
echo "<b>Testing Utils class constants</b></br>'n"; 
echo 'Utils::CRYPT_SALT = [' . Utils::CRYPT_SALT . "]<br>'n";
echo 'Utils::LOGIN_PAGE = [' . Utils::LOGIN_PAGE . "]<br>'n";
echo 'Utils::SKEY_LOGGER = [' . Utils::SKEY_LOGGER . "]<br>'n";
echo 'Utils::SKEY_DEBUG = [' . Utils::SKEY_DEBUG . "]<br>'n";
echo 'Utils::SKEY_LOGIN = [' . Utils::SKEY_LOGIN . "]<br>'n";
echo 'Utils::SKEY_LANG = [' . Utils::SKEY_LANG . "]<br>'n";
echo 'Utils::SKEY_UID = [' . Utils::SKEY_UID . "]<br>'n";
echo "</br>'n";
?>

我从测试中得到的确切错误.php是:

Fatal error: Undefined class constant 'SKEY_LOGGER' in /var/www/modx/test.php on line 15

我已经尝试了以下方法来解决此问题:

-- 重命名常量,包括使用不带下划线的小写名称

-- 更改声明的顺序。

-- 从双引号更改为单引号。

——注释掉CRYPT_SALT和LOGIN_PAGE的声明

-- 把这段代码给我的同事看,他们都一无所知

无论我尝试什么,CRYPT_SALT和LOGIN_PAGE都有效,其他常量都不起作用。 恐怕我在PHP的类系统中遇到了一些深入的错误。 或者也许我只是盯着这个太久了,以至于我错过了显而易见的东西。

是的,

答案是我像往常一样是个白痴。 :)

我在网络的主目录中有第二个utils.php的副本。 早期版本(仅定义CRYPT_SALT和LOGIN_PAGE)是自动加载器首先找到的版本。

@Paolo Bergantino和@David,你建议确保我包含我认为的文件是非常正确的。 @hakre,感谢您的get_included_files提示。

我在系统中尝试了您的代码。

如果将"require_once( "logger.php" );"删除到Utils.php中,则工作正常。

所以,我在你的lonnger.php文件中遇到了问题。

试试吧。