public function __get($name) // 这里$name是属性名 { $getter = ‘get‘ . $name; // getter函数的函数名 if (method_exists($this, $getter)) { return $this->$getter(); // 调用了getter函数 } elseif (method_exists($this, ‘set‘ . $name)) { throw new InvalidCallException(‘Getting write-only property: ‘ . get_class($this) . ‘::‘ . $name); } else { throw new UnknownPropertyException(‘Getting unknown property: ‘ . get_class($this) . ‘::‘ . $name); } } // $name是属性名,$value是拟写入的属性值 public function __set($name, $value) { $setter = ‘set‘ . $name; // setter函数的函数名 if (method_exists($this, $setter)) { $this->$setter($value); // 调用setter函数 } elseif (method_exists($this, ‘get‘ . $name)) { throw new InvalidCallException(‘Setting read-only property: ‘ . get_class($this) . ‘::‘ . $name); } else { throw new UnknownPropertyException(‘Setting unknown property: ‘ . get_class($this) . ‘::‘ . $name); } }
someObject->foo实际是调用someObject->getFoo()
someObject->foo = $some_value 实际是 someObject->setFoo($some_value)
如下的Post类,实现了可读可写的属性title:
class Post extends yii\base\Object // 第一步:继承自 yii\base\Object { private $_title; // 第二步:声明一个私有成员变量 public function getTitle() // 第三步:提供getter和setter { return $this->_title; } public function setTitle($value) { $this->_title = trim($value); } }
这样好处多多
Component继承于yii\base\object, 具有以下三个重要特征
属性
事件
行为
yii\base\Component::on() 就是用来绑定的
$person = new Person; // 使用PHP全局函数作为handler来进行绑定 $person->on(Person::EVENT_GREET, ‘person_say_hello‘); // 使用对象$obj的成员函数say_hello来进行绑定 $person->on(Person::EVENT_GREET, [$obj, ‘say_hello‘]); // 使用类Greet的静态成员函数say_hello进行绑定 $person->on(Person::EVENT_GREET, [‘app\helper\Greet‘, ‘say_hello‘]); // 使用匿名函数 $person->on(Person::EVENT_GREET, function ($event) { echo ‘Hello‘; });
行为是把一个类绑定到另一个类, 让第二个类有第一个类的属性和方法. 即:不改变现有类的情况下, 对类的功能进行扩充
使用行为的大致流程
在http://www.digpage.com/index.html中学习yii2
原文:http://www.cnblogs.com/derrck/p/5188369.html