public static function strictSet($class, $name)
{
$rc = new \ReflectionClass($class);
$hint = self::getSuggestion(array_merge(array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) {
return !$p->isStatic();
}), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-write)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name);
throw new MemberAccessException("Cannot write to an undeclared property {$class}::\${$name}" . ($hint ? ", did you mean \${$hint}?" : '.'));
}
/** * @return void * @throws MemberAccessException if the property is not defined or is read-only */ public function __set($name, $value) { $class = get_class($this); $uname = ucfirst($name); if (ObjectMixin::hasProperty($class, $name)) { // unsetted property $this->{$name} = $value; } elseif ($prop = ObjectMixin::getMagicProperty($class, $name)) { // property setter if (!($prop & 0b1000)) { throw new MemberAccessException("Cannot write to a read-only property {$class}::\${$name}."); } $this->{'set' . $name}($value); } elseif ($name === '') { throw new MemberAccessException("Cannot write to a class '{$class}' property without name."); } elseif (($methods =& ObjectMixin::getMethods($class)) && isset($methods[$m = 'set' . $uname])) { // old property setter trigger_error("Add annotation @property for {$class}::\${$name} or use {$m}()" . ObjectMixin::getSource(), E_USER_DEPRECATED); $this->{$m}($value); } elseif (isset($methods['get' . $uname]) || isset($methods['is' . $uname])) { // property setter throw new MemberAccessException("Cannot write to a read-only property {$class}::\${$name}."); } else { ObjectMixin::strictSet($class, $name); } }