php проверить наличие переменной

property_exists

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

property_exists — Проверяет, содержит ли объект или класс указанный атрибут

Описание

Функция проверяет, существует ли атрибут property в указанном классе.

Список параметров

Имя класса или объект класса для проверки

Возвращаемые значения

Примеры

Пример #1 Пример использования property_exists()

Примечания

Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс ещё не известен.

Смотрите также

User Contributed Notes 10 notes

The function behaves differently depending on whether the property has been present in the class declaration, or has been added dynamically, if the variable has been unset()

$testObject = new TestClass ;

If you want to test if declared *public* property was unset, you can use the following code:

As of PHP 5.3.0, calling property_exists from a parent class sees private properties in sub-classes.

declared properties cannot be unset
any set property does exist, even being set to null, regardless how it was set

[before-constructed] dump:
[my_public]: bool(true)
[my_protected]: bool(true)
[my_private]: bool(true)
[my_constructed_int]: bool(false)
[my_constructed_null]: bool(false)
[my_assigned_int]: bool(false)
[my_assigned_null]: bool(false)

[after-constructed] dump:
[my_public]: bool(true)
[my_protected]: bool(true)
[my_private]: bool(true)
[my_constructed_int]: bool(true)
[my_constructed_null]: bool(true)
[my_assigned_int]: bool(false)
[my_assigned_null]: bool(false)

[before-assigned] dump:
[my_public]: bool(true)
[my_protected]: bool(true)
[my_private]: bool(true)
[my_constructed_int]: bool(true)
[my_constructed_null]: bool(true)
[my_assigned_int]: bool(false)
[my_assigned_null]: bool(false)

[after-assigned] dump:
[my_public]: bool(true)
[my_protected]: bool(true)
[my_private]: bool(true)
[my_constructed_int]: bool(true)
[my_constructed_null]: bool(true)
[my_assigned_int]: bool(true)
[my_assigned_null]: bool(true)

[after-unset] dump:
[my_public]: bool(true)
[my_protected]: bool(true)
[my_private]: bool(true)
[my_constructed_int]: bool(false)
[my_constructed_null]: bool(false)
[my_assigned_int]: bool(false)
[my_assigned_null]: bool(false)

Источник

Лучший способ проверить существование переменной в PHP; isset () явно сломан

Учитывая, что лучший способ проверить наличие переменной? Я попробовал что-то вроде:

Как мы должны надежно проверять наличие переменной в PHP?

Изменить: в PHP существует разница между переменными, которые не установлены, и переменными, которые установлены в NULL :

Дальнейшее редактирование: две вещи.

Если переменная, которую вы проверяете, будет в глобальной области действия, которую вы могли бы сделать:

Попытка дать обзор различных обсуждений и ответов:

Реальные варианты использования (с решениями)

1. Клавиши массива

2. Свойства объекта

Необоснованные варианты использования, с обсуждением

3. register_globals и другое загрязнение глобального пространства имен

Во-первых, сами register_globals вряд ли неожиданно создают null переменную, так как значения GET, POST и cookie всегда будут строками (с » все еще возвращающим true из isset ), а переменные в сеансе должны полностью находиться под контролем программиста.

Во-вторых, загрязнение переменной значением null является проблемой только в том случае, если эта чрезмерная запись предшествует инициализации. «Переписывание» неинициализированной переменной с null было бы проблематичным, если бы код где-то еще различал два состояния, поэтому сама по себе эта возможность является аргументом против такого различия.

4. get_defined_vars и compact

После того как вы решили обработать набор переменных в виде массива с использованием одного из этих механизмов, вы можете делать с ним все те же операции, что и на любом нормальном массиве. Следовательно, см. 1.

5. isset гораздо проще вводить, чем array_key_exists

Я не уверен, что это действительно актуально, но да, имена функций PHP могут быть довольно длинными и непоследовательными иногда. По-видимому, доисторические версии PHP использовали длину имени функции как хэш-ключ, поэтому Rasmus намеренно составлял имена функций, такие как htmlspecialchars поэтому у них было бы необычное количество символов …

Тем не менее, по крайней мере, мы не пишем Java, а? 😉

6. Неинициализированные переменные имеют тип

На странице руководства по основам переменных содержится следующее утверждение:

Неинициализированные переменные имеют значение по умолчанию для своего типа в зависимости от контекста, в котором они используются

Я не уверен, есть ли в Zend Engine понятие «неинициализированный, но известный тип», или это слишком много читает в заявлении.

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

99. Обнаружение, если функция запущена

(Сохраняя это последнее, поскольку он намного длиннее других. Возможно, я отредактирую его позже …)

Рассмотрим следующий код:

Однако есть и другие проблемы с этим подходом, которые становятся ясными, если вы добавляете внешний цикл:

Мысленный эксперимент: константа very_null

Мысленный эксперимент два: счетчик присваивания

Но если так, зачем останавливаться на логическом? Что делать, если вы хотите узнать, сколько раз прошло испытание? вы можете просто расширить свои метаданные до целого числа и получить get_assignment_count и reset_assignment_count …

Надежно-очевидный вопрос заключается в том, почему механизм выполнения PHP должен заранее предполагать, что вы хотите отслеживать такие вещи, а не оставлять вас делать это явно, используя обычный код.

Иногда я немного теряюсь, пытаясь выяснить, какую операцию сравнения использовать в данной ситуации. isset() применяется только к неинициализированным или явно нулевым значениям. Передача / присвоение нулевого значения – отличный способ гарантировать, что логическое сравнение работает так, как ожидалось.

Тем не менее, об этом немного сложно подумать. Вот простая матрица, сравнивающая, как различные значения будут оцениваться различными операциями:

Чтобы соответствовать таблице, я немного сжал эти метки:

Все результаты являются логическими, true печатается и false опущена.

Вы можете сами запускать тесты, проверьте этот принцип:
https://gist.github.com/mfdj/8165967

Вы можете использовать компактную конструкцию языка для проверки существования нулевой переменной. Переменные, которые не существуют, не будут отображаться в результате, пока будут отображаться нулевые значения.

В случае вашего примера:

Конечно, для переменных в глобальной области действия вы также можете использовать array_key_exists ().

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

Объяснение NULL, логическое мышление

Я предполагаю, что очевидный ответ на все это … Не инициализируйте свои переменные как NULL, и сделайте их как нечто, имеющее отношение к тому, к чему они предназначены.

Обработать NULL правильно

NULL следует рассматривать как «несуществующее значение», что является значением NULL. Переменная не может быть классифицирована как существующая для PHP, потому что ей не было рассказано, какой тип сущности она пытается быть. Возможно, этого не существует, поэтому PHP просто говорит «Хорошо, это не потому, что в этом нет никакого смысла, и NULL – мой способ сказать это».

Аргумент

Давайте теперь спорим. «Но NULL – это как сказать 0 или FALSE или».

Неверно, 0-FALSE- » все еще классифицируются как пустые значения, но они ARE указаны как некоторый тип значения или предопределенный ответ на вопрос. FALSE является ответом на «да» или «нет», « это ответ на титул, который был представлен, а 0 – ответ на количество или время и т. Д. Они заданы как некоторый тип ответа / результата, который делает их действительными как заданные.

NULL просто не отвечает, что так всегда, он не говорит нам «да» или «нет», и это не говорит нам о времени, и это не говорит нам, что пустая строка была отправлена. Это основная логика в понимании NULL.

Резюме

Речь идет не о создании сумасшедших функций, чтобы обойти проблему, это просто изменение того, как ваш мозг смотрит на NULL. Если это NULL, предположите, что оно не установлено ничем. Если вы предварительно определяете переменные, тогда предопределите их как 0, FALSE или «» в зависимости от типа использования, которое вы намереваетесь для них.

Не стесняйтесь процитировать это. Это не в моей логической голове 🙂

Свойства объекта можно проверить для существования по свойствам_exists

Пример из единичного теста:

