Security update for Core, with self-updated composer
[yaffs-website] / vendor / symfony / validator / Mapping / MemberMetadata.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\Validator\Mapping;
13
14 use Symfony\Component\Validator\Constraint;
15 use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
16
17 /**
18  * Stores all metadata needed for validating a class property.
19  *
20  * The method of accessing the property's value must be specified by subclasses
21  * by implementing the {@link newReflectionMember()} method.
22  *
23  * This class supports serialization and cloning.
24  *
25  * @author Bernhard Schussek <bschussek@gmail.com>
26  *
27  * @see PropertyMetadataInterface
28  */
29 abstract class MemberMetadata extends GenericMetadata implements PropertyMetadataInterface
30 {
31     /**
32      * @var string
33      *
34      * @internal This property is public in order to reduce the size of the
35      *           class' serialized representation. Do not access it. Use
36      *           {@link getClassName()} instead.
37      */
38     public $class;
39
40     /**
41      * @var string
42      *
43      * @internal This property is public in order to reduce the size of the
44      *           class' serialized representation. Do not access it. Use
45      *           {@link getName()} instead.
46      */
47     public $name;
48
49     /**
50      * @var string
51      *
52      * @internal This property is public in order to reduce the size of the
53      *           class' serialized representation. Do not access it. Use
54      *           {@link getPropertyName()} instead.
55      */
56     public $property;
57
58     /**
59      * @var \ReflectionMethod[]|\ReflectionProperty[]
60      */
61     private $reflMember = array();
62
63     /**
64      * Constructor.
65      *
66      * @param string $class    The name of the class this member is defined on
67      * @param string $name     The name of the member
68      * @param string $property The property the member belongs to
69      */
70     public function __construct($class, $name, $property)
71     {
72         $this->class = $class;
73         $this->name = $name;
74         $this->property = $property;
75     }
76
77     /**
78      * {@inheritdoc}
79      */
80     public function addConstraint(Constraint $constraint)
81     {
82         if (!in_array(Constraint::PROPERTY_CONSTRAINT, (array) $constraint->getTargets())) {
83             throw new ConstraintDefinitionException(sprintf(
84                 'The constraint %s cannot be put on properties or getters',
85                 get_class($constraint)
86             ));
87         }
88
89         parent::addConstraint($constraint);
90
91         return $this;
92     }
93
94     /**
95      * {@inheritdoc}
96      */
97     public function __sleep()
98     {
99         return array_merge(parent::__sleep(), array(
100             'class',
101             'name',
102             'property',
103         ));
104     }
105
106     /**
107      * Returns the name of the member.
108      *
109      * @return string
110      */
111     public function getName()
112     {
113         return $this->name;
114     }
115
116     /**
117      * {@inheritdoc}
118      */
119     public function getClassName()
120     {
121         return $this->class;
122     }
123
124     /**
125      * {@inheritdoc}
126      */
127     public function getPropertyName()
128     {
129         return $this->property;
130     }
131
132     /**
133      * Returns whether this member is public.
134      *
135      * @param object|string $objectOrClassName The object or the class name
136      *
137      * @return bool
138      */
139     public function isPublic($objectOrClassName)
140     {
141         return $this->getReflectionMember($objectOrClassName)->isPublic();
142     }
143
144     /**
145      * Returns whether this member is protected.
146      *
147      * @param object|string $objectOrClassName The object or the class name
148      *
149      * @return bool
150      */
151     public function isProtected($objectOrClassName)
152     {
153         return $this->getReflectionMember($objectOrClassName)->isProtected();
154     }
155
156     /**
157      * Returns whether this member is private.
158      *
159      * @param object|string $objectOrClassName The object or the class name
160      *
161      * @return bool
162      */
163     public function isPrivate($objectOrClassName)
164     {
165         return $this->getReflectionMember($objectOrClassName)->isPrivate();
166     }
167
168     /**
169      * Returns the reflection instance for accessing the member's value.
170      *
171      * @param object|string $objectOrClassName The object or the class name
172      *
173      * @return \ReflectionMethod|\ReflectionProperty The reflection instance
174      */
175     public function getReflectionMember($objectOrClassName)
176     {
177         $className = is_string($objectOrClassName) ? $objectOrClassName : get_class($objectOrClassName);
178         if (!isset($this->reflMember[$className])) {
179             $this->reflMember[$className] = $this->newReflectionMember($objectOrClassName);
180         }
181
182         return $this->reflMember[$className];
183     }
184
185     /**
186      * Creates a new reflection instance for accessing the member's value.
187      *
188      * Must be implemented by subclasses.
189      *
190      * @param object|string $objectOrClassName The object or the class name
191      *
192      * @return \ReflectionMethod|\ReflectionProperty The reflection instance
193      */
194     abstract protected function newReflectionMember($objectOrClassName);
195 }