DIY 實現 ThinkPHP 核心框架 (十一)完善App 類

cn-five發表於2020-09-05

檢視程式碼,發現

\think\Container::get('app')->run()->send();

Containerget() 方法在執行時會建立自身例項。由於 App 類繼承自 Container ,呼叫 App 時就會在記憶體中出現 AppContainer 兩個容器例項,為了節約記憶體,提升程式碼的效率,只維持 App 的容器例項。修改程式碼如下

namespace think;

class App extends Container
{
    protected $init = false;

    // 進行初始化
    public function run()
    {
        $this->initialize();
        $controller = $this->make('\\app\\index\\controller\\Index');

        return Response::create($controller->index());
    }

    public function initialize()
    {
        // 避免重複初始化
        if ($this->init) {
            return;
        }
        $this->init = true;
        // 設定單例
        static::setInstance($this);
        // 將唯一容器例項儲存在 app 中
        $this->app = $this;
    }
}

同時在 Container 類中新增 setInstance() 方法

 public static function setInstance($instance)
    {
        static::$instance = $instance;
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章