欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

ThinkPHP容器之容器是如何返回實例的

這篇文章主要介紹ThinkPHP容器之容器是如何返回實例的,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯服務項目包括武川網站建設、武川網站制作、武川網頁制作以及武川網絡營銷策劃等。多年來,我們專注于互聯網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯網行業(yè)的解決方案,武川網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到武川省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

Container實例調用make方法

本文沒有太多文字解析,都在代碼注釋中說明了執(zhí)行過程。

代碼static::getInstance()返回了Container的實例后,就會去調用本類的make方法,接下來就是對make方法進行詳解了。

ThinkPHP容器之容器是如何返回實例的在開始閱讀make方法里邊的源碼之前,我們需要先對幾個屬性進行簡單的梳理一下。

這四個屬性一定要有點印象,并且一定要區(qū)別instance和instances。

這倆個屬性一個是單例模式返回當前類的實例,一個是容器中的所有的實例。

ThinkPHP容器之容器是如何返回實例的第一次執(zhí)行結果

   /**     * 創(chuàng)建類的實例     * @access public     * @param  string        $abstract       類名或者標識     * @param  array|true    $vars           變量     * @param  bool          $newInstance    是否每次創(chuàng)建新的實例     * @return object     */    public function make($abstract, $vars = [], $newInstance = false)    {        // 判斷$vars這個變量是否為true        if (true === $vars) {            // 總是創(chuàng)建新的實例化對象            $newInstance = true;            $vars        = [];        }        // app  這里就是在容器別名里獲取傳遞過來的app    如果沒有則就是app        $abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;                // 從容器實例中獲取  如果存在則直接返回對應的實例  也就是使用注冊樹模式        if (isset($this->instances[$abstract]) && !$newInstance) {            return $this->instances[$abstract];        }        // think\App 從容器標識中獲取        if (isset($this->bind[$abstract])) {            // 將think\App 復制給$concrete變量            $concrete = $this->bind[$abstract];            // 用于代表匿名函數的類  判斷是不是閉包            if ($concrete instanceof Closure) {                $object = $this->invokeFunction($concrete, $vars);            } else {                // $this->name['app'] = think\App                $this->name[$abstract] = $concrete;                // 在執(zhí)行一次本類的make方法,也就是本方法                return $this->make($concrete, $vars, $newInstance);            }        } else {            $object = $this->invokeClass($abstract, $vars);        }        if (!$newInstance) {            $this->instances[$abstract] = $object;        }        return $object;    }

這是第二次執(zhí)行流程

    public function make($abstract, $vars = [], $newInstance = false)    {        // 判斷$vars這個變量是否為true        if (true === $vars) {            // 總是創(chuàng)建新的實例化對象            $newInstance = true;            $vars        = [];        }        // app  這里就是在容器別名里獲取傳遞過來的app    如果沒有則就是app        // 第二次執(zhí)行時 $abstract = think\App        $abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;        // 從容器實例中獲取  如果存在則直接返回對應的實例  也就是使用注冊樹模式        if (isset($this->instances[$abstract]) && !$newInstance) {            return $this->instances[$abstract];        }        // think\App 從容器標識中獲取        // 第二次執(zhí)行$this->bind['think\App']不存在走else        if (isset($this->bind[$abstract])) {            // 將think\App 復制給$concrete變量            $concrete = $this->bind[$abstract];            // 用于代表匿名函數的類  判斷是不是閉包            if ($concrete instanceof Closure) {                $object = $this->invokeFunction($concrete, $vars);            } else {                // $this->name['app'] = think\App                $this->name[$abstract] = $concrete;                // 在執(zhí)行一次本類的make方法,也就是本方法                // think\App                return $this->make($concrete, $vars, $newInstance);            }        } else {            // think\App            $object = $this->invokeClass($abstract, $vars);        }        if (!$newInstance) {            // 把創(chuàng)建的容器存起來            //$this->instances['think\App'] = $object;            $this->instances[$abstract] = $object;        }        return $object;    }
public function invokeClass($class, $vars = [])    {        try {            /**             * ReflectionClass Object                (                [name] => think\App                )             */            // 這里就是之前文章提到的反射            $reflect = new ReflectionClass($class);            if ($reflect->hasMethod('__make')) {                $method = new ReflectionMethod($class, '__make');                if ($method->isPublic() && $method->isStatic()) {                    $args = $this->bindParams($method, $vars);                    return $method->invokeArgs(null, $args);                }            }            // 通過反射獲取think\App的構造函數            $constructor = $reflect->getConstructor();            $args = $constructor ? $this->bindParams($constructor, $vars) : [];            // 從給出的參數創(chuàng)建一個新的類實例            return $reflect->newInstanceArgs($args);        } catch (ReflectionException $e) {            throw new ClassNotFoundException('class not exists: ' . $class, $class);        }    }

執(zhí)行流程圖

既然把代碼都理清楚了,這時來理一下執(zhí)行的流程圖可以看的更清晰。

以上是“ThinkPHP容器之容器是如何返回實例的”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯行業(yè)資訊頻道!

網頁名稱:ThinkPHP容器之容器是如何返回實例的
文章分享:http://aaarwkj.com/article4/igspie.html

成都網站建設公司_創(chuàng)新互聯,為您提供網頁設計公司、標簽優(yōu)化、自適應網站、微信公眾號、全網營銷推廣、App設計

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都app開發(fā)公司
欧美日韩在线一区二区| 极品性感尤物少妇粉嫩逼| 熟女肥臀一区二区三区| 久久一区二区视频在线观看| 狼人私人影院在线观看| 日本一区二区在线高清| 日韩av熟女中文字幕| 精品国产91乱码一区二区三区| 中文字幕精品一区二区三区精品 | 欧美亚洲一区二区三区精品| 国产又猛又黄又爽无遮挡| 色噜噜人妻av中文字幕| 日韩精品在线不卡一区| 伊人性伊人情亚洲综合| 日本免费一区二区三区视频观看| 人妻少妇性色精品专区av| 国产精品美女露脸av毛片| 日本免费一区二区在线视频| 成人免费视频一区二区三区| 日韩精品欧美精品一区二区| 国产欧洲日本一区二区| 国产精品一区在线免费看| 国产三级精品三线在线观看| 日韩中文不卡人成在线视频| 漂亮人妻少妇中文字幕| 女人裸体网站无遮挡午夜| 午夜福利福利一区二区| 日韩商清av毛片网站| 久久这里只有精品蜜桃| 亚洲男人av天堂东京热| 亚洲香蕉视频在线播放| 饥渴少妇高潮特殊按摩| 国产又黄又粗的视频| 日本熟女中文字幕一区| 国产18成人午夜视频在线观看| 九九精品在线观看视频| 2004年亚洲中文字幕| 免费在线观看日韩av大片| 操老熟女一区二区三区| 99久久精品国产熟女| 国产中文字幕精品在线观看|