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)
Использование функций isset() и array_key_exists()
Навеяно проблемой, с которой я столкнулся из-за неправильного использования функции isset() в одном китайском движке интернет магазина. Там isset() применялась для определения существования элемента массива с некоторым ключом. Самое неприятное в данной ситуации то, что такую ошибку допускают многие. Это не первый случай, когда isset() используется именно в таком контексте, хотя это в корне неверно. Но в этот раз неграмотность разработчиков стоила мне потерянного времени, что и сподвигло меня на эту заметку.
Собственно, об уровне квалификации PHP программистов сказано немало и добавить к этому нечего.
Инициализация и удаление переменной в PHP
В PHP переменная инициализируется в момент присваивания ей значения. Неинициализированной переменная считается в двух случаях:
Функция isset()
Функция проверяет факт инициализации переменной. isset() вернет false, если передать ей в качестве параметра неинициализированную переменную. Тоже самое произойдет и с ключом массива, который имеет NULL значение. Для ключей массива действуют такие же правила приведения к NULL, как и для переменных.
Результат:
Функция array_key_exists()
Для массива использование NULL значения ключа удобно, если наличие ключа требуется сохранить. Можно будет рассчитывать на контекст, в котором данный ключ будет использован. Например, это удобно при заполнении полей формы дефолтными значениями. Например, при использовании конструкции echo, NULL значение будет приведено к пустой строке.
То, к чему я клоню, мне кажется очевидным. Если вы работаете с ключами массива, то используйте именно ту функцию, которая для этого предназначена. Ко всему прочему, использование array_key_exists() позволяет точно понять логику приложения. Никакой двусмысленности не возникает.
Скорость работы isset() и array_key_exists()
О том, что array_key_exists() работает медленнее isset() пишут даже в комментариях к соответствующей странице PHP мануала. Жалуются на то, что более медленная работа array_key_exists() заметна на массивах с количеством пар ключ-значение, превышающих 200.
Ничего не остается, как прогнать банальный тест:
isset() | array_key_exists() |
---|---|
0.687027 | 0.728652 |
Тест, безусловно, очень простой и достаточно субъективный. Было бы неплохо сделать замеры используемой памяти, например. Но глядя на результаты этого теста, у меня нет никакого желания продолжать заниматься мышиной возней. Очевидно, что выигрыша в скорости попросту нет.
Функция isset() и свойства объекта
Совсем клиническим случаем можно считать использование isset() для проверки существования свойства у объекта.
Не так часто, как в случае с массивами, но доводится встречать подобные условия:
Случай вопиющий, так как использование NULL в качестве дефолтного значения свойств – очень распространенная практика. И проверять наличие свойства объекта через isset() просто недопустимо.
Также замечу, что для использования property_exists() не требуется наличие объекта класса. Проверку можно произвести по имени класса и имени свойства.
Такое вот занимательное программирование.
Комментарии (6)
Вечер добрый!
Очень классные статьи, большое спасибо за них!
Вы все верно поняли. На самом деле, практически повсеместно используется isset(). Иногда из-за этого возникают логические ошибки в приложениях, что и стало причиной написания данной заметки.
Не надо людей вводить в заблуждение и навязывать свои ошибочные мысли.
В мануале от создателей PHP явно сказано, что isset используется и для проверки элементов массива.
И это правильно. А вот использовать элемент массива с NULL и считать этот элемент существующим, это ошибка.
Вот из-за таких как ты и приходится потом сутками сидеть и разгребать больные коды и не понимать, почему же блин переменные NULL существуют.
Максим, во-первых, я вам вам не «ты». А во-вторых, мир сложнее, чем вам кажется и нужно беречь свои нервы, а то не хватит сил на разгребание больных кодов :))
И если NULL значение в массиве — это ошибка, то это ошибка в интерпретаторе PHP. Но, думаю, дело все в том, что вы просто не понимаете смысл типа данных NULL.
Олег, вы не правы в ряде моментов. Не стоит «гнать» на PHP разработчиков, т.к. те кто ними являются, пишут хороший код. А то, что вы всех, кто написал строчку кода на PHP называете PHP-программистом, это лично ваши «психо-половые» проблемы. Второй момент, насчет NULL: в языке PHP смысл языковой конструкции null отличается от той же конструкции SQL … и не стоит и пытаться друг на друга «натягивать». Это не проблема языка, т.к. авторы языка вольны толковать как им вздумается «сколько людей, столько и мнений.». Третий момент, если Вы знаете, что PHP-разработчики пишут плохой код, то зачем вы его используете? Пишите сами или используете код других языков. Я могу понять, что писали вы пост под влиянием эмоций, но я так и не понял, что было не так в том коде «китайского движка» и что у вас не выходило? 🙂 Напишите название движка, чтобы люди знали о том, и что тут могут вылезти проблемы при использовании и место возникновения проблемы.
На 100 000 итерации isset работает в 6 раз быстрее.
method_exists
(PHP 4, PHP 5, PHP 7, PHP 8)
method_exists — Проверяет, существует ли метод в данном классе
Описание
Список параметров
Экземпляр объекта или имя класса
Возвращаемые значения
Примеры
Пример #1 Пример использования method_exists()
Результат выполнения данного примера:
Пример #2 Пример статического использования method_exists()
Результат выполнения данного примера:
Примечания
Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс ещё не известен.
Смотрите также
User Contributed Notes 20 notes
As noted [elsewhere] method_exists() does not care about the existence of __call(), whereas is_callable() does:
Undocumented change since 7.4.0 is released:
class Foo
<
private function privateMethodTest ()
<
class Bar extends Foo
<
var_dump ( method_exists ( Bar ::class, ‘privateMethodTest’ ));
// PHP 7.4: bool(false)
// PHP 7.3: bool(true)
var_dump ( is_callable ( Bar ::class, ‘privateMethodTest’ ));
// PHP 7.3: bool(true)
// PHP 7.4: bool(true)
A couple of the older comments (specifically «jp at function dot fi» and «spam at majiclab dot com») state that is_callable() does not respect a methods visibility when checked outside of that class. ie. That private/protected methods are seen as callable when tested publicly. However, this was a bug (#29210) in early versions of PHP 5 and was fixed (according to the changelog) in PHP 5.0.5 (and/or PHP 5.1.0).
Just to mention it: both method_exists() and is_callable() return true for inherited methods:
class ChildClass extends ParentClass
$p = new ParentClass ();
$c = new ChildClass ();
This function is case-insensitive (as is PHP) and here is the proof:
class A <
public function FUNC () < echo '*****' ; >
>
if you want to check for a method «inside» of a class use:
small example for those who didn’t understood what i mean ( maybe caused by bad english 🙂 ):
?>
the output will be: a::test() exists!
maybe this will help someone
Note that prepending the namespace (if any) is required even if the calling class is in the same namespace:
If you want to check in a class itself if a method is known you may do so with magic variable __CLASS__
private function foo ()<
$test = new A ( ‘foo’ );
//should return true
It wasn’t spelled out but could be inferred: method_exists() also works on interfaces.
a little difference :
to find a method of an object (instance of a class)
Here is a useful function that you can use to check classes methods access e.g whether it is public, private or static or both..
// Example class
class myClass <
public function publ () <
private function priv () <
private static function privstatic () <
public static function publstatic () <
static function mytest () <
As mentioned before, is_callable and method_exists report all methods callable even if they are private/protected and thus actually not callable. So instead of those functions you may use following work-around which reports methods as supposed to.
class Foo1 <
public function bar () <
echo «I’m private Foo1::bar()» ;
>
>
class Foo2 <
private function bar () <
echo «I’m public Foo2::bar()» ;
>
>
$f1 =new Foo1 ;
$f2 =new Foo2 ;
?>
output
Foo1::bar() is callable (correct)
Foo2::bar() is callable (incorrect)
Foo1::bar() is callable (correct)
Foo2::bar() isn’t callable (correct)
Using method_exists inside an object’s __call() method can be very usefull if you want to avoid to get a fatal error because of a limit in function nesting or if you are calling methods that dont exist but need to continue in your application:
call_user_method uses the same mechanism as a normal method call. So you can get the returned values as well in this way.
I was wondering if caching the the methods in an array would have a faster lookup. So I ran a very simple benchmark using xdebug_time_index() with 10000 iterations on each statement.
using PHP 5.3.13 btw
Please note that the test was done on multiple methods, not just one, the code presented above is to show the results, not the actual test code that ran. Also, this was tested just out of curiosity and I didn’t set up a specific environment or used any profiling tools, and it was not meant to be an official benchmark in anyway.
Just a note that the behaviour of this function changed between version 5.0.x and 5.1.x when using static member functions
Im not sure of a workaround for PHP 5.0.x yet.
PHP check whether property exists in object or class
I understand PHP does not have a pure object variable, but I want to check whether a property is in the given object or class.
In JS, I can write this to check if variable a exists in an object:
In PHP, can anything like this be done?
9 Answers 9
isset() will return false if property is null
As opposed with isset(), property_exists() returns TRUE even if the property has the value NULL.
Neither isset or property_exists work for me.
I ended up going with:
Solution
To show how this would look in an if statement for more clarity on how this is working.
Explanation
The traditional PHP way to check for something’s existence is to do:
OR for a more class specific way:
These are both fine in long form statements but in ternary statements they become unnecessarily cumbersome like so:
You can also achieve this with just the ternary operator like so:
But. if the value does not exist (is not set) it will raise an E_NOTICE and is not best practise. If the value is null it will not raise the exception.
Therefore ternary operator to the rescue making this a neat little answer:
Уточнить, существует ли объект или нет
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Существует файл или нет
При подключении флешки появляется новая директория storage/UsbDriveA проверяя существование этой.
Официальная наука не существует. Или нет?
Официальная наука – концепция придуманная в свое время, сторонниками так называемой «альтернативной.
Проверка существует ли изображение или нет
Всем здрасти. Вот я решил написать такую маленькую простую программку галерею рисунков, ну в.
Бесшумная мышь существует или нет?
сушествуютли безшумные мыши?или как уменьшить звуки щелчков мышью? думаю мечта каждого.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как проверить существует вкладка или нет?
Мне на tabcontrol, перед тем, как создать страницу, хочу проверить есть вкладка на ней или нет.
Как проверить, существует ли директория или нет
Доброе время суток. Вот столкнулся с такой задачкой, нужно проверить существует ли директория.
Как можно узнать, существует база или нет?
Всем привет. Подскажите как можно узнать существует база или нет? Можно ли это сделать через.