2012-06-28 2 views
5

Я просматривал документацию PHP и видел несколько комментариев, где переменный был инициализированы вне конструктора класса, подобных следующему:Инициализация переменные вне РНР конструктора

classMyClass { 
    private $count = 0; 

    public function __construct() { 
     //Do stuff 
    } 
} 

In PHP Objects, Patterns, и Практика, автор рекомендует использовать конструкции только для инициализации свойств, откладывая любую тяжелую или сложную логику на специализированные методы. Этот учебник (быстрый пример, который я нашел в Google) также рекомендует использовать конструкторы для инициализации свойств: http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php.

Почему вы хотите инициализировать переменную вне конструктора? Это просто небрежное кодирование, или есть причина сделать что-то подобное? Я должен сказать, что до недавнего времени я инициализировал значения по умолчанию вне конструктора, и, похоже, не существует каких-либо программных преимуществ одного из способов.

+2

Это просто хорошая практика программирования. – Brian

+0

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

+0

. Пример, который вы опубликовали, представляет значение по умолчанию для переменной count. Рекомендуется указать значение по умолчанию - таким образом вы будете знать, что тестировать, чтобы выяснить, выполнено ли назначение в вашем конструкторе или в другом месте. – blearn

ответ

5

Когда вы инициализируете переменную вне конструктора, она должна быть инициализирована как константа. Вы не можете выполнить какую-либо операцию для ее инициализации. Таким образом, начальное значение этого элемента на самом деле является частью подписи класса.

Например, это недействительно:

private $var = $othervar; 
private $var = func(); 

Вы можете сделать это в конструкторе, а также, но это будет немного более многословным и добавить беспорядок в конструктор, если не было какой-то логики продолжается.

+0

Итак, нет причин для * not * инициализации переменной вне конструктора, если им назначено известное значение, например строка? – Nate

2

Больше комментарий, чем ответ, но просьба пояснить здесь немного:

Поскольку рекомендуются использовать конструктор для инициализации только свойств,

Кто говорит, что это и почему? Я предполагаю, что только относится к чему-то другому, кроме определения свойств со значениями по умолчанию.


Ответ часть:

По умолчанию в PHP переменные не должны быть определены, поскольку переменные затем определены при первом обращении в контексте записи. Все переменные, в том числе неопределенных из них содержит NULL (Demo):

class A {} 

$a = new A; 

var_dump($a->property); # NULL 

Введение переменного класса (свойства) PHP затем позволило фактически определять переменные. Те, кто еще вернется NULL по умолчанию, но они определенных (Demo):

class A { 
    public $property; 
} 

$a = new A; 

var_dump($a->property); # NULL 

На следующем этапе эволюции, эта языковая конструкция также позволяет задать постоянное выражение. Это постоянное, поскольку определение - это время компиляции (не время выполнения, как при вызове конструктора). Пример (Demo):

class A { 
    public $property = 'hello'; 
} 

$a = new A; 

var_dump($a->property); # string(5) "hello" 

Как это compile-, но ваш конструктор время выполнения, мне трудно сравнивать как функцию с другой. Также непонятно, почему вы говорите, что инициализация с помощью конструктора рекомендуется.

+0

См. Мои обновления к моему вопросу - я добавил источник, который я имел в виду для этого утверждения. – Andrew

+0

Окей: сайт с именем «Killer PHP» и тегом «PHP Tutorials для веб-дизайнеров», возможно, не так много в деталях, как вы хотели бы узнать. Я не вижу ничего плохого в определении свойств объекта. Вы можете инициализировать позже, если хотите, но вы должны определить их. Если их начальное значение должно быть чем-то иным, чем 'NULL', но постоянным выражением, определите их с начальным значением. Это ничего плохого. В самом деле, это делает ваш конструктор менее сложным, что * хорошо. Конструкторы должны быть немыми, не должны делать много. – hakre

+0

Спасибо. Я был в основном смущен, потому что я видел хороший код, написанный прежде всего с инициализацией вне конструктора, но кажется, что большинство из того, что я прочитал, рекомендовали инициализацию внутри конструктора. Я могу видеть, как он менее загроможден (что является достаточной причиной для этого), но я не нашел никаких других практических преимуществ в PHP для установки значения по умолчанию для свойства instance вне конструктора. УБЕДИТЕСЬ, ЧТОБЫ ВЫ МОЖЕТЕ ПОЛУЧИТЬ. – Andrew

0

Далеко от неряшливости ... это хорошая практика программирования. Как и в Java/C++, он просто устанавливает их, а затем вы можете выполнять любую инициализацию в конструкторе - обычно для отправки их не по умолчанию как таковой.