[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Есть ли необходимость в определении переменной?
ksawl
Подскажите, есть строка типа:
PHP
if ($x==0){$x=7;}

перед этим $x не задавалось, на денвере выдает ошибку
Цитата
Notice: Undefined variable: x in C:\WEBServer\www\cal\kalendar.php on line 96

Автор скрипта утверждает:
Цитата
Ответ:  всегда говорю, что Денвер - это вещь специально искаженная под себя любимого. Постоянно показывает кучу ошибок, хотя на самом деле в НОРМАЛЬНОЙ версии Php и Apache - это не является ошибками. очень много как вы правильно сказали ошибок с определением переменных, типа, если ты ее указал, значит она уже должна быть определена в скрипте ранее. Чушь денверовская, ничего не должно быть определено, если нет переменной, значит нет, либо ее значение 0 либо NULL. И все нормальные версии ЭТО понимают и трактуют одинаково...

Возникает вопрос, насколько утверждения автора скрипта соответствуют действительности? и действительно ли денверовские версии Php и Apache так сильно отличаются от НОРМАЛЬНЫХ? и действительно ли допустимо писать такой код?
Заранее спасибо!



Спустя 32 минуты, 38 секунд (30.07.2009 - 01:31) FatCat написал(а):
Цитата (ksawl @ 30.07.2009 - 01:58)
Автор скрипта утверждает

Неряшливое программирование до добра не доводит.

За что люблю денвер: уж если отладил и под ним выполняется без ошибок - почти 100-процентная гарантия, что будет безошибочно работать на любых серверах.
Один лишь раз видел, когда под денвером работает, а на реальном мастехостовом сервере ошибка. Кто бы мог подумать, что пхп в сборке от мастерхоста не понимает [:alnum:] ...

Спустя 35 минут, 26 секунд (30.07.2009 - 02:06) Nikitian написал(а):
Нотис - не ошибка, а автор скрипта мчудак. Переменные надо определять, т.к. он сам не знает использовалась она ранее или нет, а если не использовалась, то чего её сравнивать с чем-то?
Быдлокодинг в самом обычном его проявлении. Сразу видно, что человек ни на чём, кроме пыха не писал, и с таким подходом и никогда не будет.

Спустя 56 минут, 49 секунд (30.07.2009 - 03:03) twin написал(а):
Обращение к несуществующей переменной - нарушение правил и синтаксиса. Соответственно сбой программы. Она конечно выкрутится, потому что там реализована защита от дурака, но это лишнее телодвижение, потребление и вообще очень плохо.
Если что то делать, то делать надо хорошо. Плохо оно и само получится.
Есть правило - определять переменные, значит надо определять. А то так можно перестать чистить зубы, умываться по утрам, менять носки и трусы.
Ведь впринципе от этого тоже не умирают люди. До поры до времени...

Спустя 4 часа, 58 минут, 43 секунды (30.07.2009 - 08:02) sergeiss написал(а):
Собственно говоря, сообщения об ошибках и предупреждения можно подавить (знак @) smile.gif Либо, можно просто проверять в нужных местах существование переменной (функция isset), и создавать ее в случае отсутствия.

Спустя 1 час, 24 минуты, 16 секунд (30.07.2009 - 09:26) kirik написал(а):
Цитата (sergeiss @ 30.07.2009 - 00:02)
Собственно говоря, сообщения об ошибках и предупреждения можно подавить (знак @) smile.gif Либо, можно просто проверять в нужных местах существование переменной (функция isset), и создавать ее в случае отсутствия.

Скажу больше: глушить ошибки "собаками" категорически противопоказанно (кроме конечно совсем клинических случаев). Всегда нужно проверять наличие переменной посредством isset (как написал sergiss) или с помощью empty.
В приведенном примере как раз вполне подойдет второй вариант:
PHP
if (empty($x)){$x=7;}

ksawl
Бывают только ненормальные авторы скриптов smile.gif

Спустя 1 час, 5 минут, 3 секунды (30.07.2009 - 10:31) sergeiss написал(а):
Цитата (kirik @ 30.07.2009 - 10:26)
Скажу больше: глушить ошибки "собаками" категорически противопоказанно (кроме конечно совсем клинических случаев)

Ну это смотря где и для каких целей делается smile.gif Например, при работе с БД лучше заглушить "автоматические" ошибки, чтобы можно было самостоятельно (в этом же скрипте) обработать возникшие некорректности. Случай вовсе не клинический, а очень даже нормальный. Потому что иначе юзер может получить информацию о структуре БД, которую ему знать вовсе не обязательно.
Либо, например, в результате "несанкционированного" вывода данных в ненужном месте программер может наступить на грабли с названием "Cannot modify header...".

Спустя 1 минута, 26 секунд (30.07.2009 - 10:32) Nikitian написал(а):
Собака - это зло, которое только для совместимости оставили в новых версиях пыха. Сейчас же появился такой замечательный инструмент, как исключения! Сомневаетесь в коде - делайте ексепшн и обрабатывайте его соответственно, а не просто подавляйте ошибку.
Где-то слышал:
Цитата
Во всех языках программирования ошибки обрабатывают и только в пхп их подавляют

Спустя 13 минут, 47 секунд (30.07.2009 - 10:46) Sylex написал(а):
Nikitian
+5

Спустя 20 минут, 2 секунды (30.07.2009 - 11:06) sergeiss написал(а):
Это обсуждение опять "скатывается" в яму обсуждения стиля программирования smile.gif Потому что я, например, использую "собаку" только в случаях, где мне проще с этим значком отловить потенциальную ошибку, чем с try работать. Просто проще и нагляднее получается.
А кто-то будет "лепить" сей знак везде, где надо и где не надо.

Поэтому утверждение типа
Цитата (Nikitian @ 30.07.2009 - 11:32)
Собака - это зло

я считаю слишком категорическим и принципиально неверным smile.gif, т.к. оно верно только для части случаев, но не для всех.

Спустя 1 час, 9 минут, 31 секунда (30.07.2009 - 12:16) FatCat написал(а):
Использую "собаку" в тех случаях, где работа кода зависит от внешних факторов. Например:
PHP
@mail$this->to$this->subject$this->message$this->mail_headers );
Ибо не желаю знать о всех эпизодах обострения даунизма на SMTP, если я не сисадминю этот сервер, а пользуюсь услугами хостинга.

