123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- <?php
- namespace DeepCopy\Reflection;
- use DeepCopy\Exception\PropertyException;
- use ReflectionClass;
- use ReflectionException;
- use ReflectionObject;
- use ReflectionProperty;
- class ReflectionHelper
- {
- /**
- * Retrieves all properties (including private ones), from object and all its ancestors.
- *
- * Standard \ReflectionClass->getProperties() does not return private properties from ancestor classes.
- *
- * @author muratyaman@gmail.com
- * @see http://php.net/manual/en/reflectionclass.getproperties.php
- *
- * @param ReflectionClass $ref
- *
- * @return ReflectionProperty[]
- */
- public static function getProperties(ReflectionClass $ref)
- {
- $props = $ref->getProperties();
- $propsArr = array();
- foreach ($props as $prop) {
- $propertyName = $prop->getName();
- $propsArr[$propertyName] = $prop;
- }
- if ($parentClass = $ref->getParentClass()) {
- $parentPropsArr = self::getProperties($parentClass);
- foreach ($propsArr as $key => $property) {
- $parentPropsArr[$key] = $property;
- }
- return $parentPropsArr;
- }
- return $propsArr;
- }
- /**
- * Retrieves property by name from object and all its ancestors.
- *
- * @param object|string $object
- * @param string $name
- *
- * @throws PropertyException
- * @throws ReflectionException
- *
- * @return ReflectionProperty
- */
- public static function getProperty($object, $name)
- {
- $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object);
- if ($reflection->hasProperty($name)) {
- return $reflection->getProperty($name);
- }
- if ($parentClass = $reflection->getParentClass()) {
- return self::getProperty($parentClass->getName(), $name);
- }
- throw new PropertyException(
- sprintf(
- 'The class "%s" doesn\'t have a property with the given name: "%s".',
- is_object($object) ? get_class($object) : $object,
- $name
- )
- );
- }
- }
|