Определение класса PHP: Отдельные средства доступа/мутаторы или __ набор () с переключателем ()?

Просто бросок, использующий анонимный метод:

int[] result = Array.ConvertAll<TestEnum, int>(
    enumArray, delegate(TestEnum value) {return (int) value;});

или с C# 3.0, лямбдой:

int[] result = Array.ConvertAll(enumArray, value => (int) value);
8
задан Wiseguy 18 June 2013 в 15:50
поделиться

2 ответа

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

  • Что бы вы ни использовали для документирования вашего API (doxygen / PHPdoc / Zend), сгенерированные документы не будут отображать члены, доступные через магические функции.
  • Вы можете задокументировать аксессуары. Вы действительно должны иметь возможность поместить в документации такую ​​строку: « ВАЖНО! Эта функция подключается к базе данных, она будет очень медленной, используйте otherFunction (), если можете»
  • Реализация аксессуара видна каждому. Я бы не хотел вдаваться в подробности 200-строчной волшебной функции, чтобы проверить, делает ли аксессор что-нибудь, кроме установки / получения значения (вот почему мы ' в конце концов переписываете аксессоры.)
  • Вы уже упоминали об автозаполнении IDE.
  • Функция __get () имеет четко определенный заголовок функции, поэтому вы не сможете создавать геттеры, возвращающие ссылку, для пример (что действительно здорово при работе с массивами, т.е. $ numbers = & $ object-> getNumbers (); $ numbers [] = 4; - без ссылки вам нужно будет снова вызвать сеттер .)
7
ответ дан 5 December 2019 в 15:25
поделиться

Самая большая разница, которую я вижу, это с phpdoc:

  • с использованием __ set , вы не сможете сгенерировать phpdoc для каждого аксессора
  • phpdoc, используемого современными людьми IDE, это также означает, что вы не получите подсказки типа или завершения кода, если используете magic-методы (хотя использование @property может помочь в этом вопросе) .

Лично я бы сам определил аксессоры, даже если это потребует написания немного большего количества кода:

  • нет проблем с phpdoc
  • вы можете использовать любые параметры и типы возвращаемых значений, которые хотите
  • вы явно указываете, какие методы могут be used
  • проще использовать конкретный код для каждого свойства, без очень длинного метода __ set .

Кроме того, я бы использовал эти методы доступа при установке свойств изнутри класса:это означает немного больше кода, да, но это также означает прохождение определенного кода (например, кода для проверки некоторых вещей), который они содержат.

Наконец, если вы просто используете некоторые свойства для хранения данных, а не необходимо определить какое-либо конкретное поведение, почему бы не сделать их общедоступными и разрешить пользователям доступ к ним напрямую?

4
ответ дан 5 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: