call_user_func用随机字符串替换类文件名

时间:2012-03-13 17:33:13

标签: php namespaces

调用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()方法。正如我所提到的,它确实适用于我的本地部署。

之前有没有人见过并且知道可能导致它的原因? 谢谢你的帮助! :)

以前有人有这个吗?

1 个答案:

答案 0 :(得分:0)

  

因为某些奇怪的原因,OffersController被加入evm9pfgpg9u0k9pk

那不是精确。实际上 classname OffersController已映射到文件名

/ ... /public_html/site/frontend/controllers/api/v1/evm9pfgpg9u0k9pk.php

文件名和类名通常是相关的,但有两个不同的东西。如果要查找为何将类名映射到该文件名,您还需要共享自动加载器的源代码。如果该类尚不存在,class_exists的调用将触发您的自动加载器。

此外,call_user_func与您收到的错误无关,因为您在其前面调用class_exists