PHP5. Два способа объявления массива как члена класса
При объявлении массива как члена класса, каким образом это должно быть сделано?
class Test1 {
private $paths = array();
public function __construct() {
// some code here
}
}
или
class Test2 {
private $paths;
public function __construct() {
$this->paths = array();
// some code here
}
}
Какой из них лучше с точки зрения передового опыта и производительности? Что бы вы порекомендовали?
Ответы
Ответ 1
Я предлагаю сделать это при объявлении переменной класса. Конструктор может быть переопределен в расширении классов, что может привести к появлению E_NOTICE или даже E_WARNING, если какая-либо из ваших функций зависит от этой переменной, являющейся массивом (даже пустым)
Ответ 2
Если вы собираетесь динамически заполнять свой массив во время инициализации, сделайте это в конструкторе. Если он содержит фиксированные значения, сделайте это в объявлении свойства.
Попытка заполнить массив динамически (например, с использованием возвращаемого значения определенной функции или метода) в объявлении приводит к ошибке синтаксического анализа:
// Function call is not valid here
private $paths = get_paths();
Производительность здесь не является реальной проблемой, поскольку каждый из них имеет свой собственный вариант использования.
Ответ 3
В общем, поскольку я пишу в основном на других языках помимо PHP, мне нравится объявлять переменные экземпляра вне конструктора. Это позволяет мне взглянуть на верхнюю часть класса и получить представление обо всех свойствах и их модификаторах доступа без необходимости читать код.
Например, мне действительно не нравятся такие методы
// ...
// whole bunch of code
// ...
public function initialize() {
$this->foo = array();
// some other code to add some stuff to foo
}
Теперь, если я просто посмотрю на класс, я не могу быть уверенным, что существует переменная foo, даже доступная. Если есть, я не знаю, есть ли у меня доступ к нему из любого места вне экземпляра.
Если вместо этого у меня есть:
public $foo = array();
в верхней части моего класса, я знаю, что foo является свойством экземпляра и что я могу получить к нему доступ из другого места.
Ответ 4
Нет никаких последствий для производительности. Остановите одержимость над вещами, которые не имеют значения - сосредоточьтесь на проблемах производительности, которые есть: сначала измерьте, оптимизируйте только верхних нарушителей.