Професионална програма
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