/** * @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); } }