Дефиниране на променливи и индекси в PHP5

bgkulinar

Меринджей
След като PHP се ориентира към ООП се налага да се дефинират променливи и индекси.

Въпросът ми е как точно става това, защото това, което намерих в интернет е как да си изключа ерър рипортинга. Е, аз не искам да го изключвам, а искам да направя нещата, както трябва да си бъдат.

Всеки линк към ресурс или подробно обяснение как става дефирнирате ще бъде оценен по достойнство 🙂. Ликове към Гугъл с define variable/index in PHP не ми вършат работа.😀
 
Re: Дефиниране на променливи и индекси в PHP5

понеже не съм добър е терминологията, може ли да дадеш 1 прост пример,
един за променлива и 1 за индекс
 
Re: Дефиниране на променливи и индекси в PHP5

PHP:
    $ingredient_id = $_GET['ingredient_id']; 
      
            if ($ingredient_id != 0) .....
Пример, когато ми реве за недефинирана променлива, реда с ИФ-а.

PHP:
$base_id = $_GET['base_id'];
Пример, когато ми казва, че имам недефиниран индекс.
 
Re: Дефиниране на променливи и индекси в PHP5

в началото на документа просто напиши:
Код:
error_reporting(E_ERROR);
това ще накара PHP да ти показва само фаталните грешки
 
Re: Дефиниране на променливи и индекси в PHP5

PHP:
    $ingredient_id = $_GET['ingredient_id']; 
      
            if ($ingredient_id != 0) .....
Пример, когато ми реве за недефинирана променлива, реда с ИФ-а.

PHP:
$base_id = $_GET['base_id'];
Пример, когато ми казва, че имам недефиниран индекс.

Сървъра ти е настроен да показва всички грешки и съобщения - нотайсите за недекларирани променливи...
Просто въпрос на добра култура на програмиране е, слага се тук таме проверка със isset дали променливата е сетната, а не директно да се мъчи да ползва несъществуваща такава и да я инициализира в движение генерирайки нотайс за това.

Като цяло съобщенията е хубаво да бъдат изключени, както колегата по-горе е споменал, но все пак е добре да не се пренебрегва и качеството на кода.
 
Re: Дефиниране на променливи и индекси в PHP5

за да провериш дали има променлива с определено име в масив в твоя случай GET трябва да пробемиш това така :

PHP:
$ingredient_id = 0;
if(isset($_GET['ingredient_id']) && is_numeric($_GET['ingredient_id'])){
 $ingredient_id = $_GET['ingredient_id'];
}
      
if ($ingredient_id != 0) .....
 
Re: Дефиниране на променливи и индекси в PHP5

Е, чак is_numeric няма нужда и един тейп кастинг върши работа, а и пести код, като го прави доста по-лесно четим. Но това като цяло е по-нататъшна обработка според типа на предаваните променливи и с тейпкастинг поне за мен е доста по-гъвкаво.


Едит: А й IF-а в края на примера проверява само стойностите без да изисква проверка на типа на сравняваните операнди така или иначе... 😉
 
Последно редактирано:
Re: Дефиниране на променливи и индекси в PHP5

По-добра практика е изключването на notice грешките. В противен случай се добавя допълнителен сорс, който намалява четимостта на кода.
 
Re: Дефиниране на променливи и индекси в PHP5

а, те са ти го обяснили вече 🙂
само да добавя че има и вариант да подтиснеш грешката
PHP:
 @$a = $_GET['a'];
което не е много добра практика, но пък е кратко 🙂
и не забравяй на тестовия сървър да изключваш подтискането 😉
 
Re: Дефиниране на променливи и индекси в PHP5

@-та е възможно най-лошата практика 😉
Като ти се случи да търсиш проблем в чужд код, който е пълен с @ ще ме разбереш.

Лощо е да, но
Защо ? какво е значението след като мога да изключа подтискането ?
 
Re: Дефиниране на променливи и индекси в PHP5

