Немного сложная, но легко расширяемая техника:
Предположим, у вас есть массив
$a = [
'name' => 'ankit',
'age' => '33',
'dob' => '1984-04-12'
];
Предположим, у вас есть класс Person, который может иметь больше или меньше атрибутов из этого массива. Например
class Person
{
private $name;
private $dob;
private $age;
private $company;
private $city;
}
Если вы все еще хотите изменить свой массив на объект человека. Вы можете использовать класс ArrayIterator.
$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.
Теперь у вас есть объект-итератор.
Создайте класс, расширяющий FilterIterator Class; где вам нужно определить абстрактный метод 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.
person
Ankit Vishwakarma
schedule
17.05.2017
$a = (object)['hello' => 'world'];
- person   schedule 05.11.2016