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);