По-добра практика е изключването на notice грешките. В противен случай се добавя допълнителен сорс, който намалява четимостта на кода.
Това е индийското решение.
Според мен точно решението на bobbydigital е най-доброто:
PHP:
$ingredient_id = 0; 
if(isset($_GET['ingredient_id'])){ 
 $ingredient_id = $_GET['ingredient_id']; 
}
Това нито дабавя кой знае колко забавяне, нито разваля четимостта, особенно сравнено със проблемите които се избягват по този начин.
В крайна сметка над 90% от бъговете ми във PHP идват точно от typos-и, където съм изтървал я някоя буква в някоя променлива, я съм разменил някоя. Точно поради тази причина е и измислен този Notice.
Тей като сте подхванали темата. Знаете ли някой static analyzer или нещо подобно, което да докарам PHP кода да "реве" за грешки за евентуално недекларирани променливи? (ех що този език не е като във С/С++ директно да не се компилира при липса на декларация променлива...)

Относно първия примера на bgkulinar, ако кода ти е написан по този начин не би трябвало да дава грешка при if-а. По-вероятна причина ми се вижда да има вариант в който първия ред (инициализацията на ingredient_id, не винаги да се изпълнява)

П.П. изместване на error_reporting-a от стандартния изход към отделен файл, също е хубава практика според мен.
 
Последно редактирано:
Re: Дефиниране на променливи и индекси в PHP5

Ммм решението на mlazarov определено не е индийско, не случайно съобщенията за неинициализирани променливи по подразбиране са изключени на всички хостинги.

PHP е език който ти позволява лесно да се простреляш в крака улесняващ начинаещите правейки им мечешка услуга.

Най-добрата комбинация е моето предложение към което колегата bobbydigital добави единствено един за мен поне ненужен is_numeric който и ти си махнал като гледам в комбинация с изключването на нотайсите. ;D

ПП. На споделен хостинг да се пуснат нотайс съобщенията е като да се гръмнеш с базука в крака имайки в предвид най-малкото джагъртането на лог файловете... 😉
 
Re: Дефиниране на променливи и индекси в PHP5

Предложението на Марто Лазаров е скриване на проблема, а скриването на проблема, не води до неговото отстраняване, а просто до забавяне във времето на момента в който проблема ще ескалира.
Код:
error_reporting = E_ALL 
display_errors = Off
log_errors = On
error_log = "/var/log/php_erros"
С тези настройки във php.ini обичам файла /var/log/php_errors да седи празен и наистина седи почти празен при приблизително 2-3M daily page loads (цифрата е апроксимирана, понеже като не водя статистика за броя на ajax request-ите, а http log-a го спрях когато почна да става по няколко GB седмично). И все пак всеки появил се ред е сигнал за потенциален бъг. И почти всеки път когато има нещо във този файл, наистина откривам бъг.

is_numeric-a го махнах, понеже първо предпочитам да ползвам typecast (по-лесно и сигурно ми се струва, въпреки че гледам, че съм забравил да го напиша във примера) и второ не мисля че трябва да ограничаваме темата само до numeric променливи (същите правила важат за всички типове).
 
Re: Дефиниране на променливи и индекси в PHP5

Предложението на Марто Лазаров е скриване на проблема, а скриването на проблема, не води до неговото отстраняване, а просто до забавяне във времето на момента в който проблема ще ескалира.
Код:
error_reporting = E_ALL 
display_errors = Off
log_errors = On
error_log = "/var/log/php_erros"
С тези настройки във php.ini обичам файла /var/log/php_errors да седи празен и наистина седи почти празен при приблизително 2-3M daily page loads (цифрата е апроксимирана, понеже като не водя статистика за броя на ajax request-ите, а http log-a го спрях когато почна да става по няколко GB седмично). И все пак всеки появил се ред е сигнал за потенциален бъг. И почти всеки път когато има нещо във този файл, наистина откривам бъг.

Ще си позволя да се самоцитирам:
PHP е език който ти позволява лесно да се простреляш в крака улесняващ начинаещите правейки им мечешка услуга.