В пределах своей области переменная присваивает некоторый смысл метке, которую вы, программист, выбрали. Вне его сферы действия эта метка бессмысленна (независимо от того, используете ли вы один и тот же ярлык в другой области, в основном не имеет значения).

Вот одно из возможных решений:

Другим обходным get_defined_vars() вывода get_defined_vars() :

Я не согласен с вашими рассуждениями о NULL и говорю, что вам нужно изменить свое мышление о NULL, это просто странно.

Я думаю, что isset () не был спроектирован правильно, isset () должен сказать вам, была ли установлена ​​переменная, и это не должно касаться фактического значения переменной.

Что делать, если вы проверяете значения, возвращаемые из базы данных, а один из столбцов имеет значение NULL, вы все равно хотите знать, существует ли он, даже если значение NULL … nope не доверяет isset () здесь.

isset () должен был быть разработан таким образом:

таким образом мы оставляем его программисту для проверки типов и не оставляем его до isset (), чтобы предположить, что его нет, потому что значение NULL – его просто глупый дизайн

I’m going to add a quick two cents to this. One reason this issue is confusing is because this scenario seems to return the same result with error reporting not on full:

Crank error reporting up:

PHP obviously does have an internal ability to distinguish between a null variable and an undefined variable. It seems to me that there should be a built in function to check for this.

If I run the following:

Я получаю сообщение об ошибке:

If I run the following:

I do not get the error.

If I have a variable that should be set, I usually do something like the following.

The full isset documentation reads a little more than just what was initially pasted. Yes, it returns false for a variable that was previously set but is now null, but it also returns false if a variable has not yet been set (ever) and for any variable that has been marked as unset. It also notes that the NULL byte («\0») is not considered null and will return true.

Determine whether a variable is set.

If a variable has been unset with unset(), it will no longer be set. isset() will return FALSE if testing a variable that has been set to NULL. Also note that a NULL byte («\0») is not equivalent to the PHP NULL constant.

It seems the only time a variable is not set is when it is specifically unset($v). It sounds like your meaning of ‘existence’ is different than PHP’s definition. NULL is certainly existing, it is NULL.

I have to say in all my years of PHP programming, I have never encountered a problem with isset() returning false on a null variable. OTOH, I have encountered problems with isset() failing on a null array entry – but array_key_exists() works correctly in that case.

For some comparison, Icon explicitly defines an unused variable as returning &null so you use the is-null test in Icon to also check for an unset variable. This does make things easier. On the other hand, Visual BASIC has multiple states for a variable that doesn’t have a value (Null, Empty, Nothing, …), and you often have to check for more than one of them. This is known to be a source of bugs.

According to the PHP Manual for the empty() function, «Determine whether a variable is considered to be empty. A variable is considered empty IF IT DOES NOT EXIST or if its value equals FALSE. empty() does not generate a warning if the variable does not exist.» (My emphasis.) That means the empty() function should qualify as the «best way to test a variable’s existence in PHP», per the title Question.

However, this is not good enough, because the empty() function can be fooled by a variable that does exist and is set to NULL.

I’m interrupting my earlier answer to present something better, because it is less cumbersome than my original answer (which follows this interruption, for comparing).

Two simple lines of code can use the above function to reveal if a variable is undefined:

You can follow those two lines with anything appropriate, such as this example:

I wanted to put the call to ob_start() and the ($testvar===null) inside the function, and simply pass the variable to the function, but it doesn’t work. Even if you try to use «pass by reference» of the variable to the function, the variable BECOMES defined, and then the function can never detect that it previously had been undefined. What is presented here is a compromise between what I wanted to do, and what actually works.

The preceding implies that there is another way to always avoid running into the «Undefined variable» error message. (The assumption here is, preventing such a message is why you want to test to see if a variable is undefined.)

The newly-instantiated variable’s value is set to null, of course!

So, after some studying and experimenting, here is something guaranteed to work:

I think the only full solution is to report notices with

But you will have to fix all the notices generated by undefined variables, constants, array keys, class properties amongst others. Once you have done that you won’t have to worry about the difference between null and not declared variables, and the ambiguity dissappears.

