日期:2014-05-16  浏览次数:21010 次

ArrayAccess 创建一个类数组对象

PS:原创文章,如需转载,请注明出处,谢谢! ????

本文地址:http://flyer0126.iteye.com/blog/1502576

?

/**
 * 单例模式实现类-->ArrayAccess(数组式访问)接口
 *
 * @author flyer0126
 * @since 2012/4/27
 */
class Single{

	private $name;
	private static $_Instance = null;
	
	private function __construct()
	{
	
	}
	
	static function load()
	{
		if(null == self::$_Instance)
		{
			self::$_Instance = new Single();
		}
		return self::$_Instance;
	}
	
	public function setName($name)
	{
		$this->name = $name;
	}
	
	public function getName()
	{
		return $this->name;
	}
}

$s = Single::load();
$s->setName("jack");
echo $s->getName(); //jack

// 调整一下(继承ArrayAccess && 实现4个方法)
class Single implements ArrayAccess
{

	private $name;
	private static $_Instance = null;
	
	private function __construct()
	{
		
	}
	
	static function load()
	{
		if(null == self::$_Instance)
		{
			self::$_Instance = new Single();
		}
		return self::$_Instance;
	}
	
	public function setName($name)
	{
		$this->name = $name;
	}
	
	public function getName()
	{
		return $this->name;
	}
	
	/**
       * 实现四个方法
       * offsetExists(),用于标识一个元素是否已定义
       * offsetGet(),用于返回一个元素的值
       * offsetSet(),用于为一个元素设置新值
       * offsetUnset(),用于删除一个元素和相应的值
      **/
	public function offsetSet($offset, $value) 
	{
		if (is_null($offset)) 
		{
			$this->container[] = $value;
		} 
		else 
		{
			$this->container[$offset] = $value;
		}
	}

	public function offsetGet($offset) 
	{
		return isset($this->container[$offset]) ? $this->container[$offset] : null;
	}

	public function offsetExists($offset) 
	{
		return isset($this->container[$offset]);
	}

	public function offsetUnset($offset) 
	{
		unset($this->container[$offset]);
	}
}

$s = Single::load();
$s->setName("jack");

$s["name"] = "mike";

echo $s->getName(); //jack
echo $s["name"]; //mike
print_r($s);
/**
Single Object
(
    [name:Single:private] => jack
    [container] => Array
        (
            [name] => mike
        )

)
**/

?

后述:
ArrayAccess(数组式访问)接口 提供像访问数组一样访问对象的能力的接口。
OO实现逻辑的封装,而当这种封装对我们已有的逻辑调用方式产生变更时,可以利用这种方式进行巧妙转变。

?