В най-лошия случай едно 90% от сайтовете са писани от индианци включително готовите скриптове и приложения, като не може всичките съобщения да бъдат отстранени по всички скриптове. Разбира се за неща които аз съм писал се грижа и съобщения да няма, но в общия случай става въпрос за некъдърно написани големи масово ползвани приложения които е самоубийство да бъдат поправяни след всеки техен ъпдейт.
Накратко казано така и трябва да е написан кода, но нотайс съобщенията е хубаво да са изключени и пускани само от време на време за конкретни приложения където е нужен дебъгинг.

За приложения писани от мен или от теб естествено е нормално да се грижим, но подобни приложения са много малък процент, масово се инсталират форуми, блог системи, галерии и готови CMS-и на които иди махай съобщенията за неинициализирани променливи, това им е най-малкия проблем.


is_numeric-a го махнах, понеже първо предпочитам да ползвам typecast (по-лесно и сигурно ми се струва, въпреки че гледам, че съм забравил да го напиша във примера) и второ не мисля че трябва да ограничаваме темата само до numeric променливи (същите правила важат за всички типове).
Аз не съм забравил и написах същото в двата си първи коментара по темата... ;D
 
Re: Дефиниране на променливи и индекси в PHP5

Ще си позволя да се самоцитирам:


В най-лошия случай едно 90% от сайтовете са писани от индианци включително готовите скриптове и приложения, като не може всичките съобщения да бъдат отстранени по всички скриптове. Разбира се за неща които аз съм писал се грижа и съобщения да няма, но в общия случай става въпрос за некъдърно написани големи масово ползвани приложения които е самоубийство да бъдат поправяни след всеки техен ъпдейт.
Накратко казано така и трябва да е написан кода, но нотайс съобщенията е хубаво да са изключени и пускани само от време на време за конкретни приложения където е нужен дебъгинг.

За приложения писани от мен или от теб естествено е нормално да се грижим, но подобни приложения са много малък процент, масово се инсталират форуми, блог системи, галерии и готови CMS-и на които иди махай съобщенията за неинициализирани променливи, това им е най-малкия проблем.
В крайна сметка целта на бг кулинара мисля, че беше точно да си оправи грешките, а не да ги крие. Относно готовите CMS-та нямам опит и не мога да ги коментирам, но доколкото си спомням сблъсаците ми със PHPBB2 (преди повече от 5 години) ми се струва, че не би трябвало да хвърля грешки за недкларирани променливи, но не бих се обзаложил за това.

Аз не съм забравил и написах същото в двата си първи коментара по темата... ;D
Не отричам, тук мислим еднакво.


П.П. И все пак някой дали няма идея за нещо което да ми търси глупавите грешки "compile time"
 
Re: Дефиниране на променливи и индекси в PHP5

В крайна сметка целта на бг кулинара мисля, че беше точно да си оправи грешките, а не да ги крие.
Точно така. Все пак ООП е измислено, за да има по-голяма сигурност на кода, а не да ни е лесно.
 
Re: Дефиниране на променливи и индекси в PHP5

@Viktor Shapilov напиши го с type cast да ти покажа как си го сбъркал.
нарочно ползвам is_numeric.

Точно така. Все пак ООП е зимислено, за да има по-голяма сигурност на кода, а не да ни е лесно.
това в случая няма нищо с ООП ами с добире програмистки практики. това ще ти гърми и на php4
 
Re: Дефиниране на променливи и индекси в PHP5

@Viktor Shapilov напиши го с type cast да ти покажа как си го сбъркал.
нарочно ползвам is_numeric.
$int_val = (int)$unknown_val;
$unknown_val ако е стринг и започва с число, ще конвертира числото, ако е нормален integer, няма да се случи нищо, ако е float ще го lower-ни към по ниското цяло число.Bool-а мисля че няма нужда от коментар, както и NULL-а
Единствено би имало проблем при string от типа "1е4 neshto si". Което няма да бъде 1 a 10000, което като цяло е вече крайно извратена ситуация, и има други методи за борба със нея, ако има потенциална възможност за проблем от тази страна.
това в случая няма нищо с ООП ами с добире програмистки практики. това ще ти гърми и на php4
Съгласен.
 

Back
Горе