Php якщо мінлива порожня. Шпаргалка для PHP: FALSE, NULL та значення, з ними пов'язані. FALSE в If-виразах

рядок змінної (12)

У мене є функція isNotEmpty, яка повертає true, якщо рядок не порожній і false, якщо рядок порожній. Я дізнався, що він не працює, якщо пропускаю через нього порожній рядок.

Function isNotEmpty($input) ( $strTemp = $input; $strTemp = trim($strTemp); if(strTemp != "") //Also tried this "if(strlen($strTemp) > 0)" ( return true ;) return false;

Виконується перевірка рядка за допомогою isNotEmpty:

If(isNotEmpty($userinput["phoneNumber"]))) ( //validate the phone number ) else ( echo "Phone number not entered
"; }

Якщо рядок порожній, else не виконується, я не розумію, чому може хтось пролити світло на це, будь ласка.

Answers

якщо у вас є поле, саме serial_number, і ви хочете перевірити порожнє місце

$serial_number = trim($_POST); $q="select * from product where user_id="$_SESSION""; $rs=mysql_query($q); while($row=mysql_fetch_assoc($rs))( if(empty($_POST["irons"]))( $irons=$row["product1"]; )

таким чином, ви можете перебирати всі петлі у циклі з іншою порожньою функцією

Ну замість відповіді (я вважаю, що ви вже виправили свою проблему), я дам вам пораду.

Я не знаю про всіх інших, але особисто мене дуже дратує побачивши щось на кшталт:

If(<>) ( return true; ) return false;

це вимагає елегантного « return (<>); ». Будь ласка, завжди дивіться на свій код та видаляйте цю логіку. Для кожноюситуації вам не потрібний оператор IF.

Я просто пишу власну функцію is_string для перевірки типів і strlen для перевірки довжини.

Function emptyStr($str) ( return is_string($str) && strlen($str) === 0; ) print emptyStr("") ? "empty": "not empty"; // empty

EDIT: Ви також можете використовувати функцію trim, щоб перевірити, чи не містить рядок.

Is_string($str) && strlen(trim($str)) === 0;

PHP має вбудовану функцію, звану empty() Тест виконується шляхом введення if(empty($string))(...) Посилання php.net: php empty

Ви маєте відповідь, але у вашому випадку ви можете використовувати

Return empty($input);

Return is_string($input);

Проста проблема. Змінити:

If(strTemp != "")

If($strTemp != "")

Можливо, ви також можете змінити його на:

If($strTemp !== "")

тому що!= "" поверне true, якщо ви передасте числове число 0 і кілька інших випадків через автоматичне перетворення типу PHP .

Також майте на увазі, що PHP вже має функцію empty() .

PHP оцінює порожній рядок на false, тому ви можете просто використати:

If (trim($userinput["phoneNumber"])) ( // validate the phone number ) else ( echo "Phone number not entered
"; }

Я завжди використовую регулярний вираз для перевірки порожнього рядка, що відноситься до днів CGI / Perl, а також до Javascript, тому чому б і не PHP, наприклад (хоч і неперевірений)

Return preg_match("/\S/", $input);

Де \ S представляє будь-який символ без пробілів

Просто використовуйте функцію strlen()

If (strlen($s)) ( // not empty )

Я нещодавно поставив собі те саме питання.
Існує кілька можливих рішень, тут 3 дійсні:

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0 (додано після перегляду answer Марка Байєра)
  • використовуючи цикл:

    Function startsWith(s,starter) ( for (var i = 0,cur_c; i< starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

Я не стикався з останнім рішенням, яке використовує цикл.
Дивно, але це рішення значно перевершує перші три.
Ось тест jsperf, який я виконав, щоб дійти такого висновку: http://jsperf.com/startswith2/2

ps: ecmascript 6 (гармонія) вводить власний метод startsWith для рядків.
Подумайте, скільки часу було б врятовано, якби вони подумали про включення цього необхідного методу в першу версію.

Оновити

Зверніть увагу, що є 2 оптимізації циклу, які Стів увімкнув, перший з двох показав кращу продуктивність, тому я опублікую цей код нижче:

Function startsWith2(str, prefix) ( if (str.length)< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i) continue; return i< 0; }

Сучасне програмування давно та успішно маніпулює нетиповими змінними. Тип змінної можна не вказувати заздалегідь і змінювати його під час виконання програми.

Така концепція стала основною у загальній парадигмі програмування. На самому початку епохи програмування мови з такою самою ґрунтовною впевненістю вимагали від програміста попереднього опису змінних і суворо стежили, щоб їм нічого недозволеного не присвоювалося. Про те, що змінна змінює свій тип, ні програми, ні мови програмування раніше не мали уявлення.

Про порожнє і не існуюче

Функція PHP empty() обернена функції isset() і має деякі особливості використання. Якщо змінної немає, то перша функція відгукується звідси позитивно та її результат - true, а друга - негативно, тобто її значенням буде false.

За визначенням isset() покликана перевіряти існування змінної. Не має значення, що і як було надано змінної, головне, що вона є і не знищена функцією unset(). Результат функції isset() буде позитивним - true. Важливо пам'ятати, що якщо $iVar = 0; то isset ($ iVar) буде true, але і empty ($ iVar) буде теж true.

У першому випадку результат означає, що змінна існує, у другому випадку - змінна порожня, тобто значення "0" у будь-якому його вигляді, чи то рядок ("0"), чи число (дрібне - 0.0 або ціле - 0) однаково: empty($iVar) дорівнюватиме true.

Про безпеку та контроль

Практика показує, що нетипові мови дають значно більше свободи програмісту, але припускають, що його ставлення до роботи над алгоритмом є більш відповідальним.

PHP пропонує сучасний синтаксис, що підтримує усталену семантику, має мало помилок, але вимагає до себе уважного ставлення. Наприклад, виклик будь-якої функції передбачає певну кількість параметрів.

Викликаючи функцію, зовсім не обов'язково передавати всі параметри, можна передати лише їх суттєву частину. Функція повинна перевірити наявність та існування всіх параметрів. Ті з них, які відсутні або мають неправильні значення, необхідно привести до нормального вигляду, надати їм потрібні значення.

У цьому контексті функція PHP empty() має важливе значення. Вираз:

$a = "1;2" + 20

надасть змінній $a значення 21, оскільки перша частина виразу буде представлена ​​як 1, а друга так і буде 20.

Результат буде мати число і функція PHP empty($a) матиме результат - false, тобто змінна $a не порожня.

У цьому контексті, маючи функцію:

funcTest($a ​​= 0, $b = 20)

При викликі:

$res = funcTest($aVal, $bVal)

матиме бажане, тобто результат функції. А під час виклику:

  • $res = funcTest($aVal. $bVal)

у тіло функції потрапляє лише один параметр зі значенням "$aVal. $bVal" і швидше за все цей параметр буде інтерпретований як рядок символів.

PHP empty() для об'єктів та масивів

Синтаксис мови має достатню кількість конструкцій та функцій для роботи з об'єктами та масивами, проте з точки зору перевірки їх на існування та наявність значення особливих відмінностей від змінних немає.

PHP empty (array) - еквівалентно виклику empty (simple variable). Однак щодо об'єктів є дуже суттєві міркування. Щодо перевірки об'єкта на існування (isset), питання навряд чи має сенс. Що ж до функції PHP empty(), то доцільність її використання залишається під питанням.

За логікою об'єктно-орієнтованого програмування, об'єкт має власний зміст та власний набір методів. Сказати порожній він чи не порожній може тільки сам об'єкт, але не стороння функція, яка нехай навіть входить до синтаксису мови.

Об'єкт та його функція empty()

На цій простій, але законній підставі слід розглядати будь-який об'єкт у контексті його розуміння "порожнечі". Наприклад, реалізація об'єкта "Штатний розклад" складається із записів "Співробітник". Але якщо немає жодного співробітника, то у "Штатному розкладі" завжди є варіанти посад ймовірних співробітників.

На якому рівні застосувати функцію PHP empty object? На рівні "Штатний розклад" все існує, навіть якщо немає жодного співробітника. На рівні "Співробітник" об'єкт вже є навіть якщо він заповнений не повністю. А не повністю заповнений об'єкт можна зарахувати до порожнього об'єкта. Користі від нього штатного розкладу жодної.

Залежно від вибраного стилю програмування, функції PHP empty() і isset() мають дуже важливе значення для побудови безпечного і надійного алгоритму, проте щодо об'єктів все ж таки краще мати свій варіант empty(), який визначається його змістом.

У PHP значення FALSE і NULL та пов'язані з ними значення відрізняються від того, як це зазвичай в інших мовах та мають свої неочевидні особливості.
У статті розглянуто ці особливості.
Для новачків це може бути корисно для видимості повної картини, для досвідчених читачів – оновити у пам'яті, якщо якийсь нюанс вилетів із голови.

FALSE в If-виразах

Відповідно до документації PHP наступні значення рівні FALSE після приведення в тип boolean:
  • саме булівське значення FALSE
  • порожній рядок (string) ("") та рядок "0" .
  • порожній масив (array) - array ().
  • an object with zero member variables (тільки в PHP 4, у статті не розглядається)
  • спеціальне значення NULL (включаючи невстановлені змінні)
  • SimpleXML objects (у цій статті не розглядається)
Це означає, що якщо такі значення передаються за умови:
if (…) echo "1"; else echo "0";
то буде виведено рядок "0".

Якщо значення змінної не встановлено (unset), ще й може видаватися попередження. Нагадаємо, попередження в умові можна прибрати, написавши перед змінною @.

Наприклад:

If (@$undefVar) (...)
Але використовувати @ варто тільки у крайніх випадках, коли ви добре подумали та інших відповідних варіантів немає. функцію isset() .

Функція is_null() та мовні конструкції isset() та empty()

is_null() повертає TRUE тільки для змінних, яким не надано жодного значення або яким присвоєно значення NULL .
isset() повертає один до одного протилежні булеві значення порівняно з is_null() .
Якщо змінної не присвоєно значення, то is_null() також видає попередження Undefined variable , на відміну від isset() , яка не видає жодних попередження.
Нагадаємо, щоб прибрати значення змінної, можна використовувати функцію unset() . Також з цією метою можна присвоїти значення NULL, щоб уникнути попереджень компілятора при спробі читання значення змінної.

Зауважте, що на відміну від змінних для роботи з константами необхідно використовувати конструкцію defined() .

Строкове подання

Розглянемо рядкове уявлення хибних констант.
Наприклад, при конкатенації значення перетворюються на наступні рядки, наведені в таблиці нижче:

Докладніше тема перетворення на рядки описана на офіційному сайті в параграфі Converting to string .

Оператори порівняння

Перейдемо до операторів порівняння.
Усі помилкові значення, як і очікувалося, повертають істину порівняно зі значенням FALSE за допомогою оператора "==".
Але не слід розраховувати на транзитивність при порівнянні помилкових рядкових констант між собою.
Наведемо повну таблицю порівняння хибних значення (плюсом позначені елементи таблиці, які при порівнянні за допомогою оператора "!=" повертають справжнє значення:

$undef – змінна, якій не присвоювалося значення

З таблиці можна зробити деякі приємні висновки:
1. Якщо ми знаємо, що у нас використовуються лише рядки, то ми їх можемо спокійно порівнювати і не турбуватися, що "" (порожній рядок) дорівнюватиме "0".
2. Масиви ніколи не дорівнюють рядкам, цілим і дійсним числам.

Оскільки тип різних хибних констант різний, то для того, щоб їх відрізняти, можна використовувати пару операторів === і!== .
Оператор === повертає хибне значення всім пар хибних значень.
Справжнє значення повертає лише аргументів, одному з яких присвоєно значення NULL, а другому не присвоєно жодного значення.

Відмінність змінних з NULL значенням та невизначених змінних

Оператор === дозволяє розрізняти всі помилкові значення, крім змінних з NULL-значенням від змінних, яким значення не присвоювалося.

Такі змінні можна відрізнити за допомогою функції get_defined_vars().

Якщо потрібно визначити, чи було присвоєно значення змінної $var, то для цього може бути використаний наступний фрагмент коду:
if (array_key_exists("var", get_defined_vars())) ( echo "var is defined"; // $var is assigned NULL ) else ( echo "var is NOT defined"; // $var is not defined or unset($ var) was called )

Висновки

Завжди потрібно пам'ятати, що в PHP два помилкові значення можуть бути не рівні між собою, а змінні, які, на перший погляд, різні, можуть бути однаковими при порівнянні. Щоб уникнути таких сюрпризів, можна скористатися операторами === та!==.

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

Тестування проводилося на PHP 5.3.1.

Додаткові посилання

1. PHP type comparison tables.
2. MySQl Null and Empty Strings в контексті PHP .

Теги: Додати теги

У PHP значення FALSE і NULL та пов'язані з ними значення відрізняються від того, як це зазвичай в інших мовах та мають свої неочевидні особливості.
У статті розглянуто ці особливості.
Для новачків це може бути корисно для видимості повної картини, для досвідчених читачів – оновити у пам'яті, якщо якийсь нюанс вилетів із голови.

FALSE в If-виразах

Відповідно до документації PHP наступні значення рівні FALSE після приведення в тип boolean:
  • саме булівське значення FALSE
  • порожній рядок (string) ("") та рядок "0" .
  • порожній масив (array) - array ().
  • an object with zero member variables (тільки в PHP 4, у статті не розглядається)
  • спеціальне значення NULL (включаючи невстановлені змінні)
  • SimpleXML objects (у цій статті не розглядається)
Це означає, що якщо такі значення передаються за умови:
if (…) echo "1"; else echo "0";
то буде виведено рядок "0".

Якщо значення змінної не встановлено (unset), ще й може видаватися попередження. Нагадаємо, попередження в умові можна прибрати, написавши перед змінною @.

Наприклад:

If (@$undefVar) (...)
Але використовувати @ варто тільки у крайніх випадках, коли ви добре подумали та інших відповідних варіантів немає. функцію isset() .

Функція is_null() та мовні конструкції isset() та empty()

is_null() повертає TRUE тільки для змінних, яким не надано жодного значення або яким присвоєно значення NULL .
isset() повертає один до одного протилежні булеві значення порівняно з is_null() .
Якщо змінної не присвоєно значення, то is_null() також видає попередження Undefined variable , на відміну від isset() , яка не видає жодних попередження.
Нагадаємо, щоб прибрати значення змінної, можна використовувати функцію unset() . Також з цією метою можна присвоїти значення NULL, щоб уникнути попереджень компілятора при спробі читання значення змінної.

Зауважте, що на відміну від змінних для роботи з константами необхідно використовувати конструкцію defined() .

Строкове подання

Розглянемо рядкове уявлення хибних констант.
Наприклад, при конкатенації значення перетворюються на наступні рядки, наведені в таблиці нижче:

Докладніше тема перетворення на рядки описана на офіційному сайті в параграфі Converting to string .

Оператори порівняння

Перейдемо до операторів порівняння.
Усі помилкові значення, як і очікувалося, повертають істину порівняно зі значенням FALSE за допомогою оператора "==".
Але не слід розраховувати на транзитивність при порівнянні помилкових рядкових констант між собою.
Наведемо повну таблицю порівняння хибних значення (плюсом позначені елементи таблиці, які при порівнянні за допомогою оператора "!=" повертають справжнє значення:

$undef – змінна, якій не присвоювалося значення

З таблиці можна зробити деякі приємні висновки:
1. Якщо ми знаємо, що у нас використовуються лише рядки, то ми їх можемо спокійно порівнювати і не турбуватися, що "" (порожній рядок) дорівнюватиме "0".
2. Масиви ніколи не дорівнюють рядкам, цілим і дійсним числам.

Оскільки тип різних хибних констант різний, то для того, щоб їх відрізняти, можна використовувати пару операторів === і!== .
Оператор === повертає хибне значення всім пар хибних значень.
Справжнє значення повертає лише аргументів, одному з яких присвоєно значення NULL, а другому не присвоєно жодного значення.

Відмінність змінних з NULL значенням та невизначених змінних

Оператор === дозволяє розрізняти всі помилкові значення, крім змінних з NULL-значенням від змінних, яким значення не присвоювалося.

Такі змінні можна відрізнити за допомогою функції get_defined_vars().

Якщо потрібно визначити, чи було присвоєно значення змінної $var, то для цього може бути використаний наступний фрагмент коду:
if (array_key_exists("var", get_defined_vars())) ( echo "var is defined"; // $var is assigned NULL ) else ( echo "var is NOT defined"; // $var is not defined or unset($ var) was called )

Висновки

Завжди потрібно пам'ятати, що в PHP два помилкові значення можуть бути не рівні між собою, а змінні, які, на перший погляд, різні, можуть бути однаковими при порівнянні. Щоб уникнути таких сюрпризів, можна скористатися операторами === та!==.

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

Якщо при роботі з рядками у вас виникла необхідність перевірити чи порожній рядок, прогера-початківці використовують як правило функцію strlen(). Ця функція досить швидка, тому що не робить жодних обчислень, а просто повертає вже відоме значення довжини рядка, доступне в zval (PHP для зберігання змінних використовується структура C). Проте, т.к. strlen()- це функція, вона трохи повільна, тому що вимагає виклику кількох дій, таких як переведення в нижній регістр і пошук у таблиці хеша. У деяких випадках ви можете збільшити швидкість виконання коду за допомогою використання empty()..., але й empty()ще можна трохи оптимізувати.

Візьмемо прикладнаприклад перевірка шляху картинок, Функція перевіряє якщо шлях порожній то замінюємо на інший шлях наприклад "images/noimage.jpg".

І так вся задача зводиться в перевірці чи порожня зміна типу рядок. Спробуємо 4 способи:

  • if(strlen($img_path)>0)
  • if($img_path(0))
  • if(empty($img_path))
  • та ще один спосіб наостанок.

І так напишемо першим способом:

Function check_image_path($img_path ) ( if (strlen ($img_path ) >0 ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

проведемо тестування, середній час тесту зайняло 1.43795800209 сек.

Ще трохи подумавши... Можна звертатися одразу до першого символу рядка, а не до всього рядка. Якщо перший символ означає рядок не порожній. Перший символ у рядку нумується з "0".

Function check_image_path($img_path ) ( if ($img_path ( 0 ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

середній час тесту зайняло 1.19431300163 сек., 17% часу відіграли

Спробуємо написати через empty() тепер:

Function check_image_path($img_path ) ( if (empty ($img_path ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

середній час тесту зайняло 1.1341319084 сек., 5% часу відіграли від попереднього прикладу

Тепер подивимося на передостанній та останній приклад над нами. Подивимося, як це можна об'єднати. подумайте... як оптимізувати ще можна?

Function check_image_path($img_path ) ( if (empty ($img_path ( 0 ) ) ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

середній час тесту зайняло 1.07465314865 сек., і знову 5% часу виграли...

Як це працює і чому швидше. А от $img_path(0)повертає перший символ... і потім функція empty()перевіряє порожній рядок... різниця від попереднього прикладу в тому, що функції передається лише один символ, а не весь рядок. Таким чином, від першого прикладу до останнього ми виграли 25% часу.