Note that there are some explanatory texts on larger screens.

plurals
  1. POPHP Undefined constant error makes no sense
    primarykey
    data
    text
    <p>I truly hope I've missed something simple here, but I'm running into a strange issue using class constants in PHP. I created a simple class called Utils and added two class constants, CRYPT_SALT and LOGIN_PAGE. I referenced those from other files, and they worked. Then I added five more class constants, and they don't work. I get "Fatal error: Undefined class constant '' in /var/www/modx/test.php on line ", where is one of the new constants, and is the line where I try to use it.</p> <p>Here is the Utils class:</p> <pre><code>&lt;?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 ) &gt; 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-&gt;log( "In Utils::addToJSONString" ); $logger-&gt;log( "\$key = [$key]", 1 ); $logger-&gt;log( "\$val = [$val]", 1 ); } if ( strpos( $val, "{" ) === false ) { if ( $debug ) { $logger-&gt;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-&gt;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; } } ?&gt; </code></pre> <p>All the member functions were written and tested before I added the class constants, they are working.</p> <p>And here is test.php, a simple test page to illustrate the problem:</p> <pre><code>&lt;h1&gt;Test.php&lt;/h1&gt; &lt;?php // Set up autoloader spl_autoload_extensions( '.php,.inc' ); spl_autoload_register(); // Test class constants echo "&lt;b&gt;Testing Utils class constants&lt;/b&gt;&lt;/br&gt;\n"; echo 'Utils::CRYPT_SALT = [' . Utils::CRYPT_SALT . "]&lt;br&gt;\n"; echo 'Utils::LOGIN_PAGE = [' . Utils::LOGIN_PAGE . "]&lt;br&gt;\n"; echo 'Utils::SKEY_LOGGER = [' . Utils::SKEY_LOGGER . "]&lt;br&gt;\n"; echo 'Utils::SKEY_DEBUG = [' . Utils::SKEY_DEBUG . "]&lt;br&gt;\n"; echo 'Utils::SKEY_LOGIN = [' . Utils::SKEY_LOGIN . "]&lt;br&gt;\n"; echo 'Utils::SKEY_LANG = [' . Utils::SKEY_LANG . "]&lt;br&gt;\n"; echo 'Utils::SKEY_UID = [' . Utils::SKEY_UID . "]&lt;br&gt;\n"; echo "&lt;/br&gt;\n"; ?&gt; </code></pre> <p>The exact error I get from test.php is:</p> <pre><code>Fatal error: Undefined class constant 'SKEY_LOGGER' in /var/www/modx/test.php on line 15 </code></pre> <p>I've tried the following to solve this:</p> <p>-- Renaming the constants, including using lower case names without underscores</p> <p>-- Changing the order of the declarations. </p> <p>-- Changing from double to single quotes.</p> <p>-- Commenting out the declarations for CRYPT_SALT and LOGIN_PAGE</p> <p>-- Showing this code to my co-workers, who are all clueless</p> <p>Regardless of anything I try, CRYPT_SALT and LOGIN_PAGE work, none of the other constants work. I'm afraid I'm up against some bug deep in PHP's class system. Or maybe I've just stared at this so long that I'm missing the obvious.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload