Разве я не должен использовать переменные переменные в методах получения и установки? - PullRequest
0 голосов
/ 24 февраля 2012

Есть ли потенциальные ловушки при использовании

$this->{$name}

вместо

$this->some_array[$name]

в моих методах получения и установки классов?Методы __get и __set, не вызывая их.

Например:

function __get($name) {
  ...
  return $this->{$name};
}

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Метод получения / установки будет вызываться, только если свойство не доступно напрямую.При динамическом задании свойств, которые не определены в самом классе, свойство будет создано с видимостью public.Это означает, что он доступен из любого места, и геттеры / сеттеры не будут вызываться при обращении к нему.

Для иллюстрации, ниже выводится «панель настроек» только один раз:

class Foo {

    public function __set($name, $val) {
        echo "setting $name\n";
        $this->$name = $val;
    }

}

$foo = new Foo;
$foo->bar = 'baz';
$foo->bar = 42;

Это, вероятно,не то, что вы хотите.Кроме того, он позволяет любому изменять любое свойство вашего объекта, что, вероятно, также не то, что вы хотите.

0 голосов
/ 24 февраля 2012

Мне кажется, я понял суть того, что вы спрашиваете.

Использование массива облегчает захват всех установленных переменных путем доступа к одной переменной, вместо того, чтобы разбирать кучу переменных класса везде, которые вы не можете легко получить. Я использую массивы так же часто, потому что я часто использую магические методы для более легкого доступа к переменным, связанным с объектом ($obj->property, а не $obj->array['property']).

Использование $this->{$name} немного избыточно, если только вы не запускаете проверки внутри методов __get и __set. Например, не делайте что-то вроде этого:

function __set($property, $value) {
    $this->{$property} = $value;
}

Это, по сути, то, что достигается уже с помощью $obj->property = 'some value'; ...

0 голосов
/ 24 февраля 2012

Вы начнете замечать разницу, если вы когда-нибудь захотите привести ваши объекты к массивам, ala (array) $ object

Ни один из способов не является «наилучшей» практикой, принимайте решение исходя из потребностей, и, если это не имеет значения, подбрасывайте монету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...