Класс ReflectionProperty

(PHP 5, PHP 7)

Введение

Класс ReflectionProperty сообщает информацию о свойствах класса.

Обзор классов

ReflectionProperty implements Reflector {
/* Константы */
const integer IS_STATIC = 1 ;
const integer IS_PUBLIC = 256 ;
const integer IS_PROTECTED = 512 ;
const integer IS_PRIVATE = 1024 ;
/* Свойства */
public $name ;
public $class ;
/* Методы */
final private void __clone ( void )
public __construct ( mixed $class , string $name )
public static string export ( mixed $class , string $name [, bool $return ] )
public ReflectionClass getDeclaringClass ( void )
public string getDocComment ( void )
public int getModifiers ( void )
public string getName ( void )
public mixed getValue ([ object $object ] )
public bool isDefault ( void )
public bool isPrivate ( void )
public bool isProtected ( void )
public bool isPublic ( void )
public bool isStatic ( void )
public void setAccessible ( bool $accessible )
public void setValue ( object $object , mixed $value )
public string __toString ( void )
}

Свойства

name

Имя свойства. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.

class

Имя класса, в котором данное свойство описано. Доступно только для чтения и выбрасывает исключение ReflectionException при попытке записи.

Предопределенные константы

Модификаторы ReflectionProperty

ReflectionProperty::IS_STATIC

Указывает, что свойство является статическим (static).

ReflectionProperty::IS_PUBLIC

Указывает, что свойство является общедоступным (public) properties.

ReflectionProperty::IS_PROTECTED

Указывает, что свойство является защищенным (protected).

ReflectionProperty::IS_PRIVATE

Указывает, что свойство является закрытым (private).

Содержание

Коментарии

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...
2010-07-30 08:06:14
http://php5.kiev.ua/manual/ru/class.reflectionproperty.html
There is way to get property type without reflection.
Not very clear, but there is:

<?php

function getPropType(object $objectstring $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';
   
}
}
?>
2025-03-11 23:50:27
http://php5.kiev.ua/manual/ru/class.reflectionproperty.html

    Поддержать сайт на родительском проекте КГБ