public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $isNested) { $class = $stub->class; $flags = $c->getFlags(); $b = array("~flag::STD_PROP_LIST" => (bool) ($flags & \ArrayObject::STD_PROP_LIST), "~flag::ARRAY_AS_PROPS" => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS), "~iteratorClass" => $c->getIteratorClass(), "~storage" => $c->getArrayCopy()); if ($class === 'ArrayObject') { $a = $b; } else { if (!($flags & \ArrayObject::STD_PROP_LIST)) { $c->setFlags(\ArrayObject::STD_PROP_LIST); if ($a = (array) $c) { $class = new \ReflectionClass($class); foreach ($a as $k => $p) { if (!isset($k[0]) || "" !== $k[0] && !$class->hasProperty($k)) { unset($a[$k]); $a["+" . $k] = $p; } } } $c->setFlags($flags); } $a += $b; } return $a; }
public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $isNested) { $prefix = Caster::PREFIX_VIRTUAL; $class = $stub->class; $flags = $c->getFlags(); $b = array($prefix . 'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST), $prefix . 'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS), $prefix . 'iteratorClass' => $c->getIteratorClass(), $prefix . 'storage' => $c->getArrayCopy()); if ($class === 'ArrayObject') { $a = $b; } else { if (!($flags & \ArrayObject::STD_PROP_LIST)) { $c->setFlags(\ArrayObject::STD_PROP_LIST); $a = Caster::castObject($c, new \ReflectionClass($class)); $c->setFlags($flags); } $a += $b; } return $a; }
<?php // Custom ArrayIterator (inherits from ArrayIterator) class MyArrayIterator extends ArrayIterator { public function makeUpper(){ } } // Array of available fruits $fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10); $fruitsArrayObject = new ArrayObject($fruits); // Get the current class name $className = $fruitsArrayObject->getIteratorClass(); var_dump($className); // Set new classname $fruitsArrayObject->setIteratorClass('MyArrayIterator'); // Get the new iterator classname $className = $fruitsArrayObject->getIteratorClass(); var_dump($className); ?>
<?php // Copyright 2004-present Facebook. All Rights Reserved. class MyIterator extends ArrayIterator { } $a = new ArrayObject(); $a->foo = "hello"; $a->setIteratorClass('MyIterator'); var_dump($a->foo); var_dump($a->getIteratorClass()); $ser = unserialize(serialize($a)); var_dump($ser->foo); var_dump($ser->getIteratorClass());
/** * @return string */ public function getIteratorClass() { return $this->data->getIteratorClass(); }
<?php $ar = array(1, 2, array(31, 32, array(331)), 4); foreach (new RecursiveIteratorIterator(new ArrayObject($ar, 0, "RecursiveArrayIterator")) as $v) { echo "{$v}\n"; } $it = new ArrayObject($ar); var_dump($it->getIteratorClass()); try { foreach (new RecursiveIteratorIterator(new ArrayObject($ar)) as $v) { echo "{$v}\n"; } } catch (InvalidArgumentException $e) { echo $e->getMessage() . "\n"; } echo "===MANUAL===\n"; $it->setIteratorClass("RecursiveArrayIterator"); var_dump($it->getIteratorClass()); foreach (new RecursiveIteratorIterator($it) as $v) { echo "{$v}\n"; } ?> ===DONE===
/** * Implementation of ArrayObject::getIteratorClass(). * * Gets the class name of the array iterator that is used by * ArrayObject::getIterator(). * * @return string */ public function getIteratorClass() { return $this->arrayObject->getIteratorClass(); }