Спустя 6 часов, 59 минут, 42 секунды (30.07.2009 - 19:15) kirik написал(а):
Цитата (sergeiss @ 30.07.2009 - 03:06)
Потому что я, например, использую "собаку" только в случаях, где мне проще с этим значком отловить потенциальную ошибку, чем с try работать.

С try зато будет потом возможность отследить в каких местах программы возникают ошибки/ворнинги/нотисы и поправить их. Программа которая работает без ошибок работает быстрее чем программа с ними (даже если они заглушены собачками). Это наверное довольно весомый аргумент чтобы по возможности не использовать собак в своих скриптах smile.gif

Спустя 35 минут, 49 секунд (30.07.2009 - 19:51) S{oRpiO написал(а):
проще всего былобы сделать элементарно просто не полениться и дописать пару символов и написать

PHP
if (isset($x) and $x==0){$x=7;}else{ echo "Извените но переменной не существует"; }

Спустя 12 минут, 55 секунд (30.07.2009 - 20:04) kirik написал(а):
Цитата (S{oRpiO @ 30.07.2009 - 11:51)
if (isset($x) and $x==0){$x=7;}else{ echo "Извените но переменной не существует"; }

Зачем isset?? empty в этом случае нужно юзать..

Спустя 16 минут, 7 секунд (30.07.2009 - 20:20) twin написал(а):
Цитата
Например, при работе с БД лучше заглушить "автоматические" ошибки, чтобы можно было самостоятельно (в этом же скрипте) обработать возникшие некорректности. Случай вовсе не клинический, а очень даже нормальный. Потому что иначе юзер может получить информацию о структуре БД, которую ему знать вовсе не обязательно.

Немного не понял... Приведи плиз пример, когда возникшая некорректность запроса может быть исправлена скриптом... Ведь результаты по моему могут быть совсем непредсказуемы. Имхо в таких случаях лучше останавливать скрипт с кучей извинений.
А юзер кстати не должен получать никакой информации, для этого есть логи и php_value error_log

Спустя 1 минута, 36 секунд (30.07.2009 - 20:22) twin написал(а):
Цитата
Использую "собаку" в тех случаях, где работа кода зависит от внешних факторов. Например:PHP
@mail( $this->to, $this->subject, $this->message, $this->mail_headers );

Разве это внешний фактор? внешний просто вернет false, если я не ошибаюсь....

Спустя 34 минуты, 23 секунды (30.07.2009 - 20:56) kirik написал(а):
Цитата (twin @ 30.07.2009 - 12:20)
Приведи плиз пример, когда возникшая некорректность запроса может быть исправлена скриптом...

Я наверное знаю про что sergiss..
Например регистрация юзеров:
SQL
INSERT INTO `users` (`id`, `username`, `password`) VALUES (NULL, 'user', MD5('pass'))

где `id` - первичный ключ, `username` - уникальный, тогда если такой юзер уже существует mysql выдаст ошибку о неуникальности вставляемого ключа, откуда можно сделать вывод о том, что пользователь с таким именем существует.

PHP
if(@mysql_query("INSERT INTO `users` (`id`, `username`, `password`) VALUES (NULL, 'user', MD5('pass'))"))
   echo 
'Вы успешно зарегистрированы';
else
   echo 
'Пользователь с таким именем уже есть';

как-то так..

Спустя 26 минут, 9 секунд (30.07.2009 - 21:22) sergeiss написал(а):
Цитата (twin @ 30.07.2009 - 21:20)
Немного не понял... Приведи плиз пример, когда возникшая некорректность запроса может быть исправлена скриптом... Ведь результаты по моему могут быть совсем непредсказуемы. Имхо в таких случаях лучше останавливать скрипт с кучей извинений.
А юзер кстати не должен получать никакой информации, для этого есть логи и php_value error_log

Ну, извинения - это уже информация для юзера smile.gif Я про нее и говорил.

К тому же, скрипт может быть, например, с загрузкой данных. И его пользователь - я. И мне нужно иметь информацию о том, как идет процесс. Но я не хочу видеть сообщения от ПХП, я хочу сам их формировать! И при этом, опять же, после выдачи сообщения я не хочу прерывать скрипт, т.к. он грузит много-много разных данных. И тут всякие "or die()" вообще "не канают ни разу" smile.gif
Тут речь идет больше не о некорректности запроса, а от некорректности исходных данных. И это не в чистом виде исправление некорректности, а просто грамотное прохождение ошибки.

Спустя 5 минут, 18 секунд (30.07.2009 - 21:28) jetistyum написал(а):
Цитата (kirik @ 30.07.2009 - 20:56)
PHP
if(@mysql_query("INSERT INTO `users` (`id`, `username`, `password`) VALUES (NULL, 'user', MD5('pass'))"))
   echo 'Вы успешно зарегистрированы';
else
   echo 'Пользователь с таким именем уже есть';


ну это тоже, извините, быдлокодинг, ИМХО нужно сначала сделать запрос на проверку существования юзера.

я использовал @ только в случаях проблемы с @mkdir , ну а на счет мускуля - наверное это mysql_connect/
из справочника :
Цитата

Подавить вывод ошибок можно добавив @ в начало названия функции (@mysql_connect())

а вообще подавление ошибок это стиль joomla - ну так она мне запомнилась smile.gif
когда-то всречал комментарий автора какого-то модуля или компонента:
для того чтобы скрипт работал без ошибок - установите error_reporting(E_ERROR) - тобишь без варнингов. очень удачное решение)))


