<?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]);
}
}
这个只是一个包装类,进行了中间的包装。