【PHP5权威指南】读书心得二——高级面向对象编程和设计模式

来源:互联网 发布:捷通人才系统源码 编辑:程序博客网 时间:2024/04/30 09:33

1、使用数组语法访问的重载——ArrayAccess(数组式访问)接口

ArrayAccess{/* 方法 */abstract public boolean offsetExists ( mixed $offset )abstract public mixed offsetGet ( mixed $offset )abstract public void offsetSet ( mixed $offset, mixed $value )abstract public void offsetUnset ( mixed $offset )}
官方提供了以上接口,自己使用时需要实现
class MyClass implements ArrayAccess{static private $config;private $config_array;private function __construct(){$this->config_array = array("mikercal" => "male");}public static function instance(){if( self::$config == NULL ){self::$config = new MyClass();}return self::$config;}public function offsetExists($name){return isset($this->config_array[$name]);}public function offsetGet($name){return $this->config_array[$name];}public function offsetSet($name, $value){$this->config_array[$name] = $value;}public function offsetUnset($name){unset($this->config_array[$name]);}}$config = MyClass::instance();echo $config["mikercal"];$config["Tom"] = "male";echo $config["Tom"];
2、迭代器
一个对象的属性可以用foreach()循环进行迭代循环
Iterator extends Traversable{/* 方法 */abstract public mixed current ( void )abstract public scalar key ( void )abstract public void next ( void )abstract public void rewind ( void )abstract public void boolean valid ( void )}
官方提供了以上接口,自己使用时需要实现
class NumberSquare implements Iterator{private $cur,$start,$end;public function __construct($start, $end){$this->start = $start;$this->end = $end;}//重新把迭代器指向列表的开始处public function rewind(){$this->cur = $this->start;}//检查当前位置是否有效public function valid(){return $this->cur <= $this->end;}//返回当前元素的值public function current(){return pow($this->cur, 2);}//向下移动到下一个元素public function next(){$this->cur++;}//返回当前元素的键public function key(){return $this->cur;}}$num = new NumberSquare(2, 8);foreach( $num as $key=>$value ){echo "The square of $key is $value<br>";}
3、设计模式——单例模式
class Logger{static private $instance;static function instance(){if( self::$instance == NULL ){self::$instance = new Logger();}return self::$instance;}private function __construct(){}private function __clone(){}public function Log($str){}}Logger::instance()->Log("backup");
设计模式——工厂模式
abstract class User{function __construct($name){$this->name = $name;}function getName(){return $this->name;}function hasReadPermission(){return true;}function hasModifyPermission(){return false;}function hasDeletePermission(){return false;}protected $name = NULL;}class GuestUser extends User{}class CustomUser extends User{function hasModifyPermission(){return true;}}class AdminUser extends User{function hasModifyPermission(){return true;}function hasDeletePermission(){return true;}}class UserFactory{private static $user = array("Andi" => "admin","mikercal" => "custom","Tom" => "guest");static function Create($name){if( !isset(self::$user[$name]) ){echo "user doesn't exist";return false;}switch( self::$user[$name] ){case 'guest':return new GuestUser($name);break;case 'custom':return new CustomUser($name);break;case 'admin':return new AdminUser($name);break;}}}function boolToStr($bool){if( $bool == false ){return "No<br>";}else{return "Yes<br>";}}function displayPermission(User $obj){echo $obj->getName()."'s permission:<br>";echo "Read:".boolToStr( $obj->hasReadPermission() );echo "Modify:".boolToStr( $obj->hasModifyPermission() );echo "Delete:".boolToStr( $obj->hasDeletePermission() );}$login = array(  "Tom","mikercal","Andi");foreach($login as $v){displayPermission(UserFactory::Create($v));}
上述例子中,建立了一个基类User,三个子类GusetUser、CustomUser、AdminUser;使用UserFactory类来根据用户身份创建合适的用户对象
设计模式——观察者模式
class ExchangeRate{private $observer;private $exchage_rate;static public $instance;static public function instance(){if( self::$instance == NULL ){self::$instance = new ExchangeRate();}return self::$instance;}public function addObserver(Observer $obj){$this->observer[] = $obj;}public function setExchageRate($new_rate){$this->exchange_rate = $new_date;$this->notify();}public function notify(){foreach($this->observer as $obj){$obj->update($this);}}} class Observer{private $observerName;public function __construct($observerName){$this->observerName = $observerName;ExchangeRate::instance()->addObserver($this);}public function update(ExchangeRate $obj){echo $this->observerName." update success!<br>";}}$p1 = new Observer("Tom");$p2 = new Observer("Jerry");ExchangeRate::instance()->setExchageRate(9.4);





原创粉丝点击