Empty php


I'm summarising a few points on empty() with inaccessible properties, in the hope of saving others a bit of time. Using PHP 5.3.2.
<?php
class MyClass {
    private
$foo = 'foo';
}
$myClass = new MyClass;
echo
$myClass->foo;
?>
As expected, this gives "Fatal error: Cannot access private property MyClass::$foo".
But substitute the line
if (empty($myClass->foo)) echo 'foo is empty'; else echo 'foo is not empty';
and we get the misleading result "foo is empty".


r />There is NO ERROR OR WARNING, so this is a real gotcha. Your code will just go wrong silently, and I would say it amounts to a bug.
If you add two magic functions to the class:
public function __get($var) { return $this->$var; }
public function __isset($var) { return isset($this->$var); }
then we get the expected result. You need both functions.
For empty($myClass->foo), I believe PHP calls __isset, and if that is true returns the result of empty on the result of __get. (Some earlier posts wrongly suggest PHP just returns the negation of __isset).
BUT …
See the earlier post by php at lanar dot com. I confirm those results, and if you extend the test with isset($x->a->b->c) it appears that __isset is only called for the last property in the chain. Arguably another bug. empty() behaves in the same way. So things are not as clear as we might hope.
See also the note on empty() at
http://uk3.php.net/manual/en/language.oop5.overloading.php
Clear as mud!

php.net

ISSET проверяет переменную, чтобы увидеть, была ли она установлена.


x414;ругими словами, он проверяет, есть ли переменная какое-либо значение, кроме NULL или не присвоенное значение. ISSET возвращает TRUE если переменная существует и имеет значение, отличное от NULL. Это означает, что переменные, назначенные «», 0, «0» или «ЛОЖЬ», установлены и, следовательно, TRUE

для ISSET .

EMPTY проверяет, пуста ли переменная. Пустой интерпретируется как: «" (пустая строка), 0 (целое число), 0.0 (float) `," 0 "(строка), NULL, FALSE, array () (пустой массив) и" $ var; " (объявленная переменная, но без значения в классе.

Для получения дополнительной информации см. Эту статью


ruphp.com

К сожалению, вы разводите холивары по несущественному поводу. Макросы isset и empty в PHP действительно не являются функциями, но задача этого топика — смоделировать их поведения средствами javasctript. Подумайте сами — если существует аргумент функции который может принимать то или иное значение, то проверка допустимых значений должна проводится внутри функции, особенно если при различных значениях аргумента функция может давать неверный результат — что вообще бич слаботипизированных языков. Необходимость такой внутренней проверки, вызвана в первую очередь тем фактом, что вы не в состоянии гарантировать что именно сторонний разработчик передаст в вашу функцию. И полагаться на то что проверка будет произведена до вызова функции — это не просто плохой стиль, это, пардом, говнокод. Причем мне кажется, вы сами это прекрасно понимаете, а спорите просто из желания похоливарить)

Дальше, вы говорите:

По одному только списку аргументов функции Вы никогда не узнаете, сколько на самом деле было передано аргументов функции. Если они все undefined — еще неизвестно, действительно ли были переданы undefined’ы, или просто функция была вызвана без аргументов. arguments.length позволит точно ответить на этот вопрос.


Скажите пожалуйста, уважаемый колега, а зачем мне в данном конкретном случае, знать количество аргументов переданных функции? Как я уже говорил знать количество аргументов мне важно только если функция подразумевает передачу произвольного числа аргументов. Если же количество аргументов фиксировано, то узнать передан аргумент или нет лучше именно по его имени. Это означает в частности, что если количество переданных аргументов больше количества явно объявленных, то объявленные будут иметь какое-нибудь значение, и, соответственно, наоборот.
Скажите пожалуйста почему функция которая должна вести себя аналогично empty в PHP должна вызывать ошибку если ей банально не будет передан аргумент? Она должна вернуть true, потому что ничего — оно и есть ничего, правда физики со мной не согласятся)))

Далее

Если они все undefined — еще неизвестно, действительно ли были переданы undefined’ы, или просто функция была вызвана без аргументов.

А какая именно вам разница? В любом случае вернет true. Или вам так хочется выводить внутри функции алерт с текстом «Чего впихуешь невпихуемое, отрок позорный?!!». Не вижу смысла. Зачем вообще лишняя проверка?

Далее

Почему проверка переменной должна проводиться где-то там, глубоко в других функциях — непонятно. Ведь уже на текущем этапе видно, что переменная не существует и делать с ней нечего.


Я уже писал выше почему. Скажите пожалуйста, а если не видно? Или вы не можете представить себе такую ситуацию? Empty php

