Необходимы класс PHP, область видимости и уточнение статических переменных
Я столкнулся с интересной проблемой использования статических переменных в классах и доступа к ним. В этом примере я использую загрузку PSR-4.
Вверху моего файла у меня есть обычный
use Networks\ConfigHandlers\ServicesConfig
с последующим
class Authenticate{
...
function __construct(){
$this->fullTokenExpireTimeExtend = ServicesConfig::$timeUnits['halfday'];
$this->standardTokenExpireTimeExtend= ServicesConfig::$timeUnits['twoday'];
$this->simpleTokenExpireTimeExtend = ServicesConfig::$timeUnits['week'];
}
...
}
В dev этот код выполняется без проблем. В производстве, однако, он выдает ошибку:
Неустранимая ошибка PHP: класс 'Networks\\ConfigHandlers\\ServicesConfig' не найден в /var/www/html/public/v1/Authenticate.php в строке 151
строка 151 содержит:
$this->fullTokenExpireTimeExtend = ServicesConfig::$timeUnits['halfday'];
сверху.
ServicesConfig.php выглядит следующим образом (отредактировано до рассматриваемых частей):
<? namespace Networks\ConfigHandlers;
/**
* Configuration.
* @package xxxxx
* @author xxxxx
* @category Config
* @copyright (c) 2013-2016, xxxxx
*/
class ServicesConfig{
/**
* The time units in seconds
* @var array
*/
public static $timeUnits = array(
'second' => 1,
'quarterminute' => 15,
'halfminute' => 30,
'minute' => 60,
'fiveminutes' => 300, // 60*5 Seconds
'tenminutes' => 600, // 60*5*2 Seconds
'quarterhour' => 900, // 60*5*3 Seconds
'halfhour' => 1800, // 60*30 Seconds
'hour' => 3600, // 60*60 seconds
'halfday' => 43200, // 60*60*12 seconds
'day' => 86400, // 60*60*24 seconds
'twoday' => 172800, // 60*60*24*2 seconds
'week' => 604800, // 60*60*24*7 seconds
'month' => 2592000, // 60*60*24*30 seconds
'year' => 31536000 // 60*60*24*365 seconds
);
}
Чего я не могу понять, так это того, почему это происходит на производстве, но в dev работает без нареканий. Локально я запускаю PHP 5.5 на Mac и в производственной версии 5.5 на CentOS, так что я не верю, что это синтаксическая ошибка из-за версии, я, конечно, могу ошибаться.
Я проверил, чтобы убедиться, что файл находится в каталоге, перепроверил имена, и все это так, как должно быть. Я также проверил карту классов, чтобы убедиться, что она зарегистрирована, и это так.
Одна из теорий, которые у меня есть, заключается в том, что сначала необходимо создать экземпляр ServicesConfig в __construct(), прежде чем вызывать ServicesConfig... Но если бы это было так, разве бы это не было так в dev? Я еще не пробовал, поскольку мое понимание немного шатко в этой области, и я хотел бы получить конкретный ответ, чтобы полностью понять, что и почему.
Любые объяснения этого изменения в результате? Я в тупике.
1 ответ
@ Райан Винсент был абсолютно прав и поймал эту маленькую деталь. Я должен был знать лучше. Старые привычки сильно умирают, а Sublime делает слишком легким использование отрывков и забывает детали.
Решение: проблема не была в пространстве имен, это было определенно вызвано использованием php <?
короткий тег вместо полного <?PHP
тег.
Спасибо за дополнительный набор глаз.