Есть ли в PHP специальная конструкция инициализатора объекта, как сейчас в C #? - PullRequest
19 голосов
/ 01 октября 2010

Я знаю, что в 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:объект - не более чем набор свойств.

Ответы [ 4 ]

14 голосов
/ 01 октября 2010

Начиная с 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
2 голосов
/ 18 мая 2018

Я тоже перешел с 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 голосов
/ 01 октября 2010

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

0 голосов
/ 23 октября 2018

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

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')
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...