启动一个 PHP 类,类名是一个变量

启动一个 PHP 类,类名是一个变量

我需要一些帮助来解决我以前从未遇到过且似乎在任何地方都找不到的错误。

在 PHP mvc 框架中(仅来自教程)我有以下内容:

// Initiate the class
$className = 'Controller_' . ucfirst($controller);
if (class_exists($className)) {
 $controller = new $className($this->registry);
}

$className 显示正确的类名(大小写也正确)。但是当我运行它时,我在 apache 错误日志中看到这个(没有 php 错误)

[Wed Mar 31 10:34:12 2010] [notice] child pid 987 exit signal Segmentation fault (11)

每次调用时进程 ID 都不同。我在 os x 10.6 上运行 PHP 5.3.0。这个网站似乎可以在另一台 Mac 上的 5.2.11 上运行。不太确定下一步该去哪里调试它。我猜这可能是 apache 设置,也可能是 php 错误或代码问题……关于下一步该去哪里,有什么建议吗?

注释掉该代码后不会出现错误。我还有大约 15 个其他 php 网站在运行,没有任何问题。包括其他使用相同基础 mvc 框架的网站

答案1

我记得我遇到过完全相同的问题。如果我没记错的话,问题是递归实例化,即 PHP 内存不足,从而导致分段错误。检查 $className 的实例化是否没有循环。

答案2

尝试这个:

// Initiate the class
$className = 'Controller_' . ucfirst($controller);
if (class_exists($className)) {
     // construct the code string and evaluate it.
     $code='$controller = new ' . $className . '($this->registry);';
     eval($code);
}

答案3

我认为你的问题出在你自己 Mac 上。如果你尝试过从另一台电脑访问该网站,但没有收到错误,那么这意味着你需要重新安装 php 包。你的 php 构建过程中出现了一些问题(可能是更新,或者由于新安装导致链接被破坏……)

希望对你有帮助。

答案4

尝试使用花括号括住类名变量。参见下面的 $controller 赋值行。

$className = 'Controller_' . ucfirst($controller);
if (class_exists($className)) {
 $controller = new ${$className}($this->registry);
}

相关内容