我遇到了一个奇怪的问题。我在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。
解决了,不知道奇怪的类名如何出现,如果有人知道,我想知道原因:)
答案 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}}关键字缺失。添加它解决了我的问题,两种语法都按预期运行。