Rev 34 | Rev 60 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 34 | Rev 59 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | <?php
|
1 | <?php
|
2 | 2 | ||
3 | namespace de\pointedears; |
3 | namespace PointedEars\PHPX; |
4 | 4 | ||
5 | /**
|
5 | /**
|
6 | * Base class providing a generic getter and setter
|
6 | * Base class providing generic wrappers for reading from and
|
- | 7 | * and writing to inaccessible properties.
|
|
- | 8 | *
|
|
- | 9 | * For each such property there must exist a public dynamically
|
|
- | 10 | * bound method (the PHP default) in the inheriting class whose
|
|
- | 11 | * name is prefixed with 'get' (a <i>getter</i>, for read access)
|
|
- | 12 | * and/or with 'set' (a <i>setter</i>, for write access) followed
|
|
- | 13 | * by the property name. (It is recommended to write the first
|
|
- | 14 | * letter of the property name in the method name in uppercase.
|
|
- | 15 | * For runtime-efficiency, underscores in the property name are
|
|
- | 16 | * <em>not</em> converted to camel-case ["property_name" requires
|
|
- | 17 | * "getProperty_name", <em>not</em> "getPropertyName"].)
|
|
- | 18 | *
|
|
- | 19 | * The getter or setter would then access the non-public property
|
|
- | 20 | * whose name is the name of the accessed property prefixed with
|
|
- | 21 | * underscore ('_'), called the <em>underscore property</em>.
|
|
- | 22 | * It can make sure that the value of the underscore property is
|
|
- | 23 | * of a specific type or within a specific range, i. e. perform
|
|
- | 24 | * automatic type conversion, normalize values that are out of
|
|
- | 25 | * range when the property is read, and reject/ignore attempts
|
|
- | 26 | * to set unsuitable property values. This is particularly useful
|
|
- | 27 | * with instances of model classes; see {@link AbstractModel} and
|
|
- | 28 | * {@link Model}.
|
|
- | 29 | *
|
|
- | 30 | * Properties that do not have a getter are not available
|
|
- | 31 | * from unprivileged context, and an exception is thrown
|
|
- | 32 | * when attempting to read from them there.
|
|
- | 33 | *
|
|
- | 34 | * Properties that do not have a setter are effectively
|
|
- | 35 | * <em>read-only</em> from unprivileged context, and
|
|
- | 36 | * an exception is thrown when attempting to write to them there.
|
|
7 | *
|
37 | *
|
8 | * @author Thomas 'PointedEars' Lahn
|
38 | * @author Thomas 'PointedEars' Lahn
|
9 | */
|
39 | */
|
10 | abstract class Base |
40 | abstract class Base |
11 | {
|
41 | {
|
12 | /**
|
42 | /**
|
13 | * Retrieves a property value.
|
43 | * Retrieves a property value.
|
14 | *
|
44 | *
|
- | 45 | *
|
|
15 | * @param string $name
|
46 | * @param string $name
|
16 | * Property name
|
47 | * Property name
|
17 | * @throws InvalidArgumentException
|
48 | * @throws InvalidArgumentException
|
18 | * if the property does not exist or has no getter
|
49 | * if the underscore property for the property
|
- | 50 | * named <code><var>$name</var></code> does not exist
|
|
- | 51 | * or has no getter
|
|
19 | * @return mixed
|
52 | * @return mixed
|
20 | * Property value
|
53 | * Return value of the property-specific getter
|
21 | */
|
54 | */
|
22 | public function __get ($name) |
55 | public function __get ($name) |
23 | {
|
56 | {
|
24 | $getter = 'get' . ucfirst($name); |
57 | $getter = 'get' . ucfirst($name); |
25 | if (method_exists($this, $getter)) |
58 | if (method_exists($this, $getter)) |
Line 27... | Line 60... | ||
27 | return $this->$getter(); |
60 | return $this->$getter(); |
28 | }
|
61 | }
|
29 | 62 | ||
30 | if (property_exists($this, "_$name")) |
63 | if (property_exists($this, "_$name")) |
31 | {
|
64 | {
|
32 | throw new \InvalidArgumentException("Property '_$name' has no getter"); |
65 | throw new \InvalidArgumentException("Property '{$name}' has no getter"); |
33 | }
|
66 | }
|
34 | 67 | ||
35 | throw new \InvalidArgumentException("No such property: '_$name'"); |
68 | throw new \InvalidArgumentException("No such property: '{$name}'"); |
36 | }
|
69 | }
|
37 | 70 | ||
38 | /**
|
71 | /**
|
39 | * Sets a property value.
|
72 | * Sets a property value.
|
40 | *
|
73 | *
|
- | 74 | * Called when attempting to write data to inaccessible
|
|
- | 75 | * (usually protected or private) properties.
|
|
- | 76 | *
|
|
41 | * @param string $name
|
77 | * @param string $name
|
42 | * Property name
|
78 | * Property name
|
43 | * @param mixed $value
|
79 | * @param mixed $value
|
44 | * Property value
|
80 | * Property value
|
45 | * @throws InvalidArgumentException
|
81 | * @throws InvalidArgumentException
|
- | 82 | * if the protected underscore property for the property
|
|
- | 83 | * named <code><var>$name</var></code> does not exist
|
|
46 | * if the property does not exist or is read-only
|
84 | * or has no setter (is read-only)
|
47 | * @return mixed
|
85 | * @return mixed
|
48 | * Return value of the property-specific setter
|
86 | * Return value of the property-specific setter
|
49 | */
|
87 | */
|
50 | public function __set ($name, $value) |
88 | public function __set ($name, $value) |
51 | {
|
89 | {
|
Line 55... | Line 93... | ||
55 | return $this->$setter($value); |
93 | return $this->$setter($value); |
56 | }
|
94 | }
|
57 | 95 | ||
58 | if (property_exists($this, "_$name")) |
96 | if (property_exists($this, "_$name")) |
59 | {
|
97 | {
|
60 | throw new \InvalidArgumentException("Property '_$name' has no setter"); |
98 | throw new \InvalidArgumentException("Property '{$name}' has no setter"); |
61 | }
|
99 | }
|
62 | 100 | ||
63 | throw new \InvalidArgumentException("No such property: '_$name'"); |
101 | throw new \InvalidArgumentException("No such property: '{$name}'"); |
64 | }
|
102 | }
|
65 | }
|
103 | }
|
66 | 104 |