Subversion Repositories PHPX

Rev

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