Ооп — Есть ли специальная конструкция инициализатора объекта в PHP, как сейчас в C #?

Я знаю, что в C # в настоящее время вы можете сделать:

var a = new MyObject
{
Property1 = 1,
Property2 = 2
};

Есть ли что-то подобное и в PHP? Или я должен просто сделать это через конструктор или через несколько операторов;

$a = new MyObject(1, 2);

$a = new MyObject();
$a->property1 = 1;
$a->property2 = 2;

Если это возможно, но все думают, что это ужасная идея, я также хотел бы знать.

PS: объект не более чем набор свойств.

19

Решение

Начиная с PHP7, у нас есть Анонимные классы что позволит вам расширить класс во время выполнения, включая установку дополнительных свойств:

$a = new class() extends MyObject {
public $property1 = 1;
public $property2 = 2;
};

echo $a->property1; // prints 1

До PHP7, нет такой вещи Если идея состоит в том, чтобы создать экземпляр объекта с произвольными свойствами, вы можете сделать

public function __construct(array $properties)
{
foreach ($properties as $property => $value)
{
$this->$property = $value
}
}

$foo = new Foo(array('prop1' => 1, 'prop2' => 2));

Добавляйте варианты по своему усмотрению. Например, добавьте чеки в property_exists разрешить установку только определенных членов. Я нахожу бросающие случайные свойства в объектах недостатком дизайна.

Если вам не нужен конкретный экземпляр класса, но вы просто хотите случайный объектный пакет, вы также можете сделать

$a = (object) [
'property1' => 1,
'property2' => 2
];

который затем даст вам экземпляр StdClass и к которому вы можете получить доступ как

echo $a->property1; // prints 1
14

Другие решения

Я предлагаю вам использовать конструктор и установить переменные, которые вы хотите при инициализации объекта.

2

Я перешел с C # на PHP тоже, поэтому я получил это работает в PHP:

$this->candycane = new CandyCane(['Flavor' => 'Peppermint', 'Size' => 'Large']);

Мои объекты имеют базовый класс, который проверяет, есть ли один аргумент и является ли он массивом. Если это так, это вызывает это:

public function LoadFromRow($row){
foreach ($row as $columnname=>$columnvalue)
$this->__set($columnname, $columnvalue);
}

Это также работает для загрузки объекта из строки базы данных. Отсюда и название.

2

Другой способ, который не является правильным, но в некоторых случаях хорошо:

class Dog
{
private $name;
private $age;

public function setAge($age) {
$this->age = $age;
return $this;
}

public function getAge() {
return $this->age;
}

public function setName($name) {
$this->name = $name;
return $this;
}

public function getName() {
return $this->name;
}
}

$dogs = [
1 => (new Dog())->setAge(2)->setName('Max'),
2 => (new Dog())->setAge(7)->setName('Woofer')
];
0
По вопросам рекламы [email protected]