Laravel Fluent类分析

<?php namespace Laravel;

/**
 * 从一个数组中获得值 利用点符号
 *
 * <code>
 *		// 同$array['user']['name']
 *		$name = array_get($array, 'user.name');
 *
 *		// 返回默认的
 *		$name = array_get($array, 'user.name', 'Taylor');
 * </code>
 *
 * @param  array   $array
 * @param  string  $key
 * @param  mixed   $default
 * @return mixed
 */
function array_get($array, $key, $default = null)
{
	if (is_null($key)) return $array; # 关键字为空

	// To retrieve the array item using dot syntax, we'll iterate through
	// each segment in the key and look for that value. If it exists, we
	// will return it, otherwise we will set the depth of the array and
	// look for the next segment.
	foreach (explode('.', $key) as $segment) # 把$key分成数组 并且遍历
	{
		if ( ! is_array($array) or ! array_key_exists($segment, $array))
		{
			return value($default); # 不存在返回默认
		}

		$array = $array[$segment]; # 递归数组 第二次
	}

	return $array; # 获得默认值
}

/**
 * 包装值
 *
 * 如果是闭包,那么返回闭包值
 *
 * @param  mixed  $value
 * @return mixed
 */
function value($value)
{
	return (is_callable($value) and ! is_string($value)) ? call_user_func($value) : $value;
}

class Fluent {

	/**
	 * 属性数组
	 *
	 * @var array
	 */
	public $attributes = array();

	/**
	 * 创建一个新的Fluent容器实例
	 *
	 * <code>
	 *		带属性创建
	 *		$fluent = new Fluent(array('name' => 'Taylor'));
	 * </code>
	 *
	 * @param  array  $attributes
	 * @return void
	 */
	public function __construct($attributes = array())
	{
		foreach ($attributes as $key => $value)
		{
			$this->$key = $value;
		}
	}

	/**
	 * 获得属性
	 *
	 * @param  string  $attribute
	 * @param  mixed   $default
	 * @return mixed
	 */
	public function get($attribute, $default = null)
	{
		return array_get($this->attributes, $attribute, $default);
	}

	/**
	 * 处理动态设置属性
	 *
	 * <code>
	 *		// 流式设置属性值
	 *		$fluent->name('Taylor')->age(25);
	 *
	 *		// nullable()为布尔
	 *		$fluent->nullable()->name('Taylor');
	 * </code>
	 */
	public function __call($method, $parameters)
	{
		$this->$method = (count($parameters) > 0) ? $parameters[0] : true; # 只获取第一个

		return $this;
	}

	/**
	 * 动态获取值
	 */
	public function __get($key)
	{
		if (array_key_exists($key, $this->attributes))
		{
			return $this->attributes[$key];
		}
	}

	/**
	 * 动态设置值
	 */
	public function __set($key, $value)
	{
		$this->attributes[$key] = $value;
	}

	/**
	 * 动态判断是否有值
	 */
	public function __isset($key)
	{
		return isset($this->attributes[$key]);
	}

	/**
	 * 动态删除值
	 */
	public function __unset($key)
	{
		unset($this->attributes[$key]);
	}

}

这个只是一个包装类,进行了中间的包装。

posted @ 2013-04-26 15:47  snakevash  阅读(718)  评论(0编辑  收藏  举报