ReflectionProperty クラス

(PHP 5, PHP 7, PHP 8)

はじめに

ReflectionProperty クラスは クラスのプロパティについての情報を報告します。

クラス概要

class ReflectionProperty implements Reflector {
/* 定数 */
public const int IS_STATIC;
public const int IS_READONLY;
public const int IS_PUBLIC;
public const int IS_PROTECTED;
public const int IS_PRIVATE;
public const int IS_ABSTRACT;
public const int IS_PROTECTED_SET;
public const int IS_PRIVATE_SET;
public const int IS_VIRTUAL;
public const int IS_FINAL;
/* プロパティ */
public string $name;
public string $class;
/* メソッド */
public __construct(object|string $class, string $property)
private __clone(): void
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 = null): 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
}

プロパティ

name

プロパティ名。読み込み専用で、書き込もうとすると ReflectionException をスローします。

class

プロパティが定義されているクラス名。読み込み専用で、書き込もうとすると ReflectionException をスローします。

定義済み定数

ReflectionProperty の修飾子

ReflectionProperty::IS_STATIC int

static プロパティを示します。 PHP 7.4.0 より前のバージョンでは、この値は 1 でした。

ReflectionProperty::IS_READONLY int

readonly プロパティを示します。 PHP 8.1.0 以降で利用可能です。

ReflectionProperty::IS_PUBLIC int

public プロパティを示します。 PHP 7.4.0 より前のバージョンでは、この値は 256 でした。

ReflectionProperty::IS_PROTECTED int

protected プロパティを示します。 PHP 7.4.0 より前のバージョンでは、この値は 512 でした。

ReflectionProperty::IS_PRIVATE int

private プロパティを示します。 PHP 7.4.0 より前のバージョンでは、この値は 1024 でした。

ReflectionProperty::IS_ABSTRACT int
abstract プロパティを示します。 PHP 8.4.0 以降で利用可能です。
ReflectionProperty::IS_PROTECTED_SET int
PHP 8.4.0 以降で利用可能です。
ReflectionProperty::IS_PRIVATE_SET int
PHP 8.4.0 以降で利用可能です。
ReflectionProperty::IS_VIRTUAL int
PHP 8.4.0 以降で利用可能です。
ReflectionProperty::IS_FINAL int
final プロパティを示します。 PHP 8.4.0 以降で利用可能です。

注意:

これらの定数の値は、PHP のバージョンが異なると変更される可能性があります。 これらの値を直接用いず、常に定数を使うことを推奨します。

変更履歴

バージョン 説明
8.4.0 クラス定数が型付けされました。
8.4.0 ReflectionProperty::IS_VIRTUALReflectionProperty::IS_PRIVATE_SETReflectionProperty::IS_PROTECTED_SETReflectionProperty::IS_ABSTRACTReflectionProperty::IS_FINAL が追加されました。
8.0.0 ReflectionProperty::export() は、削除されました。

目次

add a note

User Contributed Notes 2 notes

up
7
rasmus at mindplay dot dk
15 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
5 months ago
There is way to get property type without reflection.Not very clear, but there is:<?phpfunction 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:<?phptrait 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