Skip to content

Instantly share code, notes, and snippets.

@everzet
Created December 5, 2012 13:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save everzet/4215537 to your computer and use it in GitHub Desktop.
Save everzet/4215537 to your computer and use it in GitHub Desktop.
Why, php? WHY???
PHP Fatal error: Uncaught exception 'LogicException' with message 'The parent constructor was not called: the object is in an invalid state ' in splfileobject.php:16
Stack trace:
splfileobject.php(16): SplFileInfo->_bad_state_ex()
#1 {main}
thrown in splfileobject.php on line 16
Fatal error: Uncaught exception 'LogicException' with message 'The parent constructor was not called: the object is in an invalid state ' in splfileobject.php:16
Stack trace:
#0 splfileobject.php(16): SplFileInfo->_bad_state_ex()
#1 {main}
thrown in splfileobject.php on line 16
<?php
class cls1 extends \SplFileObject
{
public function __construct()
{
}
public function fpassthru()
{
// does nothing
}
}
$cl = new cls1;
$cl->fpassthru();
@hason
Copy link

hason commented Dec 5, 2012

class cls1 extends \SplFileObject
{
    public function __construct()
    {
        parent::__construct('php://memory');
    }

    public function fpassthru()
    {
        // does nothing
    }
}

@jubianchi
Copy link

@everzet : I think @mageekguy found a way to mock these class in atoum. Perhaps you could ask him for tips ;)

@everzet
Copy link
Author

everzet commented Dec 12, 2012

@jubianchi there's no clean way to mock this class. And i already know dirty one...

@nackjicholson
Copy link

$fileObject = $this->getMock('SplFileObject', [], ['php://memory']);

@bkuhl
Copy link

bkuhl commented Jun 26, 2014

Thank you for posting that solution! Just stumbled across this in Google while trying to mock the same object. You saved me a bunch of time I'm sure!

@cabloo
Copy link

cabloo commented Jun 26, 2016

@nackjicholson thanks for that one!

@sslgeorge
Copy link

You are the bomb @nackjicholson

@DanWithams7d
Copy link

For anyone who wants details about what is actually happening here;

SplFileObject will throw this error if you either;

  1. Do not call the parent::__construct() at all.
    or
  2. If you try to call other class methods (e.g. $this->callSomething()) BEFORE calling he parent::__construct(). The scope of the called method is irrelevant, so if you are calling a native SplFileObject/SplFileInfo method or a method in the scope of your superclass it will error. You can do other things before the parent::__construct() as long as they are not interacting with $this, parent:: or self:: (not sure about static methods. I assume the same goes for reading/writing properties but I haven't tested this. Ensure that anything you need to do is done pre-parent construct is done directly in the superclass construct and not abstracted to other methods if you can help it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment