_class('BuilderPizza', array(_protected('_pizza'), _public('getPizza', function () { return _this('_pizza'); }), _public('createNewPizza', function () { _this('_pizza', _new('Pizza')); }), _public('buildPastry', function () { }), _public('buildSauce', function () { }), _public('buildGarniture', function () { }))); _class('BuilderPizzaHawaii', _extends('BuilderPizza'), array(_public('buildPastry', function () { _call(_this('_pizza'), 'setPastry', 'normal'); }), _public('buildSauce', function () { _call(_this('_pizza'), 'setSauce', 'soft'); }), _public('buildGarniture', function () { _call(_this('_pizza'), 'setGarniture', 'jambon+ananas'); }))); _class('BuilderPizzaSpicy', _extends('BuilderPizza'), array(_public('buildPastry', function () { _call(_this('_pizza'), 'setPastry', 'puff'); }), _public('buildSauce', function () { _call(_this('_pizza'), 'setSauce', 'hot'); }), _public('buildGarniture', function () { _call(_this('_pizza'), 'setGarniture', 'pepperoni+salami'); }))); _class('PizzaBuilder', array(_private('_builderPizza'), _public('setBuilderPizza', function ($mp) { _this('_builderPizza', $mp); }), _public('getPizza', function () { return _call(_this('_builderPizza'), 'getPizza'); }), _public('constructPizza', function () { _call(_this('_builderPizza'), 'createNewPizza'); _call(_this('_builderPizza'), 'buildPastry'); _call(_this('_builderPizza'), 'buildSauce'); _call(_this('_builderPizza'), 'buildGarniture');
protected function _make_output($type, $message_name = NULL, $url = FALSE, array $data = [], $export_data = FALSE) { $msg = $message_name; if (!is_array($message_name)) { $msg = Lang::has($message_name) ? trans($message_name) : (Lang::has('core::common.' . $message_name) ? trans('core::common.' . $message_name) : []); is_string($msg) && ($msg = ['content' => $msg]); $default = trans('core::common.default.' . $type); $msg = _extends($msg, $default); //填充 } $default = trans('core::common.default.' . $type); $msg = _extends($msg, $default); if (!empty($data)) { foreach ($msg as &$value) { $value = __($value, $data); } //转化成有意义的文字 } $msg = array_keyfilter($msg, 'title,content'); $result = array('result' => $type, 'time' => time(), 'duration' => microtime(TRUE) - LARAVEL_START, 'uid' => $this->user['id'], 'message' => $msg, 'url' => is_string($url) ? url($url) : $url, 'data' => $export_data ? $data : []); return $this->output($result); }
<?php include './class_lib.php'; _interface('MyInterface', array(_public('my_function'))); _interface('MySecondInterface', array(_public('my_second_function'))); _class('ParentClass', _implements('MyInterface'), array(_public('my_function', function () { return 'Hello, world'; }))); _class('SecondParentClass', _implements('MyInterface', 'MySecondInterface'), array(_public('my_function', function () { return 'Hello from ' . _self(); }), _public('my_second_function', function () { return 'World, hello!'; }))); _class('Child', _extends('SecondParentClass', 'ParentClass')); print_r(_call(_new('Child'), 'my_function')); // output: Hello, world print_r(_call(_new('Child'), 'my_second_function')); // output: World, hello!
/** * 以一个数组为基础,完善另外一个数组中没有的项目(并且会删除多余的项) * 优先以$arr_set的值为准,比如: * $set = array('k1' => 'v1','k5' => 'v2'); $base = array('k1' => 'default','k2' => 'default'); * 使用 _extends($set,$base);得到结果为 array('k1' => 'v1','k2' => 'default'); 故结果以$base为蓝本,但是$a里面原有的值不会覆盖 * [注意] 当$base中出现NULL时,默认匹配标量(NULL在PHP中属于非标量) * * @example 复杂的例子如: * $set = array( $base = array( * 'a' => array('e','a'), 'a' => array(), 使用$set['a'],有值,类型一致,均为非标量,($base['a']空数组,则表示$set['a']为数组即可) * 'b' => '2a', 'b' => 5, 使用$set['b'],有值,类型一致,均为标量 * 'c' => array('e','g'), 'c'=> 3, 使用$base['c'],因为类型不一致, * 'd' => NULL, 'd' => 5, 使用$base['c'],因为$set['c']为NULL, * 'e' => 123, 'e' => array(), 使用$base['e'],因为类型不一致,(虽然$base中为空数组,但是$set中类型不一致,仍然使用$base) * 'f' => '33', 使用$base['f'],因为无$set['f'] * 'g' => array('k' => '222'), 'g' => array('k' => '111'), 递归到子项,匹配规则同上 * ); ); * * @param array $arr_set 需要调整的数组 * @param array $arr_base 基础数组 * @return array 返回调整之后的结果 */ function _extends(&$arr_set, array &$arr_base) { $result = array(); if (is_array($arr_set)) { foreach ($arr_base as $k => $v) { $is_set = isset($arr_set[$k]); $is_array = $is_set && is_array($arr_set[$k]); $result[$k] = $v; //先设置默认值 if ($is_set) { if (is_array($v) && !empty($v)) { //base为数组并且非空 $result[$k] = _extends($arr_set[$k], $v); } elseif (is_null($v)) { is_scalar($arr_set[$k]) && ($result[$k] = $arr_set[$k]); } else { is_scalar($v) == is_scalar($arr_set[$k]) && ($result[$k] = $arr_set[$k]); } //如果base和set的类型一致,则使用set的值 } } } else { $result = $arr_base; } return $result; }