xref: /plugin/dw2pdf/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php (revision dc4d9dc689082c963d5c1d9ee679553326788c6e)
1*dc4d9dc6SAnna Dabrowska<?php
2*dc4d9dc6SAnna Dabrowska
3*dc4d9dc6SAnna Dabrowskanamespace DeepCopy\Reflection;
4*dc4d9dc6SAnna Dabrowska
5*dc4d9dc6SAnna Dabrowskause DeepCopy\Exception\PropertyException;
6*dc4d9dc6SAnna Dabrowskause ReflectionClass;
7*dc4d9dc6SAnna Dabrowskause ReflectionException;
8*dc4d9dc6SAnna Dabrowskause ReflectionObject;
9*dc4d9dc6SAnna Dabrowskause ReflectionProperty;
10*dc4d9dc6SAnna Dabrowska
11*dc4d9dc6SAnna Dabrowskaclass ReflectionHelper
12*dc4d9dc6SAnna Dabrowska{
13*dc4d9dc6SAnna Dabrowska    /**
14*dc4d9dc6SAnna Dabrowska     * Retrieves all properties (including private ones), from object and all its ancestors.
15*dc4d9dc6SAnna Dabrowska     *
16*dc4d9dc6SAnna Dabrowska     * Standard \ReflectionClass->getProperties() does not return private properties from ancestor classes.
17*dc4d9dc6SAnna Dabrowska     *
18*dc4d9dc6SAnna Dabrowska     * @author muratyaman@gmail.com
19*dc4d9dc6SAnna Dabrowska     * @see http://php.net/manual/en/reflectionclass.getproperties.php
20*dc4d9dc6SAnna Dabrowska     *
21*dc4d9dc6SAnna Dabrowska     * @param ReflectionClass $ref
22*dc4d9dc6SAnna Dabrowska     *
23*dc4d9dc6SAnna Dabrowska     * @return ReflectionProperty[]
24*dc4d9dc6SAnna Dabrowska     */
25*dc4d9dc6SAnna Dabrowska    public static function getProperties(ReflectionClass $ref)
26*dc4d9dc6SAnna Dabrowska    {
27*dc4d9dc6SAnna Dabrowska        $props = $ref->getProperties();
28*dc4d9dc6SAnna Dabrowska        $propsArr = array();
29*dc4d9dc6SAnna Dabrowska
30*dc4d9dc6SAnna Dabrowska        foreach ($props as $prop) {
31*dc4d9dc6SAnna Dabrowska            $propertyName = $prop->getName();
32*dc4d9dc6SAnna Dabrowska            $propsArr[$propertyName] = $prop;
33*dc4d9dc6SAnna Dabrowska        }
34*dc4d9dc6SAnna Dabrowska
35*dc4d9dc6SAnna Dabrowska        if ($parentClass = $ref->getParentClass()) {
36*dc4d9dc6SAnna Dabrowska            $parentPropsArr = self::getProperties($parentClass);
37*dc4d9dc6SAnna Dabrowska            foreach ($propsArr as $key => $property) {
38*dc4d9dc6SAnna Dabrowska                $parentPropsArr[$key] = $property;
39*dc4d9dc6SAnna Dabrowska            }
40*dc4d9dc6SAnna Dabrowska
41*dc4d9dc6SAnna Dabrowska            return $parentPropsArr;
42*dc4d9dc6SAnna Dabrowska        }
43*dc4d9dc6SAnna Dabrowska
44*dc4d9dc6SAnna Dabrowska        return $propsArr;
45*dc4d9dc6SAnna Dabrowska    }
46*dc4d9dc6SAnna Dabrowska
47*dc4d9dc6SAnna Dabrowska    /**
48*dc4d9dc6SAnna Dabrowska     * Retrieves property by name from object and all its ancestors.
49*dc4d9dc6SAnna Dabrowska     *
50*dc4d9dc6SAnna Dabrowska     * @param object|string $object
51*dc4d9dc6SAnna Dabrowska     * @param string $name
52*dc4d9dc6SAnna Dabrowska     *
53*dc4d9dc6SAnna Dabrowska     * @throws PropertyException
54*dc4d9dc6SAnna Dabrowska     * @throws ReflectionException
55*dc4d9dc6SAnna Dabrowska     *
56*dc4d9dc6SAnna Dabrowska     * @return ReflectionProperty
57*dc4d9dc6SAnna Dabrowska     */
58*dc4d9dc6SAnna Dabrowska    public static function getProperty($object, $name)
59*dc4d9dc6SAnna Dabrowska    {
60*dc4d9dc6SAnna Dabrowska        $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object);
61*dc4d9dc6SAnna Dabrowska
62*dc4d9dc6SAnna Dabrowska        if ($reflection->hasProperty($name)) {
63*dc4d9dc6SAnna Dabrowska            return $reflection->getProperty($name);
64*dc4d9dc6SAnna Dabrowska        }
65*dc4d9dc6SAnna Dabrowska
66*dc4d9dc6SAnna Dabrowska        if ($parentClass = $reflection->getParentClass()) {
67*dc4d9dc6SAnna Dabrowska            return self::getProperty($parentClass->getName(), $name);
68*dc4d9dc6SAnna Dabrowska        }
69*dc4d9dc6SAnna Dabrowska
70*dc4d9dc6SAnna Dabrowska        throw new PropertyException(
71*dc4d9dc6SAnna Dabrowska            sprintf(
72*dc4d9dc6SAnna Dabrowska                'The class "%s" doesn\'t have a property with the given name: "%s".',
73*dc4d9dc6SAnna Dabrowska                is_object($object) ? get_class($object) : $object,
74*dc4d9dc6SAnna Dabrowska                $name
75*dc4d9dc6SAnna Dabrowska            )
76*dc4d9dc6SAnna Dabrowska        );
77*dc4d9dc6SAnna Dabrowska    }
78*dc4d9dc6SAnna Dabrowska}
79