Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP未定义常量错误毫无意义_Php_Class_Constants_Undefined - Fatal编程技术网

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

PHP未定义常量错误毫无意义,php,class,constants,undefined,Php,Class,Constants,Undefined,我真的希望我错过了一些简单的东西,但是我在PHP中使用类常量遇到了一个奇怪的问题。我创建了一个名为Utils的简单类,并添加了两个类常量CRYPT_SALT和LOGIN_PAGE。我引用了其他文件中的内容,它们很有效。然后我又添加了五个类常量,但它们不起作用。我在/var/www/modx/test.php的第行得到了“致命错误:未定义的类常量“”,其中是一个新常量,也是我尝试使用它的那一行 以下是Utils类: <?php // // Utils.php // // This cl

我真的希望我错过了一些简单的东西,但是我在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;
    }


}

?>
我尝试了以下方法来解决这个问题:

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

--更改声明的顺序

--从双引号改为单引号

--注释CRYPT_SALT和LOGIN_页面的声明

--向我的同事展示这段代码,他们都不知道


不管我尝试了什么,CRYPT_SALT和LOGIN_页面都可以工作,其他常量都不能工作。恐怕我遇到了PHP类系统中的一些深层错误。或者也许我只是盯着这个太久了,以至于忽略了显而易见的东西。

我在我的系统中尝试了你的代码

如果将
“require_once”(“logger.php”);“
删除到
Utils.php
,则其工作正常

所以,我在您的
lonnger.php
文件中发现了一个问题

试试看。

是的

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

我在web的主目录中有第二个utils.php副本。该早期版本(仅定义了CRYPT_SALT和LOGIN_页面)是自动加载程序首先找到的版本


@保罗·贝甘蒂诺和@David,你建议确保我包括了我认为是的文件,这是非常正确的@hakre,感谢您提供的“获取包含的文件”提示。

我将所有这些都放在一个文件中,没有遇到任何错误——它工作得非常好。在另一台服务器上尝试,看看能得到什么。我不想问的是,您的用例中唯一无法重现的部分是文件
logger.php
,但是您确定test.php文件实际上包含了您正在处理的同一个utils.php文件,而不是包含两个常量的原始副本吗?天知道我以前做过那么愚蠢的事。。。您拥有的代码应该可以工作。如果您将
echo-Utils::SKEY\u记录器就在该类定义的下方?我完全复制并粘贴了您的代码,删除了记录器include和references(因为我没有这样的类),它工作得很好,按预期输出所有常量?您使用的是什么版本的PHP,以及;确保包含正确的Utils.php文件,并修改正确的版本。我花了几个小时调试,结果发现我更改了错误的文件。我的一个想法并没有破坏它。我建议您在中包含类定义的文件中添加一个
echo
,以验证是否包含正确的文件。
<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";

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