Loading...
Ivan_Stoykov avatar Ivan_Stoykov 2 Точки

PHP Complex Coditional Stetements. Задаване на променлива. Fruit Shop.

Здравейте, гледам лекциите на запис и затова не мога да задам въпроса на Боян Михайлов онлайн. В задача 07. Fruit Shop се създава променлива $price, на която се задава първоначална стойност -1.0. Разбирам идеята защо се създава и как след това се използва за отпечатване на "error". Не  разбирам защо трябва да е с отрицателна стойност, още повече последващата проверка е дали $price >= 0.  Защо не са задава първоначална стойност 0.0 или дори без стойност " "? Последващата проверка би могла да е дали $price == 0.0. Благодаря предварително!

 

0
Programming Basics
Thedi avatar Thedi 200 Точки

Здравей,

Това се прави понеже езикът не е силно типизиран заради което се получават особености. В случая няколко бързи теста водят до отговора на въпроса ти.

Пример №1 с $price = "";

<?php

$price = "";

if ($price >= 0){
    echo "Price е >= 0";
} else {
    echo "Price е нищо.";
}


Ако пуснем този код на екрана ще ни излезе, че $price e >= 0 което ще доведе до грешни резултати ако в задачата ни дадат грешни данни и ние никога не сме променяли $price. Дори и да направим intval на $price тази проверка все още ще минава грешно. Защото Intval от празен стринг или някакъв друг текст който не е число ще ни върне 0 което попада в графата >= 0;
 

Реално вторият начин който предлагаш може да бъде направен да работи, но НЕ би работил във всички видове решения.
Ако ти е любопитно мога да защо мога да ти дам пример с две решения от който един от случай те няма да работи с $price == 0.0;
 

0
Ivan_Stoykov avatar Ivan_Stoykov 2 Точки

Благодаря за отговора! Виждам, че аз самият съм допуснал грешка в изписването на въпроса. Предложениято ми е след " " e да се направи проверка дали $price > 0.0 (a не както съм написал $price == 0 ) Догаждах се, че празният стринг също има някаква стойност. Да, бих искал да знам защо 0.0 няма да работи правилно. Може би става дума за грешки при пресмятанията с реални типове?Ако е това, не се впускайте в сложни обяснения. Иначе би ми било интересно да видя двата Ви примера.

0
Thedi avatar Thedi 200 Точки

Решението би работило за задачата само в случай в който крайният резултат се смята при принтирането на отговора.
Ще го разпиша  с "apple" и цена 1.

<?php

//Хардкоднати данни место вход за целта на примера.
$fruit = "apple";
$quantity = 10;

//Тук слагаме цената на първоначална стойност
$price = " ";

if ($fruit == "apple"){
    $price = 1;
}

if ($price > 0.0) {
    echo "Total Price " . $price * $quantity . " leva";
} else {
    echo "error";
}

Това решение би работило правилно. Заради това, че ние смятаме цялата цена накрая когато е принтираме.

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

<?php

//Хардкоднати данни место вход за целта на примера.
$fruit = "apple";
$quantity = 0; //Забележи тук ни дават, че ще купим 0 продукти. Това е позволено по условие и не трябва да води до грешка.

//Тук слагаме цената на първоначална стойност
$price = " ";

if ($fruit == "apple"){
    $price = 1 * $quantity; // Сметката за цялата цена я правим още в проверката.
}

if ($price > 0.0) { //Понеже $price е равен на 0, ние няма да влезем тук.
    echo "Total Price " . $price . " leva";
} else {
    echo "error"; // Ще се принтира грешка. Въпреки, че не трябва защото всички данни който са ни дадени са били валидни.
}

Сега най-вероятно ще ти мине пак идеята да сложим проверката на $price >= 0.0 и в този пример точно ще работи, но ако се върнем на предния пост може да видим, че това няма да работи коректно във вариантите в който не ни дават правилен плод или ден от седмицата.

Реално това което ти искаш да бъде направено може да се постигне когато $price не е дефинирана изобщо, но тогава се използват други похвати който не знам дали се  изучават на този етап в курса. Ето един пример:
 

<?php

//Хардкоднати данни место вход за целта на примера.
$fruit = " ";
$quantity = 0; //Забележи тук ни дават, че ще купим 0 продукти. Това е позволено по условие и не трябва да води до грешка.


if ($fruit == "apple"){
    $price = 1 * $quantity; // Сметката за цялата цена я правим още в проверката.
}

if (isset($price)) {
    echo "Total Price " . $price . " leva";
} else {
    echo "error"; //
}

С isset може да проверим дали въобще такова нещо $price и ако не съществува изобщо директно изкарваме "error" защото никога не сме влезни в нито една проверка която дефинира $price.

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

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

0
28/01/2018 18:14:28
mihailovygmail.com avatar mihailovygmail.com 8 Точки

Здравейте,

Като цяло добрата практика подкрепя решението, в което $price не е дефинирана или има служебна стойност null, когато няма реална цена и се проверява с isset преди да се работи с променливата. isset проверява дали променливата съществува и дали тя е различна от null! Виж: http://php.net/manual/en/function.isset.php

Това предотвратява всякакви грешки свързани с нереални стойности на променливата, като празен стринг "", който се конвертира в 0 при числови изрази. По принцип, когато имаме език, в който типовете данни се конвертират автоматично един в друг, трябва да сме сигурни дали на входа имаме реални данни. По-правило добрата практика изисква да не променяме типа на данни на една променлива и затова е добре да ползваме null в такива случаи. В нашия случай за $price трябва да имаме null или някаква реална цена

В заданието на задачата за служебна стойност е избрана отрицателна цена, което е друг подход при такъв тип задачи, където имаме множество проверки след това. Но това е частен случай, в който е ясно, че цената не може да е отрицателна. Може да имаме задача, в която отрицателните стойности и нулата да са съвсем реални като възможности, като координати  на точка. Тогава подхода с null / isset би предотвратил всякаква неяснота.  

 

 

 

0
03/02/2018 09:31:09
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.