PHP 8.2.28 Released!

property_exists

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

property_exists Comprueba si el objeto o la clase tienen una propiedad

Descripción

property_exists(mixed $class, string $property): bool

Esta función comprueba si la propiedad dada por property existe en la clase especificada.

Nota:

A diferencia de isset(), property_exists() devuelve true incluso si la propiedad tiene el valor null.

Parámetros

class

El nombre de la clase o un objeto de la clase a comprobar

property

El nombre de la propiedad

Valores devueltos

Devuelve true si la propiedad existe, false si no existe, o null en caso de error.

Notas

Nota:

Esta función cargará cualquier autocargador registrado si la clase todavía no existe.

Nota:

La función property_exists() no puede detectar propiedades que son accesibles de forma mágica usando el método mágico __get.

Historial de cambios

Versión Descripción
5.3.0 Esta función comprueba la existencia de una propiedad independientemente de su accesibilidad.

Ejemplos

Ejemplo #1 Un ejemplo de property_exists()

<?php

class miClase {
public
$mía;
private
$xpto;
static protected
$prueba;

static function
prueba() {
var_dump(property_exists('miClase', 'xpto')); //true
}
}

var_dump(property_exists('miClase', 'mía')); //true
var_dump(property_exists(new miClase, 'mía')); //true
var_dump(property_exists('miClase', 'xpto')); //true, desde PHP 5.3.0
var_dump(property_exists('miClase', 'bar')); //false
var_dump(property_exists('miClase', 'prueba')); //true, desde PHP 5.3.0
miClase::prueba();

?>

Ver también

add a note

User Contributed Notes 6 notes

up
68
g dot gentile at parentesigraffe dot com
10 years ago
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()

<?php

class TestClass {

public
$declared = null;

}

$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()
up
26
Stefan W
11 years ago
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:

<?
namespace MyNS;

class A {
public $foo;
}

property_exists("A", "foo"); // false
property_exists("\\MyNS\\A", "foo"); // true
?>
up
14
Nanhe Kumar
11 years ago
<?php

class Student {

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";
}

break;
default :
return
FALSE;
}
}

}

$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
?>
up
6
ewisuri [gmail]
11 years ago
As of PHP 5.3.0, calling property_exists from a parent class sees private properties in sub-classes.

<?php
class P {
public function
test_prop($prop) { return property_exists($this, $prop); }
}

class
Child extends P {
private
$prop1;
}

$child = new Child();
var_dump($child->test_prop('prop1')); //true, as of PHP 5.3.0
up
4
saurabh dot agarwal89 at gmail dot com
9 years ago
$a = array('a','b'=>'c');
print_r((object) $a);
var_dump( property_exists((object) $a,'0'));
var_dump( property_exists((object) $a,'b'));

OUTPUT:
stdClass Object
(
[0] => a
[b] => c
)
bool(false)
bool(true)
up
-2
biziclop
1 year ago
I needed a method for finding out if accessing a property outside a class is possible without errors/warnings, considering that the class might use the magic methods __isset/__get to simulate nonexistent properties.

<?php
// returns true if property is safely accessible publicly by using $obj->$prop
// Tested with PHP 5.1 - 8.2, see https://3v4l.org/QBTd1
function public_property_exists( $obj, $prop ){
// allow magic $obj->__isset( $prop ) to execute if exists
if( isset( $obj->$prop )) return true;

// no public/protected/private property exists with this name
if( ! property_exists( $obj, $prop )) return false;

// the property exists, but is it public?
$rp = new ReflectionProperty( $obj, $prop );
return
$rp->isPublic();
}

//// Test/demo
class C {
public
$public = "I’m public!";
protected
$protected = "I’m public!";
private
$private = "I’m public!";
function
__isset( $k ){
return
substr( $k, 0, 5 ) === 'magic';
}
function
__get( $k ){
if(
$k === 'magic_isset_but_null') return null;
return
"I’m {$k}!";
}
}

$o = new C();
foreach( array(
'public', 'protected', 'private',
'magic', 'magic_isset_but_null',
'missing'
) as $prop ){
if(
public_property_exists( $o, $prop ))
echo
"\$o->{$prop} is a public property, its value is: ",
var_export( $o->$prop, true ), "\n";
else echo
"\$o->{$prop} is not a public property.\n";
}
/*
$o->public is a public property, its value is: 'I’m public!'
$o->protected is not a public property.
$o->private is not a public property.
$o->magic is a public property, its value is: 'I’m magic!'
$o->magic_isset_but_null is a public property, its value is: NULL
$o->missing is not a public property.
*/
To Top