MDL-57273 persistent: protected custom getters

(and setters).
This commit is contained in:
Damyon Wiese
2017-01-20 12:56:19 +08:00
parent 9c91a9593d
commit 599acbe776
5 changed files with 39 additions and 7 deletions
+32
View File
@@ -58,6 +58,8 @@ abstract class persistent {
* @param stdClass $record If set will be passed to {@link self::from_record()}.
*/
public function __construct($id = 0, stdClass $record = null) {
global $CFG;
if ($id > 0) {
$this->raw_set('id', $id);
$this->read();
@@ -65,6 +67,36 @@ abstract class persistent {
if (!empty($record)) {
$this->from_record($record);
}
if ($CFG->debugdeveloper) {
$this->verify_protected_methods();
}
}
/**
* This function is used to verify that custom getters and setters are declared as protected.
*
* Persistent properties should always be accessed via get('property') and set('property', 'value') which
* will call the custom getter or setter if it exists. We do not want to allow inconsistent access to the properties.
*/
final protected function verify_protected_methods() {
$properties = static::properties_definition();
foreach ($properties as $property => $definition) {
$method = 'get_' . $property;
if (method_exists($this, $method)) {
$reflection = new ReflectionMethod($this, $method);
if (!$reflection->isProtected()) {
throw new coding_exception('The method ' . get_class($this) . '::'. $method . ' should be protected.');
}
}
$method = 'set_' . $property;
if (method_exists($this, $method)) {
$reflection = new ReflectionMethod($this, $method);
if (!$reflection->isProtected()) {
throw new coding_exception('The method ' . get_class($this) . '::'. $method . ' should be protected.');
}
}
}
}
/**