Спустя 6 минут, 50 секунд (30.07.2009 - 21:34) kirik написал(а):
Цитата (jetistyum @ 30.07.2009 - 13:28)
ну это тоже, извините, быдлокодинг

В самом безопасном его проявлении smile.gif

Спустя 29 минут, 34 секунды (30.07.2009 - 22:04) twin написал(а):
Да чего вы спорите... Подавление ошибок - инструмент отладочный. Не более того. Точно так же как и or die Если в программе есть чего давить, значит это неправильная программа. С ошибками. А ошибки не давить надо а исправлять.
Цитата
я использовал @ только в случаях проблемы с @mkdir

Тоже не пойму... Ну если не создалась директория, как скрипту дальше себя вести? Он то откуда знает, сработала или нет функция? А уж ты тем более, если не логируешь ошибки. А если это заведомое условие, то уж луче проверить почву. file_exists(), is_dir() и так далее, в зависимости от логики..

Спустя 4 часа, 18 минут, 24 секунды (31.07.2009 - 02:22) Alchemist написал(а):
я использовал собаку дважды: в одном скрипте перед session_start() и в другом перед unlink().

В первом случае это был динамически подключаемый модуль, и, теоретически, конечно, собаку можно было заменить на if(!session_id()), но ИМХО разница невелика.

Во-втором случае, файл так и так удаляли... Если его уже не было - ну и фиг с ним !

Спустя 39 минут, 30 секунд (31.07.2009 - 03:02) jetistyum написал(а):
Цитата

Тоже не пойму... Ну если не создалась директория, как скрипту дальше себя вести? Он то откуда знает, сработала или нет функция? А уж ты тем более, если не логируешь ошибки. А если это заведомое условие, то уж луче проверить почву. file_exists(), is_dir() и так далее, в зависимости от логики..


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

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

Спустя 3 часа, 30 минут, 26 секунд (31.07.2009 - 06:32) Sylex написал(а):
да все просто, собачка подавляет ошибки - используйте где хотите, если хотите подавить ошибку, и знаете, что она может быть smile.gif

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

Спустя 43 минуты, 46 секунд (31.07.2009 - 07:16) Alchemist написал(а):
Цитата (Sylex @ 31.07.2009 - 05:32)
да все просто, собачка подавляет ошибки - используйте где хотите, если хотите подавить ошибку, и знаете, что она может быть smile.gif


Уррааааа !!! Даешь собаку - друга человека !!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.