Enabling notice reporting might not be a good alternative in all situations, but there are good reasons to enable it:

Why should I fix E_NOTICE errors?

In my case was more than a year working in a proyect without it, but was used to be careful about declaring variables, so it was fast to transition.

I prefer using not empty as the best method to check for the existence of a variable that a) exists, and b) is not null.

Источник

isset

(PHP 4, PHP 5, PHP 7, PHP 8)

isset — Определяет, была ли установлена переменная значением, отличным от null

Описание

Определяет, была ли установлена переменная значением отличным от null

Если были переданы несколько параметров, то isset() вернёт true только в том случае, если все параметры определены. Проверка происходит слева направо и заканчивается, как только будет встречена неопределённая переменная.

Список параметров

Возвращаемые значения

Примеры

Пример #1 Пример использования isset()

// В следующем примере мы используем var_dump для вывода
// значения, возвращаемого isset().

$a = «test» ;
$b = «anothertest» ;

Функция также работает с элементами массивов:

Пример #2 isset() и строковые индексы

Результат выполнения данного примера:

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций.

При использовании isset() на недоступных свойствах объекта, будет вызываться перегруженный метод __isset(), если он существует.

Смотрите также

User Contributed Notes 30 notes

I, too, was dismayed to find that isset($foo) returns false if ($foo == null). Here’s an (awkward) way around it.

Of course, that is very non-intuitive, long, hard-to-understand, and kludgy. Better to design your code so you don’t depend on the difference between an unset variable and a variable with the value null. But «better» only because PHP has made this weird development choice.

In my thinking this was a mistake in the development of PHP. The name («isset») should describe the function and not have the desciption be «is set AND is not null». If it was done properly a programmer could very easily do (isset($var) || is_null($var)) if they wanted to check for this!

The new (as of PHP7) ‘null coalesce operator’ allows shorthand isset. You can use it like so:

You can safely use isset to check properties and subproperties of objects directly. So instead of writing

isset($abc) && isset($abc->def) && isset($abc->def->ghi)

or in a shorter form

you can just write

without raising any errors, warnings or notices.

How to test for a variable actually existing, including being set to null. This will prevent errors when passing to functions.

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

!empty() mimics the chk() function posted before.

in PHP5, if you have

I tried the example posted previously by Slawek:

$foo = ‘a little string’;
echo isset($foo)?’yes ‘:’no ‘, isset($foo[‘aaaa’])?’yes ‘:’no ‘;

He got yes yes, but he didn’t say what version of PHP he was using.

I tried this on PHP 5.0.5 and got: yes no

But on PHP 4.3.5 I got: yes yes

Any foreach or similar will be different before and after the call.

To organize some of the frequently used functions..

Return Values :
Returns TRUE if var exists and has value other than NULL, FALSE otherwise.

isset expects the variable sign first, so you can’t add parentheses or anything.

With this simple function you can check if an array has some keys:

If you regard isset() as indicating whether the given variable has a value or not, and recall that NULL is intended to indicate that a value is _absent_ (as said, somewhat awkwardly, on its manual page), then its behaviour is not at all inconsistent or confusing.

Here is an example with multiple parameters supplied

= array();
$var [ ‘val1’ ] = ‘test’ ;
$var [ ‘val2’ ] = ‘on’ ;

The following code does the same calling «isset» 2 times:

= array();
$var [ ‘val1’ ] = ‘test’ ;
$var [ ‘val2’ ] = ‘on’ ;

Note that isset() is not recursive as of the 5.4.8 I have available here to test with: if you use it on a multidimensional array or an object it will not check isset() on each dimension as it goes.

Imagine you have a class with a normal __isset and a __get that fatals for non-existant properties. isset($object->nosuch) will behave normally but isset($object->nosuch->foo) will crash. Rather harsh IMO but still possible.

// pretend that the methods have implementations that actually try to do work
// in this example I only care about the worst case conditions

// if property does not exist <
echo «Property does not exist!» ;
exit;
// >
>

