需要PHP类,范围和静态变量澄清

时间:2016-03-15 19:49:25

标签: php psr-4

我在类中使用静态变量并访问它时遇到了一个有趣的问题。在这个例子中,我正在使用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'];

    }

...
}

在开发中这段代码执行正常而没有问题。然而,在生产中它会抛出一个错误:

  

PHP致命错误:类'Networks \\ ConfigHandlers \\ ServicesConfig'没有   在第151行的/var/www/html/public/v1/Authenticate.php中找到

第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
    );

}

我无法弄清楚为什么这将在生产中发生,但在开发中完美无缺。本地我在Mac上运行PHP 5.5,在CentOS上运行5.5,所以我不相信它因版本而出现语法错误,当然我可能是错的。

我检查过以确保文件在目录中,交叉检查名称,并且它应该是全部。我还检查了类图,以确保它已注册,确实如此。

我的一个理论是,在调用ServicesConfig之前,必须首先在__construct()中实例化ServicesConfig ......但如果是这种情况,那么dev中的情况是否会成立?还没有尝试过,因为我的理解在这方面有点不稳定,宁愿得到一个具体的答案来完全理解什么和为什么。

对结果变化的任何解释?我很难过。

1 个答案:

答案 0 :(得分:1)

@Ryan Vincent是绝对正确的,抓住了那个小细节。我应该知道的更好。旧习惯很难改变,Sublime使得使用片段太容易而忘记了细节。

解决方案:问题不在名称空间中,而是使用php <?短标记而不是完整的<?PHP标记造成的。

感谢额外的一双眼睛。