PHP 8.1.0 RC 4 available for testing

La classe ReflectionProperty

(PHP 5, PHP 7, PHP 8)

Introduction

La classe ReflectionProperty rapporte des informations sur les propriétés des classes.

Synopsis de la classe

class ReflectionProperty implements Reflector {
/* Constantes */
const int IS_STATIC = 16;
const int IS_PUBLIC = 1;
const int IS_PROTECTED = 2;
const int IS_PRIVATE = 4;
/* Propriétés */
public $name;
public $class;
/* Méthodes */
public __construct(object|string $class, string $property)
final private __clone(): void
public static export(mixed $class, string $name, bool $return = ?): string
public getAttributes(?string $name = null, int $flags = 0): array
public getDocComment(): string|false
public getModifiers(): int
public getName(): string
public getValue(?object $object = null): mixed
public hasDefaultValue(): bool
public hasType(): bool
public isDefault(): bool
public isInitialized(?object $object = null): bool
public isPrivate(): bool
public isProtected(): bool
public isPublic(): bool
public isStatic(): bool
public setAccessible(bool $accessible): void
public setValue(object $object, mixed $value): void
public __toString(): string
}

Propriétés

name

Nom de la propriété. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

class

Nom de la classe où la propriété a été définie. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

Constantes pré-définies

Modificateurs de ReflectionProperty

ReflectionProperty::IS_STATIC

Indique que la propriété est statique. Antérieur à PHP 7.4.0, la valeur était 1.

ReflectionProperty::IS_PUBLIC

Indique que la propriété est publique. Antérieur à PHP 7.4.0, la valeur était 256.

ReflectionProperty::IS_PROTECTED

Indique que la propriété est protégée. Antérieur à PHP 7.4.0, la valeur était 512.

ReflectionProperty::IS_PRIVATE

Indique que la propriété est privée. Antérieur à PHP 7.4.0, la valeur était 1024.

Note:

La valeur de ces constantes peut changer entre les versions de PHP. Il est recommandé de toujours utiliser les constantes et de ne pas dépendre sur les valeurs directement.

Sommaire

add a note add a note

User Contributed Notes 2 notes

up
6
rasmus at mindplay dot dk
11 years ago
I think a more accurate explanation is this:

The Reflection classes are designed to reflect upon the source code of an application, not on any runtime information.

I think you misunderstand the ReflectionProperty constructor in your example above. The fact that it accepts an object as argument is just a convenience feature - you are actually inspecting the class of that object, not the object itself, so it's basically equivalent to:

<?php

// works fine
$Reflection = new ReflectionProperty(get_class($a), 'a');

// throws exception
$Reflection = new ReflectionProperty(get_class($a), 'foo');

?>

Getting the class of the object you're passing in is implied, since inspecting a defined property is the purpose of this class.

In your example, $a->foo is a dynamic member - it is not defined as a member of class, so there is no defining class reference, line number, default value, etc. - which means, there is nothing to reflect upon.

Clearly this very useful library could use some real documentation...
up
-6
Nanhe Kumar
7 years ago
<?php
//serialize static properties (class variable)

class Student {

    private
$members = array();
    protected
$name;
    public static
$noOfStudent;

    public function
__construct($name = 'Nanhe Kumar') {
       
$this->name = $name;
       
Student::$noOfStudent++;
    }

    public function
__sleep() {
       
$vars = get_class_vars(get_class($this));
        foreach (
$vars as $key => $val) {
            if (!empty(
$val))
               
$this->members[$key] = $val;
        }
        return
array_keys(get_object_vars($this));
    }

    public function
__wakeup() {
        foreach (
$this->members as $key => $val) {
           
$prop = new ReflectionProperty(get_class($this), $key);
           
$prop->setValue(get_class($this), $val);
        }
       
$this->members = array();
    }

    public function
getTotalStudent() {
        return
self::$noOfStudent;
    }

}

$so1 = new Student();
$so2 = new Student();
$serialized = serialize($so1);
print_r($serialized); //O:7:"Student":2:{s:16:"Studentmembers";a:1:{s:11:"noOfStudent";i:2;}s:7:"*name";s:11:"Nanhe Kumar";}
$unserialized = unserialize($serialized);
print_r($unserialized); //Student Object ( [members:Student:private] => Array ( ) [name:protected] => Nanhe Kumar )
echo Student::$noOfStudent; //2
?>
To Top