-
-
Save everzet/4215537 to your computer and use it in GitHub Desktop.
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(); |
afaik. the SplFileObject sets the required parameter $filename passed to parent::__construct as a private property that is used for all other methods provided by the class.
I'm really no theoretical OOP-Expert, but if you extend a parent Class that requires a parameter in its __construct, and this parameter is set as a protected property.
Isn't it the responsibility of the Child-Class to either initialize the Object corretctly or to call the parent __construct ?
@thephpdeveloper This wont work either.
SplFileObject requires a valid path to an existing file.
@gries i'm actually trying to mock this class, not extend.
@everzet yeah you extend it to create a mock, but you extend it.
I asked the internals-list they basically say: "this is the way the class is designed deal with it"
I am right now editing the documentation to add a INFO section that makes the user aware of this issue.
class cls1 extends \SplFileObject
{
public function __construct()
{
parent::__construct('php://memory');
}
public function fpassthru()
{
// does nothing
}
}
@everzet : I think @mageekguy found a way to mock these class in atoum. Perhaps you could ask him for tips ;)
@jubianchi there's no clean way to mock this class. And i already know dirty one...
$fileObject = $this->getMock('SplFileObject', [], ['php://memory']);
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!
@nackjicholson thanks for that one!
You are the bomb @nackjicholson
For anyone who wants details about what is actually happening here;
SplFileObject will throw this error if you either;
- Do not call the parent::__construct() at all.
or - 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.
Or simply write
in your constructor.