Подтвердить что ты не робот

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
    }
}

Какой из них лучше с точки зрения передового опыта и производительности? Что бы вы порекомендовали?

4b9b3361

Ответ 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

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