Инициализация переменных как в строготипизированных языках

Духовность™

Продвинутый новичок
Инициализация переменных как в строготипизированных языках

Навеяно темой на сообразительность (для начинающих)


1. А как уважаемая публика относится к идее инициализировать все переменные в скрипте до их использования?
PHP:
$i = $j = $k = 0;
$bool = false;
$list = array();

// код программы
2. В классах, насколько я понимаю, также, как и в функциях, не переменные-члены нужно будет инициализировать в теле функций/методов:

PHP:
public function foo()
{
    $i = $j = $k = 0;
    $bool = false;
    $list = array();
    
    // код программы
}
Я не знаю однозначного ответа, насколько это хорошая практика в рамках PHP. Есть мнение, что это бессмысленно в виду лояльности PHP и слабой типизации. Как думаете?
 

DiMA

php.spb.ru
Команда форума
1. такое использование пхп исключено. Ты еще регистр глобалс включи и создай тему - нужно ли (по мотивам соседнего топика) инициализовть переменные =)

2. false - конечно нужно. А вот некие числа, хранящиеся в базе данных / файлах / мемкеше / сессии - можно не инициализовать. Т.к. они создаются единожды в момент внесения этой переменной в объект и будут жить там вечно, до отмирания всего объекта. У тебя же совершенно другой пример - просто цикл по $i внутри метода.
 

weregod

unserializer
объявлять все переменные и ловить нотификации - хорошая практика
помогает избежать логических ошибок
 

Духовность™

Продвинутый новичок
я не правильно выразился и все меня не верно поняли.

Я имел в виду, что бы объявлять переменные в начале кода/функции, т.е. как в Паскале, например. Чисто для наглядности. Т.е. придерживаться правила, когда у тебя все используемые в коде переменные объявлены в одном месте, а не по коду.
 

nw

Новичок
triumvirat
Это скорее зависит от стиля.
Я к примеру обычно так и поступаю - максимально стараюсь объявить все переменные и желательно в одном месте. Наверное потому что программировать начинал именно с Паскаля :)
 

iceman

говнокодер
тоже "инициализирую", вначале подключаю все нужные файлы
далее идут константы, потом переменные, только те на которые, я думаю, программисту читающго мой код, следует обратить внимание... и там обычно идет инстацирование обьектов...
 

maxwell

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

Духовность™

Продвинутый новичок
почему я писал про бессмысленность объявления $i = 0;

дело в том, что $i в дальнейшем можно беспрепятственно заменить любым другим типом. поэтому и любопытно, насколько объявление переменных в блоке а-ля паскаль оправданно читабельностью
 

Фанат

oncle terrible
Команда форума
было у тебя $i=15, стало $i="Вася"
ниже по скрипту было $total/$i;
и какая цель этой замены типов?
 

Lightning

Трудоголик
triumvirat
Почитай Макконнелла уже. "Совершенный код. Второе издание", страница 239.

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

Alexandre

PHPПенсионер
стараюсь инициализировать переменные
Код:
$var='';
   if ( $comeCondition  )
        $var='Yo-To!';
 

zerkms

TDD infected
Команда форума
Alexandre
тут инициализация не прихоть, а необходимость (чтобы ниже не было нотиса).
 

DiMA

php.spb.ru
Команда форума
Определить, обязательно ли объявлять переменную или можно ли на это забить - очень легко.

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

for ( ; $i<count(Array1); $i++) {...}

задействовать 2 раза в теле метода.

for ( ; $i<count(Array1); $i++) {...}
for ( ; $i<count(Array2); $i++) {...}

Обязательно вылезет баг (2й массив будет пройдет не целиком) со всеми вытекающими...

Если же код

$_SESSION["a"]++;

скопировать случайно 2 раза по ходу программы,

$_SESSION["a"]++;
$_SESSION["a"]++;

то кроме двойного инкремента это ни к чему не приведет. Код и проект не загнется, на соседний код это никак не повлияет. А нотайс при отсутствии переменной лечится собачкой, хотя это не культурно .-)
 

AmdY

Пью пиво
Команда форума
count в цикле использовать тоже не накладно. ;)
 

weregod

unserializer
сторонникам необъявления переменных:
на n-ном инклюде используется переменная, объявленная в одном из предыдущих файлов, при чём порядок и набор подключаемых файлов может меняться (даже при отображении одной и той же страницы)
код писался со времён php3
на сколько эффективно такое использование переменных?
на сколько дорога отладка этого гуано?
мне жалко тратить своё, хоть и оплаченное, время на анализ таких ситуаций
 

A1x

Новичок
ковыряю сейчас известный магазин magento - там при использовании необъявленной переменной выбрасывается исключение. я думаю это хорошо - дисциплинирует :)
и опечатки в именах переменных сразу отлавливаются
 

DiMA

php.spb.ru
Команда форума
> на n-ном инклюде используется переменная, объявленная в одном из предыдущих файлов

а так нельзя делать, ровно как и for ( ; $i< ... ; $i++).. ваще инклюдить куски исполяемого кода - это мегазло

-~{}~ 03.07.09 10:30:

> как это реализовать?

почитай доку по исклчениями, все разжевано с готовыми примерами. Подтверждаю, это удобно :)
 

iceman

говнокодер
не понял, там нету такого +)

http://ru2.php.net/manual/ru/language.exceptions.php
 
Сверху