PHP5.Два способа объявления массива как члена класса - PullRequest
21 голосов
/ 29 декабря 2010

При объявлении массива в качестве члена класса, каким образом это должно быть сделано?

class Test1 {
    private $paths = array();

    public function __construct() {
        // some code here
    }
}

или

class Test2 {
    private $paths;

    public function __construct() {
        $this->paths = array();
        // some code here
    }
}

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

Ответы [ 4 ]

10 голосов
/ 29 декабря 2010

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

6 голосов
/ 29 декабря 2010

В целом, поскольку я пишу в основном на других языках, кроме 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 является свойством экземпляра, и что я могу получить к нему доступ из других мест.

6 голосов
/ 29 декабря 2010

Если вы собираетесь динамически заполнять ваш массив во время инициализации, сделайте это в конструкторе. Если он содержит фиксированные значения, сделайте это в объявлении свойства.

Попытка динамического заполнения массива (например, с помощью возвращаемого значения определенной функции или метода) в объявлении приводит к ошибке разбора:

// Function call is not valid here
private $paths = get_paths();

Производительность здесь не является реальной проблемой, поскольку у каждого есть свой вариант использования.

1 голос
/ 29 декабря 2010

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

...