2016-03-15 1 views
0

У меня возникла интересная проблема с использованием статических переменных в классах и их доступа. В этом примере я использую загрузку PSR-4.Класс PHP, область видимости и статическая переменная Требуется уточнение

В верхней части моего файла у меня есть обычный

use Networks\ConfigHandlers\ServicesConfig 

следует

class Authenticate{ 
... 

function __construct(){ 

     $this->fullTokenExpireTimeExtend = ServicesConfig::$timeUnits['halfday']; 
     $this->standardTokenExpireTimeExtend= ServicesConfig::$timeUnits['twoday']; 
     $this->simpleTokenExpireTimeExtend = ServicesConfig::$timeUnits['week']; 

    } 

... 
} 

В разработчике этот код отлично без проблем. В производстве, однако он выдает ошибку:

PHP Fatal error: Class 'Networks\\ConfigHandlers\\ServicesConfig' not found in /var/www/html/public/v1/Authenticate.php on line 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 
    ); 

} 

То, что я не могу понять, почему это будет происходить в производстве пока работает безотказно в разработчика. Локально я запускаю PHP 5.5 на Mac и в производстве 5.5 на CentOS, поэтому я не считаю его синтаксической ошибкой из-за версии, я мог ошибаться, конечно.

Я проверил, чтобы файл находился в каталоге, перекрестно проверял имена, и все так, как должно быть. Я также проверил classmap, чтобы убедиться, что он зарегистрирован, и это так.

Одна из теорий, которые у меня есть, заключается в том, что ServicesConfig должен быть создан первым в __construct() перед вызовом ServiceConfig ... Но если бы это было так, не было бы то же самое верно в dev? Я еще не пробовал это, так как Мое понимание немного шаткое в этой области и скорее получит конкретный ответ, чтобы полностью понять, что и почему.

Любые объяснения по этому изменению результатов? Я в тупике.

+1

Не используйте короткие теги. всегда используйте '

+0

проверьте файл php ini. Я подозреваю, что они инвалиды на производстве. –

ответ

1

@ Ryan Vincent был абсолютно прав и поймал эту небольшую деталь. Я должен был знать лучше. Старые привычки умирают тяжело, а Sublime упрощает использование фрагментов и забывает детали.

Решение: Проблема была не в пространстве имен он был специально вызван с помощью короткого тега PHP <? вместо полного <?PHP тега.

Спасибо за дополнительный комплект глаз.