Трохи складна, але проста в техніці розширення:
Припустимо, у вас є масив
$a = [
'name' => 'ankit',
'age' => '33',
'dob' => '1984-04-12'
];
Припустимо, у вас є клас Person, який може мати більш-менш атрибути з цього масиву. наприклад
class Person
{
private $name;
private $dob;
private $age;
private $company;
private $city;
}
Якщо ви все ще хочете змінити масив на об’єкт людини. Ви можете використовувати ArrayIterator Class.
$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.
Тепер у вас є об’єкт ітератора.
Створити клас, що розширює клас FilterIterator; де ви повинні визначити абстрактний метод accept. Слідкуйте за прикладом
class PersonIterator extends \FilterIterator
{
public function accept()
{
return property_exists('Person', parent::current());
}
}
Вищенаведене імпементація прив'яже властивість лише у тому випадку, якщо воно існує в класі.
Додайте ще один метод у клас PersonIterator
public function getObject(Person $object)
{
foreach ($this as $key => $value)
{
$object->{'set' . underscoreToCamelCase($key)}($value);
}
return $object;
}
Переконайтеся, що у вашому класі визначені мутатори. Тепер ви готові викликати цю функцію там, де ви хочете створити об’єкт.
$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);
$personIterator->getObject(); // this will return your Person Object.