public function testObject() { $obj = new stdClass(); $obj->zero = 0; $obj->zero_float = 0.0; $obj->zero_str = '0'; $obj->a = 'a'; $obj->array = ['a', 'b', 'c']; $obj2 = new stdClass(); $obj2->b = 'b'; $obj2->c = 'c'; $obj->obj = $obj2; $this->assertEquals($obj->a, depth_query($obj, 'a')); $this->assertEquals($obj->zero, depth_query($obj, 'zero')); $this->assertEquals($obj->array[0], depth_query($obj, 'array->0')); $this->assertEquals($obj->obj->b, depth_query($obj, 'obj->b')); $this->assertEquals($obj->zero_str, depth_query($obj, '->zero_str')); $this->assertEquals($obj->zero_float, depth_query($obj, '->zero_float->what')); }
/** * 文本字符替换(函数命名源自Mootools)。 * * *原本作为Utils\String包里面的函数,现在将他提取到Common中。* * * ```php * // 基本的使用 * $str = '你好,{name}!'; * $args = ['name' => 'kephp']; * substitute($str, $args); // '你好,kephp!' * * // 如果变量不存在的话: * $str = '你好,{name}!今天是星期{weekDay}。'; * substitute($str, $args); // '你好,kephp!今天是星期。' * * // 他会循环检查 * $str = '你好,{name}!{tail}'; * $args = [ * 'name' => 'kephp', * 'weekDay' => '六', * 'tail' => '今天是星期{weekDay}。', * ]; * * substitute($str, $args); // '你好,kephp!今天是星期六。' * * // 指定第三个参数,可以取得这次文本替换过程中所匹配到的keywords和对应的变量内容 * substitute($str, $args, $matches); // matches将会包含: name, weekDay, tail * ``` * * 本函数支持多层数组、对象的深度查询 * * ```php * $str = '你好,{name}!{tail}{template}'; * $args = [ * 'name' => 'kephp', * 'message' => [ * 'title' => '认识你很高兴!', * 'content' => '我想了解更多的讯息!', * ], * 'template' => '<h1>{message->title}</h1><div>{message->content}</div>', * 'weekDay' => '六', * 'tail' => '今天是星期{weekDay}。', * ]; * substitute($str, $args); * // 返回:你好,kephp!今天是星期六。<h1>认识你很高兴!</h1><div>我想了解更多的讯息!</div> * ``` * * 第四个参数`$regex`,允许设定你自定义的变量的正则匹配表达式。 * * @param string $str * @param array $args * @param string $regex * @param array $matches * @return string */ function substitute(string $str, array $args = [], array &$matches = [], $regex = '#\\{([^\\{\\}\\r\\n]+)\\}#') : string { if (empty($str)) { return ''; } if (empty($args)) { // 没有参数,就表示无需替换了 return $str; } if (empty($regex)) { $regex = '#\\{([^\\{\\}\\r\\n]+)\\}#'; } if (preg_match($regex, $str)) { $str = preg_replace_callback($regex, function ($m) use($args, &$matches) { $key = $m[1]; $matches[$key] = ''; // give a default empty string if (isset($args[$key]) || isset($args->{$key})) { $matches[$key] = $args[$key]; } else { $matches[$key] = depth_query($args, $key, ''); } return $matches[$key]; }, $str); return substitute($str, $args, $matches, $regex); } return $str; }
/** * 查询并取回当前Uri的QueryString某个key的值 * * 该函数允许深度查询 * * ```php * $uri->query('id'); // 有则返回id,没有则返回null * $uri->query('id', false); // 指定当id不存在时的默认返回值 * $uri->query('words->a'); // 深度查询 * ``` * * @param string|array $keys * @param null $default * @return mixed */ public function query($keys, $default = null) { if (isset($this->queryData[$keys])) { return $this->queryData[$keys]; } return depth_query($this->queryData, $keys, $default); }
public function getSecurityData($field = null, $default = null) { if (!$this->securityPrepared) { $this->prepareSecurity(); } if (isset($field)) { if (isset($this->securityData[$field])) { $value = $this->securityData[$field]; } else { $value = depth_query($this->securityData, $field, $default); } $value = trim($value); return $value; } return $this->securityData; }
public function cookie($keys = null, $default = null) { if (empty($keys)) { return $this->cookies; } // if (isset($this->cookies[$keys])) // return $this->cookies[$keys]; return depth_query($this->cookies, $keys, $default); }