javascript.ru

Как бы не ругали PHP за слабую и плохую типизированность помноженную на кучу функций на все случаи жизни, у него есть полно плюсов как простота при подходе к решению задач, обилие инструментов по умолчанию и т.д.

Один вот нюанс я заметил, что часто встречается у разработчиков на PHP это люди путают назначение функций empty и isset.

Вот вам пример, как вам кажется этот код хорош или нет?

if(isset($params['alias'])) $where[] = 'alias = "'.addslashes($params['alias']).'"';

я даже не буду ничего говорить про addslashes без проверки magic_quotes* если вы не новичок вам и так понятно, да и всё же дальше используется dibi библиотека в которой есть гибкий и очень удобный конструктор запросов и плэйсхолдер по умолчанию. Что люди не используют всех возможностей библиотек и так ясно, это просто лень почитать одностраничный ман.

Речь не об этом, речь об isset и empty.

Что мы знаем об empty? Это на самом деле простая директива или конструкция языка, которая проверяет переменную на пустоту и не выдаёт предупреждения, если даже переменная не определена, то есть она совмещает в себе функцию isset

empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set.)


Второе, что такое пустота для PHP. Именно за такие вещи многие не любят PHP или многие не любят после PHP другие языки, когда пустота в них имеет определенное значение например nil (Ruby, puts nil.class) или undefined (JS).

В PHP пустота это 0, "", array(), 0.0, FALSE, Null или просто даже без значения определенная переменная:

The following things are considered to be empty:
"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
«0» (0 as a string)
NULL
FALSE
array() (an empty array)
var $var; (a variable declared, but without a value in a class)

История с isset вообще проще, это так же конструкция языка, которая проверяет только две вещи: объявлена ли переменная ($var; например) и не является ли она NULL!
Всё!

То есть получается, что вот код.

$name = '';  if( isset($name) ) echo "Hello {$name}n";  if( !empty($name) ) echo "Good night {$name}n";

Выдаст всё же не тот что нам как бы нужен:
> Hello

Так и выше код соберётся с ненужным условием и даже скорее неправильным (!!!) условием, когда было происходит сбор параметров

   $params['alias'] = $_GET['alias'];  ...  // сбор sql запроса, для PHP переменная $params['alias'] всё же объявлена, НО ПУСТАЯ!  if(isset($params['alias'])) $where[] = 'alias = "'.addslashes($params['alias']).'"';    

ваш SQL запрос получится смешного вида alias = », хотя я уверен вам бы хотелось видеть его совсем иного вида.

Поэтому я всё же правильнее понимать отличия где и когда использовать isset и empty.

Удачи, оставайтесь на стороне разума!

ufacode.ru

О пустом и не существующем

Функция PHP empty() обратна функции isset() и имеет некоторые особенности использования. Если переменной нет, то первая функция отзывается об этом положительно и ее результат — true, а вторая — отрицательно, то есть ее значением будет false.

Empty php«>

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

В первом случае результат означает, что переменная существует, во втором случае — переменная пустая, то есть значение «0» в любом его виде, будь то строка («0») или число (дробное — 0.0 или целое — 0) все равно: empty($iVar) будет равно true.

О безопасности и контроле


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

Empty php«>

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() для объектов и массивов

Синтаксис языка имеет достаточное количество конструкций и функций для работы с объектами и массивами, однако с точки зрения проверки их на существование и на наличие значения особых отличий от переменных нет.

Empty php«>

PHP empty (array) — эквивалентно вызову empty (simple variable). Однако в отношении объектов есть весьма существенные соображения. Что касается проверки объекта на существование (isset), вопрос вряд ли имеет смысл. Что касается функции PHP empty(), то целесообразность ее использования остается под вопросом.

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

Объект и его функция empty()

На этом простом, но законном, основании следует рассматривать всякий объект в контексте его понимания «пустоты». Например, реализация объекта «Штатное расписание» состоит из записей «Сотрудник». Но если нет ни одного сотрудника, то в «Штатном расписании» всегда есть варианты должностей вероятных сотрудников.

На каком уровне применить здесь функцию PHP empty object? На уровне «Штатное расписание» все существует, даже если нет ни одного сотрудника. На уровне «Сотрудник» объект уже есть, даже если он заполнен не полностью. А не полностью заполненный объект можно отнести к пустому объекту. Пользы от него штатному расписанию никакой.

В зависимости от выбранного стиля программирования, функции PHP empty() и isset() имеют очень важное значение для построения безопасного и надежного алгоритма, однако в отношении объектов все же лучше иметь свой вариант empty(), определяемый его содержанием.

www.syl.ru


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.