Я знаю, что в 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: объект не более чем набор свойств.
Начиная с 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
Я предлагаю вам использовать конструктор и установить переменные, которые вы хотите при инициализации объекта.
Я перешел с C # на PHP тоже, поэтому я получил это работает в PHP:
$this->candycane = new CandyCane(['Flavor' => 'Peppermint', 'Size' => 'Large']);
Мои объекты имеют базовый класс, который проверяет, есть ли один аргумент и является ли он массивом. Если это так, это вызывает это:
public function LoadFromRow($row){
foreach ($row as $columnname=>$columnvalue)
$this->__set($columnname, $columnvalue);
}
Это также работает для загрузки объекта из строки базы данных. Отсюда и название.
Другой способ, который не является правильным, но в некоторых случаях хорошо:
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')
];