is_callable通过__autoload加载'pcu2phmmr6pam3'

时间:2012-12-29 14:01:15

标签: php autoload

我遇到了一个奇怪的问题。我在xampp服务器上开发我的网站localhost,然后将其上传到我的主机服务器。我终于完成了我网站的基本组件,以便它可以加载主页。一切都按计划进行。

所以我决定将它上传到主机服务器,然后我设置MySQL凭据,现在它应该工作。恩......不,它没有。空页。

所以我戴上手套,开始用随机表达式挖掘代码 echo 'test';所以我可以跟踪发生了什么。它似乎运行得很好,直到执行is_callable()

is_callable()应运行__autoload($class),因此我尝试了var_dump($class)

它给了我这个结果:

string(11) "Initializer" 
string(8) "Database" 
string(14) "PageController" 
string(14) "BaseController" 
string(14) "pcu2phmmr6pam3" 
string(14) "pcu2phmmr6pam3" 

现在,除了最后两个,这里列出的每个班级都应该在那里。我有 NO 这个名字的来源,因为它不是我在任何地方设置的字符串。

Google向我展示pcu2phmmr6pam3的唯一结果是另一个网站遇到类似问题。

现在真的奇怪的事情发生了,我的自动加载功能看起来像这样:

function __autoload($class) {
    var_dump($class);
    if (file_exists(ROOT_PATH . DS . 'site' . DS . 'class' . DS . $class . '.class.php')) {
        require_once(ROOT_PATH . DS . 'site' . DS . 'class' . DS . $class . '.class.php');
    } else if (file_exists(ROOT_PATH . DS . 'site' . DS . 'controller' . DS . $class . '.class.php')) {
        require_once(ROOT_PATH . DS . 'site' . DS . 'controller' . DS . $class . '.class.php');
    } else if (file_exists(ROOT_PATH . DS . 'site' . DS . 'model' . DS . $class . '.class.php')) {
        require_once(ROOT_PATH . DS . 'site' . DS . 'model' . DS . $class . '.class.php');
    } else{
        throw new Exception('Class `' . $class . '` could not be loaded!');
    }
}

它应加载的每个类都被加载。如果我想创建一个不存在的类,那么它会引发异常。

但是pcu2phmmr6pam3'类'并非如此。没有抛出异常,现在屏幕上已经打印出错误,即使我已设置error_reporting(E_ALL)

以下是is_callable()的周围代码:

    $controllerName = ucfirst($this->structure) . 'Controller';
    $action = strtolower(((!empty($this->uri[1]))?$this->uri[1]:'index'));

    if (is_callable(array($controllerName, $action))) {
        $controller = new $controllerName($this->uri, $this->database, $this->structure, $action, $page);
        $controller->$action();
    } else if (is_callable(array($controllerName, 'index'))) {
        $controller = new $controllerName($this->uri, $this->database, $this->structure, 'index', $page);
        $controller->index();
    } else {
        $controller = new NotfoundController($this->uri, $this->database, 'Notfound', 'index', $page);
        $controller->index();
    }

我可以给你的最后一点信息:

我的localhost xampp服务器运行PHP 5.4.7,我的主机服务器运行PHP 5.3.20。


解决了,不知道奇怪的类名如何出现,如果有人知道,我想知道原因:)

1 个答案:

答案 0 :(得分:1)

我在调用静态方法时遇到了类似的问题。 (与spl_autoload_register()相同)

function __autoload ($className) {
  echo $className."\n";
}

class ClassName {
  function functionName () {
  }
}

//calls __autoload twice with class name 'a22h1pd_t'
is_callable( array('ClassName', 'functionName') );

//doesn't call __autoload
is_callable('ClassName::functionName');

看看这个最小的例子很明显。 static的{​​{1}}关键字缺失。添加它解决了我的问题,两种语法都按预期运行。