<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] * * * * * ## 1 輸入輸出 ### 0 輸入輸出概覽 ![](https://box.kancloud.cn/2016-03-16_56e9270eb3e7b.jpg) ### 1 Url輸入 Url是客戶端對服務器/應用業務的請求 通過路由解析生成對應用業務的請求 普通輸入數據側重于在應用業務中的操作 Url輸入側重于對應用業務的請求連接 ### 2 狹義的數據輸入輸出 >[info] 1 客戶端的數據輸入 瀏覽器/APP等發送給服務器的數據 >[info] 2 輸出數據到客戶端 服務器響應發送給瀏覽器/APP的數據 ### 3 廣義的數據輸入輸出 >[info] 1 狹義的輸入輸出 * * * * * >[info] 2 廣義輸入: (應用業務中可用) 服務器/框架變量 日志/緩存/數據庫數據 * * * * * >[info] 3 廣義輸出: (應用業務輸出數據) 日志/緩存記錄 模板/數據庫數據 ## 2 Url輸入 思路見 [心:url路由詳解](http://www.hmoore.net/zmwtp/tp5/127349) ## 3 輸入讀取 ### 輸入數據的讀取:think\Input.php >[info] 輸入數據讀取核心函數 data() **data()在其他類型輸入數據讀取函數中調用** `public static function data($input, $name = '', $default = null, $filter = null, $merge = false)` > $input:輸入數據源 > $name:輸入數據鍵名 > $default:默認輸入數據值 > $filter:輸入數據過濾器 > $merge:輸入數據是否合并 ~~~ if (0 === strpos($name, '?')) { return self::has(substr($name, 1), $input); } ~~~ 如果$name包含?,則調用self::has()檢查是否有輸入數據鍵名。 `if (!empty($input)) {}else{}` 檢查輸入數據源, 如果輸入數據源為不為空,讀取輸入數據 如果輸入數據源為空,返回默認值$default `$data = $input;` 將$input數據源放入到$data變量,避免影響數據源 `$name = (string) $name;` 將$name鍵名轉換為字符串 `list($name, $type) = static::parseName($name);` 調用self::parseName()將$name解析到$name,$type變量中 `foreach (explode('.', $name) as $val) {}` 將$name以符號"."分割為數組,并遍歷鍵名。 ~~~ if (isset($data[$val])) { $data = $data[$val]; } ~~~ 如果輸入數據源$data中有對應鍵名$val。 獲取對應數據$data[$val]并保存到$data, **這里是多維數據讀取的一個技巧** ~~~ else { return $default; } ~~~ 如果輸入數據源$data中沒有對應鍵名$val 返回默認值$dafault `$filters = static::parseFilter($filter, $merge);` 調用self::parseFilter()生成數據解析器$filter ~~~ $filters[] = $default; ~~~ 添加$dafault到過濾器中。 ~~~ if (is_array($data)) { array_walk_recursive($data, 'self::filter', $filters); } else { self::filter($data, $name ?: 0, $filters); } ~~~ 對輸入數據源$data進行過濾$filter處理 ~~~ if (isset($type) && $data !== $default) { static::typeCast($data, $type); } ~~~ 如果$name中解析到$type參數, 則調用self::typeCast()進行類型轉換 ~~~ else { $data = $default; } ~~~ 數據源$input為空時,返回默認值 ~~~ return $data; ~~~ 返回獲取的數據, 由此可知$name為空時, 返回過濾后的數據源$input * * * * * >[info] 狹義輸入數據讀取操作(調用self::data()讀取對應數據): get() post() put() delete() param() request() session() cookie() `$_GET數據讀取:public static function get($name = '', $default = null, $filter = null, $merge = false)` `$_POST數據讀取:public static function post($name = '', $default = null, $filter = null, $merge = false)` `$_PUT數據讀取:public static function put($name = '', $default = null, $filter = null, $merge = false)` `$_DELETE數據讀取:public static function delete($name = '', $default = null, $filter = null, $merge = false)` `多功能數據讀取:public static function param($name = '', $default = null, $filter = null, $merge = false)` `$_REQUEST數據讀取:public static function request($name = '', $default = null, $filter = null, $merge = false)` `上傳文件$_FILE數據讀取:public static function file($name = '', $default = null, $filter = null, $merge = false)` `$_SESSION數據讀取:public static function session($name = '', $default = null, $filter = null, $merge = false)` `$_COOKIE數據讀取:public static function cookie($name = '', $default = null, $filter = null, $merge = false)` * * * * * >[info] 廣義輸入數據讀取操作(調用self::data()讀取對應數據): server() globals() env() path() `$_SERVER數據讀取:public static function server($name = '', $default = null, $filter = null, $merge = false)` `$GLOBALS數據讀取:public static function globals($name = '', $default = null, $filter = null, $merge = false)` `$_ENV數據讀取:public static function env($name = '', $default = null, $filter = null, $merge = false)` `PATH_INFO數據讀取:public static function path($name = '', $default = null, $filter = null, $merge = false)` > $name:輸入數據鍵名 > $default:輸入數據默認值 > $filter:輸入數據過濾處理 > $merge:輸入數據是否合并 * * * * * >[info] 其他操作 has() setFilter() filterExp() `檢查數據鍵名存在:public static function has($name, $data)` `設置數據過濾器:public static function setFilter($name)` `過濾表單表達式:public static function filterExp(&$value)` ### 服務器/框架變量 >[info] 服務器全局變量:直接使用變量名即可 ~~~ MODULE_NAME CONTROLLER_NAME ~~~ >[info] 服務器配置讀取:think\Config::get() ~~~ Config::get() ~~~ ## 4 輸出數據 ### 輸出數據到客戶端 think\Response.php >[info] 數據輸出操作 `發送字符串數據到客戶端:public static function send($data = '', $type = '', $return = false)` > $data:待組合的數據 > $type:數據組合格式 > $return:數據返回還是輸出 `$type = strtolower($type ?: self::$type);` 輸出數據類型解析 ~~~ $headers = [ 'json' => 'application/json', 'xml' => 'text/xml', 'html' => 'text/html', 'jsonp' => 'application/javascript', 'script' => 'application/javascript', 'text' => 'text/plain', ]; if (!headers_sent() && !headers_list() && isset($headers[$type])) { header('Content-Type:' . $headers[$type] . '; charset=utf-8'); } ~~~ 根據$type,設置輸出數據頭header中的Content-Type `$data = $data ?: self::$data;` 輸出數據準備 ~~~ if (is_callable(self::$tramsform)) { $data = call_user_func_array(self::$tramsform, [$data]); } ~~~ 檢查數據格式是否需要轉換 ~~~ switch ($type) { case 'json': $data = json_encode($data, JSON_UNESCAPED_UNICODE); break; case 'jsonp': $handler = !empty($_GET[Config::get('var_jsonp_handler')]) ? $_GET[Config::get('var_jsonp_handler')] : Config::get('default_jsonp_handler'); $data = $handler . '(' . json_encode($data, JSON_UNESCAPED_UNICODE) . ');'; break; case '': case 'html': case 'text': break; default: APP_HOOK && Hook::listen('return_data', $data); } ~~~ 根據$type合成不同的輸出字符串內容 ~~~ if ($return) { return $data; } ~~~ 檢查是否返回數據 `echo $data;` 輸出合成的字符串到客戶端 `self::isExit() && exit();` 檢查是否退出腳本 * * * * * `輸出API格式數據到客戶端:public static function result($data, $code = 0, $msg = '', $type = '')` > $data:待輸出數據 > $code:api狀態編碼 > $mmsg:輸出提示信息 > $type:輸出數據類型 ~~~ $result = [ 'code' => $code, 'msg' => $msg, 'time' => NOW_TIME, 'data' => $data, ]; ~~~ 合成輸出數據 ~~~ if ($type) { self::type($type); } ~~~ 設置輸出數據類型 `return $result;` 返回api數據 * * * * * >[info] 輸出數據與格式設置 `設置待輸出數據:public static function data($data)` `設置數據轉換方法:public static function tramsform($callback)` `設置輸出數據格式:public static function type($type = null)` `設置腳本是否終止:public static function isExit($exit = null)` >[info] 根據狀態輸出 `輸出成功信息:public static function success($msg = '', $data = '', $url = null, $wait = 3)` `輸出錯誤信息:public static function error($msg = '', $data = '', $url = null, $wait = 3)` `跳轉指定鏈接:public static function redirect($url, $params = [])` * * * * * ### 輸出生成模板:think\View.php 思路見 [模板詳解](http://www.hmoore.net/zmwtp/tp5/127351) * * * * * ### 輸出生成日志:think\Log.php 思路見 [日志詳解](http://www.hmoore.net/zmwtp/tp5/127953) * * * * * ### 輸出生成緩存:think\Cache.php 思路見 [緩存詳解](http://www.hmoore.net/zmwtp/tp5/127954) * * * * * ### 輸出數據到數據庫:think\Model.php 思路見 [模型詳解](http://www.hmoore.net/zmwtp/tp5/127352) * * * * * ## 5 框架輸入輸出示例 >[info] 調用Input::filterExp()過濾輸入數據 ~~~ thinkphp\start.php: private static function bindParams($reflect, $vars) { $args = []; $type = key($vars) === 0 ? 1 : 0; if ($reflect->getNumberOfParameters() > 0) { $params = $reflect->getParameters(); foreach ($params as $param) { $name = $param->getName(); if (1 == $type && !empty($vars)) { $args[] = array_shift($vars); } elseif (0 == $type && isset($vars[$name])) { $args[] = $vars[$name]; } elseif ($param->isDefaultValueAvailable()) { $args[] = $param->getDefaultValue(); } else { throw new Exception('method param miss:' . $name, 10004); } } array_walk_recursive($args, 'think\\Input::filterExp'); } return $args; } ~~~ >[info] 調用Response::send()輸出數據到客戶端。 ~~~ public static function run() { .... switch (self::$dispatch['type']) { case 'redirect': header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': $data = self::module(self::$dispatch['module'], $config); break; case 'controller': $data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'method': $data = self::invokeMethod(self::$dispatch['method'], self::$dispatch['params']); break; case 'function': $data = self::invokeFunction(self::$dispatch['function'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } APP_HOOK && Hook::listen('app_end', $data); if (Config::get('response_auto_output')) { return Response::send($data, Response::type(), Config::get('response_return')); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看