$obj = new FatalOnGet ();

Uncomment the echos in the methods and you’ll see exactly what happened:

On a similar note, if __get always returns but instead issues warnings or notices then those will surface.

The following is an example of how to test if a variable is set, whether or not it is NULL. It makes use of the fact that an unset variable will throw an E_NOTICE error, but one initialized as NULL will not.

The problem is, the set_error_handler and restore_error_handler calls can not be inside the function, which means you need 2 extra lines of code every time you are testing. And if you have any E_NOTICE errors caused by other code between the set_error_handler and restore_error_handler they will not be dealt with properly. One solution:

?>

Outputs:
True False
Notice: Undefined variable: j in filename.php on line 26

This will make the handler only handle var_exists, but it adds a lot of overhead. Everytime an E_NOTICE error happens, the file it originated from will be loaded into an array.

Источник

Переменные в PHP

Что такое переменная

Например, если у нас есть HTML страница, на которой необходимо время от времени менять определённое значение, мы можем для удобства вынести это значение в переменную:

При запуске этого кода в конец тега

Создание переменной

Положить значение в переменную можно так:

Название «переменная» означает, что её значение может меняться во время выполнения скрипта:

Тем не менее, веб-разработчики часто говорят «объявить переменную» вместо «создать переменную».

Также вместо «положить в переменную значение» часто говорят «присвоить значение».

Правила именования переменных

Вывод переменной

Вывести переменную можно с помощью команды echo :

При этом команда echo позволяет вывести на экран сразу несколько значений:

В примере выше мы передали в echo 2 значения, разделив их запятой.

Так мы можем передать сколько угодно значений:

Проверка значения переменной

Команда echo не всегда удобна для проверки значения переменной.

К примеру, при попытке вывода пустой строки на экран не выведется абсолютно ничего. И непонятно, действительно ли она выводится или нет (например из-за ошибки в коде).

Поэтому для проверки содержимого переменной лучше использовать функцию var_dump() :

Как видно из примера выше, функция var_dump() выводит содержимое переменной, её длину и тип.

Типы данных мы подробно рассмотрим в отдельном уроке.

Удаление переменной

Удалить существующую переменную можно с помощью функции unset() :

А теперь пришло время немного попрактиковаться.

Задача №1

Хочу ещё раз обратить ваше внимание, что это решение не является единственно верным. К примеру, следующий код приведёт к такому же результату:

Задача №2

1. Создайте переменную title и присвойте ей какое-нибудь значение.
2. Выведите значение переменной на экран внутри тега h1.
3. Измените значение переменной на какое-нибудь другое.
4. Снова выведите переменную на экран, теперь уже внутри тега div.
5. Удалите переменную title.

Источник

PHP проверка на тип данных

В этой статье вы узнаете как и зачем проверяют на тип данных (как правило в переменной) в PHP.

Как проверить тип переменной в PHP

В ваших скриптах может возникнуть необходимость на дополнительную проверку и иногда, это проверка на какой-то определенный тип. Чаще всего, смотрим, есть ли хоть какого-то значение в переменной:

Вернемся к нашей теме. Чтобы проверить на типы данных существуют следующие проверки:

Можем проверить на массив, на тип булево (true или false), число с плавающей точкой, обычное число, строку и объект.

Эти проверки помогут вам в ваших скриптах. Например, стоит задача: если приходит целое число, то мы ничего не делаем, а если с плавающей точкой то округляем в какую-то сторону на «столько-то» знаков.

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

Есть также проверка и для NULL:

Вот такие вот простые и полезные вещи могут улучшить наш код 🙂

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

— Создание сайтов на 1С-Битрикс любой сложности
— Вёрстка макетов Figma, Photoshop, Zeplin
— Поддержка проектов на Битриксе
— Разработка нового функционала для сайта
— Парсинг данных
— Выгрузка из файлов в формате XML, YML, XLS, XLSX, CSV, JSON
— Интеграция по API со сторонними сервисами
и многое другое

Источник

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

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