- Проверка на существование и пустоту в PHP
- Проверка существования переменной
- Операторы объединения с NULL
- Проверка на пустоту
- Существование элемента массива
- property_exists
- Список параметров
- Возвращаемые значения
- Примечания
- Список изменений
- Примеры
- Смотрите также
- property_exists
- Список параметров
- Возвращаемые значения
- Примеры
- Примечания
- Смотрите также
- User Contributed Notes 10 notes
Проверка на существование и пустоту в PHP
Часто возникают ситуации, когда нужно проверить существование или пустоту переменной. В PHP для этого есть функции isset() , empty() и array_key_exists() .
Проверка существования переменной
Функция isset() возвращает true , если переменная существует и её значение не null :
Если передать в isset несколько переменных, она вернёт true при существовании всех переменных:
'; echo isset($name, $age, $status) ? 'Василиса есть' : 'Василисы нет';
Василиса есть Василисы нет
Операторы объединения с NULL
В PHP 7 появился оператор объединения с NULL (или NULL-коалесцентный оператор) ?? . Он позволяет получить значение переменной, если она задана и не равна NULL, а иначе — значение по-умолчанию:
В PHP 7.4 появился присваивающий оператор объединения с NULL ??= .Он позволяет удобно задать значение переменной, если эта переменная ещё не задана (либо равна NULL):
// Как было раньше $name = $name ?? 'Василий'; // Как стало в PHP 7.4 $name ??= 'Василий';
Проверка на пустоту
Напомню, переменная считается пустой (приводится к false), если она имеет одно из следующих значений:
- 0 (целое или дробное)
- » (пустая строка)
- ‘0’ (строка с числом 0)
- [] (пустой массив)
- null
Функция empty() возвращает true , если переменная не существует или пустая:
Поведение isset() и empty() сначала может немного запутать: первая возвращает true при существовании переменной, вторая — при не существовании. К этому нужно просто привыкнуть.
На самом деле isset() и empty() , аналогично echo , являются синтаксическими конструкциями, а не функциями.
Функции isset() и empty() гасят ошибку обращения к несуществующей переменной. Это одна из причин, почему они не являются обычными функциями.
ceil($var); // Notice: Undefined variable: var isset($var); // Ошибки нет
Существование элемента массива
Как мы узнали чуть выше, isset() возвращает false , если переменная существует, но имеет значение null .
Бывают ситуации, когда нам необходимо точно знать, существует ли определённый элемент массива или нет, даже если его значение NULL.
Для этого в PHP существует функция array_key_exists() :
property_exists
Функция проверяет, существует ли атрибут property в указанном классе.
Замечание:
В противоположность isset() , property_exists() возвращает TRUE даже если свойство имеет значение NULL .
Список параметров
Имя класса или объекта класса для проверки
Возвращаемые значения
Возвращает TRUE , если свойство существует, FALSE — если оно не существует или NULL в случае ошибки.
Примечания
Замечание:
Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс еще не известен.
Замечание:
Функция property_exists() не определяет магически доступные свойства с помощью метода __get.
Список изменений
Версия | Описание |
---|---|
5.3.0 | Эта функция проверяет существование свойства вне зависимости от его доступности. |
Примеры
Пример #1 Пример использования property_exists()
class myClass public $mine ;
private $xpto ;
static protected $test ;
static function test () var_dump ( property_exists ( ‘myClass’ , ‘xpto’ )); //true
>
>
var_dump ( property_exists ( ‘myClass’ , ‘mine’ )); //true
var_dump ( property_exists (new myClass , ‘mine’ )); //true
var_dump ( property_exists ( ‘myClass’ , ‘xpto’ )); //true, начиная с версии PHP 5.3.0
var_dump ( property_exists ( ‘myClass’ , ‘bar’ )); //false
var_dump ( property_exists ( ‘myClass’ , ‘test’ )); //true, начиная с версии PHP 5.3.0
myClass :: test ();
Смотрите также
property_exists
Функция проверяет, существует ли атрибут property в указанном классе.
Замечание:
В противоположность isset() , property_exists() возвращает true , даже если свойство имеет значение null .
Список параметров
Имя класса или объект класса для проверки
Возвращаемые значения
Возвращает true , если свойство существует, false , если оно не существует, или null в случае возникновения ошибки.
Примеры
Пример #1 Пример использования property_exists()
class myClass public $mine ;
private $xpto ;
static protected $test ;
static function test () var_dump ( property_exists ( ‘myClass’ , ‘xpto’ )); //true
>
>
var_dump ( property_exists ( ‘myClass’ , ‘mine’ )); //true
var_dump ( property_exists (new myClass , ‘mine’ )); //true
var_dump ( property_exists ( ‘myClass’ , ‘xpto’ )); //true
var_dump ( property_exists ( ‘myClass’ , ‘bar’ )); //false
var_dump ( property_exists ( ‘myClass’ , ‘test’ )); //true
myClass :: test ();
Примечания
Замечание:
Вызов этой функции будет использовать все зарегистрированные функции автозагрузки, если класс ещё не известен.
Замечание:
Функция property_exists() не определяет магически доступные свойства с помощью метода __get .
Смотрите также
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 ;
var_dump ( property_exists ( «TestClass» , «dynamic» )); // boolean false, as expected
var_dump ( property_exists ( $testObject , «dynamic» )); // boolean false, same as above
$testObject -> dynamic = null ;
var_dump ( property_exists ( $testObject , «dynamic» )); // boolean true
unset( $testObject -> dynamic );
var_dump ( property_exists ( $testObject , «dynamic» )); // boolean false, again.
var_dump ( property_exists ( $testObject , «declared» )); // boolean true, as espected
unset( $testObject -> declared );
var_dump ( property_exists ( $testObject , «declared» )); // boolean true, even if has been unset()
If you are in a namespaced file, and you want to pass the class name as a string, you will have to include the full namespace for the class name — even from inside the same namespace:
property_exists(«A», «foo»); // false
property_exists(«\\MyNS\\A», «foo»); // true
?>
protected $_name ;
protected $_email ;
public function __call ( $name , $arguments ) $action = substr ( $name , 0 , 3 );
switch ( $action ) case ‘get’ :
$property = ‘_’ . strtolower ( substr ( $name , 3 ));
if( property_exists ( $this , $property )) return $this ->< $property >;
>else echo «Undefined Property» ;
>
break;
case ‘set’ :
$property = ‘_’ . strtolower ( substr ( $name , 3 ));
if( property_exists ( $this , $property )) $this -> < $property >= $arguments [ 0 ];
>else echo «Undefined Property» ;
>
$s = new Student ();
$s -> setName ( ‘Nanhe Kumar’ );
$s -> setEmail ( ‘nanhe.kumar@gmail.com’ );
echo $s -> getName (); //Nanhe Kumar
echo $s -> getEmail (); // nanhe.kumar@gmail.com
$s -> setAge ( 10 ); //Undefined Property
?>
If you want to test if declared *public* property was unset, you can use the following code:
$a = new A ();
$is_defined = array_key_exists ( ‘declared’ , (array) $a ); //=>true
unset( $a -> declared );
$is_defined = array_key_exists ( ‘declared’ , (array) $a ); //=>false
?>
As of PHP 5.3.0, calling property_exists from a parent class sees private properties in sub-classes.
class Child extends P private $prop1 ;
>
$child = new Child ();
var_dump ( $child -> test_prop ( ‘prop1’ )); //true, as of PHP 5.3.0
abstract class P private $priv ;
static protected $static_prop ;
static function exists ( $prop = ‘priv’ ) var_dump ( property_exists (new static, $prop )); //true
>
>
class S extends P static protected $new_prop ;
>
S :: exists ( ‘new_prop’ ); // True
S :: exists ( ‘static_prop’ ); // True
S :: exists ( ‘priv’ ); // True
$a = array(‘a’,’b’=>’c’);
print_r((object) $a);
var_dump( property_exists((object) $a,’0′));
var_dump( property_exists((object) $a,’b’));
For class constants, use defined() to check for their existence since property_exists() cannot be used.
class A private static $c = ‘C’ ;
const B = ‘B’ ;
>
if( property_exists ( ‘A’ , ‘c’ )=== true ) echo ‘y’ ;
>else echo ‘n’ ;
> //output: y
if( property_exists ( ‘A’ , ‘B’ )=== true ) echo ‘y’ ;
>else echo ‘n’ ;
> //output: n
if( defined ( ‘A::B’ )=== true ) echo ‘y’ ;
>else echo ‘n’ ;
> //output: y
?>
declared properties cannot be unset
any set property does exist, even being set to null, regardless how it was set
public $my_public ;
protected $my_protected ;
private $my_private ;
function __construct () $this -> dumper ( ‘before-constructed’ );
$this -> my_constructed_int = 123 ;
$this -> my_constructed_null = null ;
$this -> dumper ( ‘after-constructed’ );
>
public function dumper ( $name ) printf ( «\n[%s] dump:\n» , $name );
foreach ( $this -> my_checklist () as $prop ) printf ( «[%s]:\t» , $prop );
var_dump ( property_exists ( $this , $prop ));
>
>
public function unset_all () foreach ( $this -> my_checklist () as $prop ) unset( $this -> $prop );
>
>
private function my_checklist () return array( ‘my_public’ , ‘my_protected’ , ‘my_private’ , ‘my_constructed_int’ , ‘my_constructed_null’ , ‘my_assigned_int’ , ‘my_assigned_null’ ,);
>
$object = new demo_property_exists ();
$object -> dumper ( ‘before-assigned’ );
$object -> my_assigned_int = 456 ;
$object -> my_assigned_null = null ;
$object -> dumper ( ‘after-assigned’ );
$object -> unset_all ();
$object -> dumper ( ‘after-unset’ );
[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)