当前位置: 首页 > 后端技术 > PHP

Laravel静态绑定与容器原理

时间:2023-03-29 16:16:02 PHP

1.PHP中的静态绑定“后期绑定”是指static::不再被解析为定义当前方法的类,而是在实际运行时计算的。也可以称为“静态绑定”,因为它可以用于(但不限于)静态方法调用。说白了就是哪个类调用了静态方法,静态方法就属于哪个类。2.Laravel中的静态绑定在laravel中可以用app()实例化一个容器,然后这个容器是单体的,在里面操作laravel的各种provider,events等等。代码跟踪查看其容器实现原理;先看app()方法,helpers.php在入口文件中加载到框架中;\vendor\laravel\framework\src\Illuminate\Foundation\helpers.php函数app($abstract=null,array$parameters=[]){if(is_null($abstract)){returnContainer::getInstance();}returnContainer::getInstance()->make($abstract,$parameters);从上面的代码我们可以看出,它主要运行的是Container类的静态方法getInstance。然后我们从入口文件public/index.php跟踪,看看哪里有setInstance,$app=require_once__DIR__.'/../bootstrap/app.php';bootstrap/app.php//实例化一个容器,这里是LARAVEL的核心,用这个不断调用laravl内部$app=newIlluminate\Foundation\Application($_ENV['APP_BASE_PATH']??dirname(__DIR__));\vendor\laravel\framework\src\Illuminate\Foundation\应用。PHP先看继承关系classApplicationextendsContainerimplementsApplicationContract,CachesConfiguration,CachesRoutes,HttpKernelInterface然后构造函数publicfunction__construct($basePath=null){if($basePath){$this->setBasePath($basePath);}$this->registerBaseBindings();$this->registerBaseServiceProviders();$this->registerCoreContainerAliases();}基本绑定$this->registerBaseBindings();protectedfunctionregisterBaseBindings(){static::setInstance($this);//父类静态方法,这里父类是Container$this->instance('app',$this);$this->instance(Container::class,$this);$this->singleton(Mix::class);$this->singleton(PackageManifest::class,function(){returnnewPackageManifest(newFilesystem,$this->basePath(),$this->getCachedPackagesPath());});}}参见vendor\laravel\framework\src\Illuminate\Container\Container.phppublicstaticfunctionsetInstance(ContainerContract$container=null){returnstatic::$instance=$container;}看到这里,在这个文件中再次查看getInstance方法publicstaticfunctiongetInstance(){if(is_null(static::$instance)){static::$instance=newstatic;//实例化应用}returnstatic::$实例;到这里,整个laravl容器实例化过程就完成了,主要是依靠静态绑定的方式来加强应用。