Doc #62200 [Com]: __set_state() not implemented

From: Date: Tue, 05 Jun 2012 00:11:56 +0000
Subject: Doc #62200 [Com]: __set_state() not implemented
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-8428@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=62200&edit=1 ID: 62200 Comment by: bkam at citiesunlimited dot com Reported by: bkam at citiesunlimited dot com Summary: __set_state() not implemented Status: Open Type: Documentation Problem Package: SPL related Operating System: All PHP Version: 5.4.3 Block user comment: N Private report: N New Comment: For this class, that's not an acceptable position to take. Consider that I can write: class AdaptorArrayObject extends \ArrayObject { public static function __set_state(Array $data) { $this->exchangeArray($data); } } //::then:: //some data that's structured appropriately for ArrayObject state $oldArrayObjectData = $existingArrayObject->getArrayCopy(); $newArrayObject = AdaptorArrayObject::__set_state($oldArrayObjectData); You already wrote the functions necessary to implement __set_state() Why is it on ME to subclass just to call the functions to make this work? Functions are written, call them internally and expose __set_state. Easy peasy. The other SPL data structures are indeed much more complex internally (object keys, kv meta data, and value linking), so it makes sense not to offer external functions like exchangeArray or getArrayCopy. But ArrayObject is supposed to be much closer to [] is it not? just wrapped in object reference semantics and SPL API goodies? Please reconsider for ArrayObject. Previous Comments: ------------------------------------------------------------------------ [2012-06-04 23:54:00] johannes@php.net This should be cleared in the documentation. The code returned is valid PHP code, while it won't necessarily run successful. var_export() assumes a __set_state() exists, but there are cases where it doesn't and there are cases where for different reasons it never can in a sufficient way. Especially for internal classes where we can't export the full state. ------------------------------------------------------------------------ [2012-05-31 23:50:43] bkam at citiesunlimited dot com Description: ------------ Pretty simple, var_export of SPL traversibles shows Class::__set_state([]) but actually calling that function throws an undefined method error. This is specifically true for ArrayObject, but generally true for all the traversibles with inaccessible internal structures. Test script: --------------- //first $a = new ArrayObject(); $a['key'] = 'value'; var_export($a); // returns //"ArrayObject::__set_state(array( 'key' => 'value', ))" $ao = ArrayObject::__set_state(['thing' => 'value']); //returns //"Fatal error: Call to undefined method ArrayObject::__set_state()" Expected result: ---------------- "ArrayObject::__set_state(array( 'key' => 'value', ))" "" Actual result: -------------- "Fatal error: Call to undefined method ArrayObject::__set_state()" ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=62200&edit=1

« previous php.doc.bugs (#8428) next »