gregghz
gregghz

Reputation: 3965

CakePHP "Fatal error: Class 'Debugger' not found" in a File That Doesn't Reference Debugger

I'm getting the error referenced in the title from a file that doesn't reference the Debugger class. If I manually import Debugger, the error still shows up. The line number referenced in the error in the last } ending the class definition in the file. Nothing follows the } (there's not ?> either). The file that I'm getting the error in doesn't directly reference Debugger so far as I can tell (as in, there is no explicit use of Debugger).

here's the stack trace:

( ! ) 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

and here's the context around line 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

Upvotes: 7

Views: 9429

Answers (4)

gounane
gounane

Reputation: 381

This is due to a a PHP bug that did not perform auto loading for compile time errors (e.g., E_STRICT).

This was fixed in PHP 5.4.21 and a workaround pull request was accepted by CakePHP.

To manually workaround this issue and exempt E_STRICT from CakePHP's error handler:

  1. Open core.php in your preferred editor (you could find the file by performing something like find . -name core.php).
  2. Find the following line: 'level' => E_ALL & ~E_DEPRECATED,
  3. Replace it with: 'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,

Upvotes: 13

Sander Visser
Sander Visser

Reputation: 4330

The problem is that php lower than version 5.4.21 has an issue with the autoloader on E_STRICT errors. (E_STRICT is a compile time error)

https://bugs.php.net/bug.php?id=65322

I encountered the exact same issue on some old projects, and It's fixed in 2.7.4.

https://github.com/cakephp/cakephp/issues/7376

So the real solution is to upgrade to at least 5.4.21 or wait for CakePHP 2.7.4

Upvotes: 0

Steve Tauber
Steve Tauber

Reputation: 10179

This occurs any time you have an E_STRICT error. The main one I had was when running PHP 5.4, you are required to have public, private, and protected function declarations.

Upvotes: 0

gregghz
gregghz

Reputation: 3965

I found the error.

This class that I've shown has the initialize method implemented. But it's implemented as

public function initialize($controller)

This is an E_STRICT error since it differs from the parent method by leaving out the type hint. My setup is catching E_STRICT errors. This error is causing it to look for Debugger. I'm not sure why it's not able to autoload it, but changing the method to

public function initialize(Controller $controller)

fixed the issue I was having.

Upvotes: 8

Related Questions