CakePHP 在不引用调试器的文件中出现“致命错误:找不到类‘调试器’”
Posted
技术标签:
【中文标题】CakePHP 在不引用调试器的文件中出现“致命错误:找不到类‘调试器’”【英文标题】:CakePHP "Fatal error: Class 'Debugger' not found" in a File That Doesn't Reference Debugger 【发布时间】:2012-05-12 00:17:11 【问题描述】:我从一个没有引用 Debugger 类的文件中得到标题中引用的错误。如果我手动导入调试器,错误仍然出现。最后一个中错误引用的行号结束了文件中的类定义。 后面没有任何内容(也没有 ?>)。据我所知,我收到错误的文件并没有直接引用 Debugger(例如,没有明确使用 Debugger)。
这是堆栈跟踪:
( ! ) Fatal error: Class 'Debugger' not found in /home/gregg/workspace/Fueled/dapprly/backend/app/Plugin/Facebook/Controller/Component/FapiComponent.php on line 107
Call Stack
# Time Memory Function Location
1 0.0003 245664 main( ) ../index.php:0
2 0.0168 1657712 Dispatcher->dispatch( ) ../index.php:100
3 0.0237 2753568 Dispatcher->_invoke( ) ../Dispatcher.php:85
4 0.0237 2753768 Controller->constructClasses( ) ../Dispatcher.php:99
5 0.0237 2755712 ComponentCollection->init( ) ../Controller.php:638
6 0.0255 3057112 ComponentCollection->load( ) ../ComponentCollection.php:52
7 0.0255 3057600 class_exists ( ) ../ComponentCollection.php:99
8 0.0255 3057896 App::load( ) ../ComponentCollection.php:0
9 0.0257 3091416 ErrorHandler::handleError( ) ../ComponentCollection.php:551
这是第 107 行的上下文:
class FapiComponent extends Component
// -- snip -- //
public function method()
$url = urlencode('http://url');
$param = array(
'access_token' => '##' ,
'object' => 'user',
'fields' => 'feed',
'callback_url' => $url);
$id = $this->facebook->getAppId();
$subs = $this->facebook->api('/' . $id . '/subscriptions' , 'POST' , $param);
// <-- line 107 ... nothing after this
【问题讨论】:
Component类是否使用Debugger? 不,我发现了错误。我展示的这个类实现了初始化方法。但它被实现为公共函数initialize($controller)。这是一个 E_STRICT 错误。我的设置正在捕捉这些错误。此错误导致它寻找调试器。我不确定为什么它不能自动加载它,但是将方法更改为 public function initialize(Controller $controller) 解决了我遇到的问题。 【参考方案1】:我发现了错误。
我展示的这个类实现了初始化方法。但它被实现为
public function initialize($controller)
这是一个 E_STRICT 错误,因为它与父方法的不同之处在于省略了类型提示。我的设置正在捕获 E_STRICT 错误。此错误导致它寻找调试器。我不确定为什么它不能自动加载它,而是将方法更改为
public function initialize(Controller $controller)
解决了我遇到的问题。
【讨论】:
我还发现这是因为 PHP 5.4 现在在 E_ALL 集合中包含了 E_STRICT。因此,如果您不想看到这些错误,则需要专门 exclude8 E_STRICT。在 php 5.3 中,如果您想查看这些错误,您必须专门 *include E_STRICT。【参考方案2】:只要您有 E_STRICT 错误,就会发生这种情况。我主要的一个是在运行 PHP 5.4 时,你需要有 public、private 和 protected 函数声明。
【讨论】:
【参考方案3】:这是由于 PHP bug 未针对编译时错误执行自动加载(例如,E_STRICT
)。
这已在 PHP 5.4.21 中得到修复,并且 CakePHP 接受了 workaround pull request。
要手动解决此问题并从 CakePHP 的错误处理程序中排除 E_STRICT
:
-
在您喜欢的编辑器中打开
core.php
(您可以通过执行find . -name core.php
之类的操作找到该文件)。
找到以下行:'level' => E_ALL & ~E_DEPRECATED,
替换为:'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
【讨论】:
【参考方案4】:问题是低于版本 5.4.21 的 php 在 E_STRICT 错误上的自动加载器存在问题。 (E_STRICT 是编译时错误)
https://bugs.php.net/bug.php?id=65322
我在一些旧项目中遇到了完全相同的问题,它已在 2.7.4 中修复。
https://github.com/cakephp/cakephp/issues/7376
所以真正的解决方案是至少升级到 5.4.21 或者等待 CakePHP 2.7.4
【讨论】:
与 php 5.5 相同的问题。有时问题的根源在别处。 我猜同样的问题在 php 5.5 中也很活跃以上是关于CakePHP 在不引用调试器的文件中出现“致命错误:找不到类‘调试器’”的主要内容,如果未能解决你的问题,请参考以下文章
cakephp 在不使用视图的情况下保存 HABTM 关系的数据
c#2005调试程序正常,生成了引用的dll文件,但是生成程序后在其他机器上使用,总是出现缺少程序集的错误
如何在不破坏 CakePHP 中的 MVC 框架的情况下做到这一点?
CakePHP 3.0 ORM - 调试工作,翻转直播,抛出错误