调用call_user_func时遇到一个奇怪的问题。我传递的类的名称,以某种方式将其名称替换为随机字符串。有趣的是,它在我的本地部署中运行良好,然后当我移动它时它会中断(本地和现场都运行PHP5.3)
call_user_func()尝试从另一个控制器类调用一个函数,并在用一个随机字符串替换该类的名称时返回错误。
已更新
电话看起来像这样:
class ApiController extends Controller
{
public function actionView()
{
$this->resource_class = 'site\frontend\controllers\api\v1'.'\\'.ucfirst($_GET['resource']).'Controller';
if(class_exists($this->resource_class))
call_user_func(array($this->resource_class, 'view'), $_GET);
}
}
在此阶段,$ this-> resource_class为:
site\frontend\controllers\api\v1\OffersController
目标类(site / frontend / controllers / api / v1 / OffersController.php)如下所示:
namespace site\frontend\controllers\api\v1;
class OffersController extends \ApiController
{
public function view($params)
{
// code...
}
}
我得到的错误就是这个:
include(/home/username/public_html/site/frontend/controllers/api/v1/evm9pfgpg9u0k9pk.php): failed to open stream: No such file or directory
因此,出于某些奇怪的原因, OffersController 正在加入 evm9pfgpg9u0k9pk
OffersController类存在于site \ frontend \ controllers \ api \ v1命名空间内,并且有一个公共view()方法。正如我所提到的,它确实适用于我的本地部署。
之前有没有人见过并且知道可能导致它的原因? 谢谢你的帮助! :)
以前有人有这个吗?
答案 0 :(得分:0)
因为某些奇怪的原因,
OffersController
被加入evm9pfgpg9u0k9pk
那不是精确。实际上 classname OffersController
已映射到文件名:
/ ... /public_html/site/frontend/controllers/api/v1/evm9pfgpg9u0k9pk.php
文件名和类名通常是相关的,但有两个不同的东西。如果要查找为何将类名映射到该文件名,您还需要共享自动加载器的源代码。如果该类尚不存在,class_exists
的调用将触发您的自动加载器。
此外,call_user_func
与您收到的错误无关,因为您在其前面调用class_exists
。