Clase ReflectionProperty

(PHP 5, PHP 7, PHP 8)

Introducción

La clase ReflectionProperty muestra información sobre las propiedades de una clase.

Sinopsis de la Clase

class ReflectionProperty implements Reflector {
/* Constantes */
const integer IS_STATIC = 1;
const integer IS_PUBLIC = 256;
const integer IS_PROTECTED = 512;
const integer IS_PRIVATE = 1024;
/* Propiedades */
public $name;
public $class;
/* Métodos */
final private __clone(): void
public __construct(object|string $class, string $name)
public static export(mixed $class, string $name, bool $return = ?): string
public getAttributes(?string $name = null, int $flags = 0): array
public getHook(PropertyHookType $type): ?ReflectionMethod
public getHooks(): array
public getModifiers(): int
public getName(): string
public getRawValue(object $object): mixed
public getValue(object $object = ?): mixed
public hasHook(PropertyHookType $type): bool
public hasHooks(): bool
public hasType(): bool
public isAbstract(): bool
public isDefault(): bool
public isDynamic(): bool
public isFinal(): bool
public isInitialized(?object $object = null): bool
public isLazy(object $object): bool
public isPrivate(): bool
public isPrivateSet(): bool
public isPromoted(): bool
public isProtected(): bool
public isPublic(): bool
public isReadOnly(): bool
public isStatic(): bool
public isVirtual(): bool
public setAccessible(bool $accessible): void
public setRawValue(object $object, mixed $value): void
public setValue(object $object, mixed $value): void
public __toString(): string
}

Propiedades

name

Nombre de la propiedad. De sólo lectura, lanza una ReflectionException en un intento de escribir.

class

Nombre de la clase donde se define la propiedad. De sólo lectura, lanza una ReflectionException en un intento de escribir.

Constantes predefinidas

Modificadores ReflectionProperty

ReflectionProperty::IS_STATIC

Indica las propiedades static.

ReflectionProperty::IS_PUBLIC

Indica las propiedades public.

ReflectionProperty::IS_PROTECTED

Indica las propiedades protected.

ReflectionProperty::IS_PRIVATE

Indica las propiedades private.

Tabla de contenidos

add a note

User Contributed Notes 2 notes

up
7
rasmus at mindplay dot dk
14 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
0
mitgath at gmail dot com
19 days ago
There is way to get property type without reflection.
Not very clear, but there is:

<?php

function getPropType(object $object, string $propName): string
{
try {
$object->{$propName} = new class {};
} catch (
\TypeError $e) {
// @hint: question mark in type can be used to detect if property is nullable
if (preg_match('/of type \??(.*)$/', $e->getMessage(), $m)) {
return
$m[1];
}
throw
$e;
} catch (
\Error $e) {
// property doesn't exist or is not public
throw $e;
}
throw new
\TypeError(sprintf('Property %s of class %s has no type', $propName, $object::class));
// alternatively return 'mixed';
}
?>

note: in case you need access to private/protected properties its easy to change this to be embedded in any class:

<?php

trait PropertyTypeResolver
{
public function
getPropType(string $propName): string
{
try {
$this->{$propName} = new class {};
} catch (
\TypeError $e) {
// @hint: question mark in type can be used to detect if property is nullable
if (preg_match('/of type \??(.*)$/', $e->getMessage(), $m)) {
return
$m[1];
}
throw
$e;
} catch (
\Error $e) {
// property doesn't exist
throw $e;
}
throw new
\TypeError(sprintf('Property %s of class %s has no type', $propName, $this::class));
// alternatively return 'mixed';
}
}
?>
To Top