我们以这个立面为例:
File::get(someArgs);
如果我没有误会,一步一步(过度简化)的调用将是:
//static method invocation which are all extended from Facade class File::__callStatic(get,someArgs) //returns an instance of FileSystem File::resolveFacedeInstance('files') FileSystem->get(someArgs)
我在以下的方法File :: resolveFacadeInstance()下面的注释行中感到困惑:
protected static function resolveFacadeInstance($name) { if (is_object($name)) return $name; if (isset(static::$resolvedInstance[$name])) { return static::$resolvedInstance[$name]; } /** * The line that i'm confused about */ return static::$resolvedInstance[$name] = static::$app[$name]; }
我的问题是:
>如何将File :: $app甚至初始化或在Facade类中分配一个值
>如果File :: get()是被调用的Facade
static :: $app [$name]会解决我觉得Application [‘files’]
或Application->文件,这些文件依次调用Application-> __ get(‘files’),因为Application类中没有文件属性.
public function __get($key) { return $this[$key]; }
所以,你已经知道,通过__callStatic方法调用resolveFacadeInstance方法,通过Facade类和组件的Facade(即File extends Facade)扩展了Facade类.
新新新新新旗新新新旗新新旗新新旗新新旗新新旗新新旗新新旗旗新新旗旗新新旗旗新新旗旗新新旗旗新新旗新新新旗新新旗旗新新旗新新新旗新新旗旗新新旗新200新新旗旗新旗旗
$app = require_once __DIR__.'/../bootstrap/start.PHP';
所以在这个(bootstrap / start.PHP)文件中,你可以看到一些代码
// the first line,initiate the application $app = new Illuminate\Foundation\Application; // ... // ... // notice this line require $framework.'/Illuminate/Foundation/start.PHP'; // ... // last line return $app;
在这段代码片段中,需要$framework.’/ Illuminate / Foundation / start.PHP’;行开始执行Foundation / start.PHP文件,在这个文件中你可能会看到这样的东西
// ... Facade::clearResolvedInstances(); // Notice this line Facade::setFacadeApplication($app);
这个(给出以上)行将应用程序设置到Facade类中的$app属性
// support/Facades/Facade.PHP public static function setFacadeApplication($app) { static::$app = $app; }
然后在底部的Foundation / start.PHP文件中,您可以看到这样的东西
/* |-------------------------------------------------------------------------- | Register The Core Service Providers |-------------------------------------------------------------------------- | | The Illuminate core service providers register all of the core pieces | of the Illuminate framework including session,caching,encryption | and more. It's simply a convenient wrapper for the registration. | */ $providers = $config['providers']; $app->getProviderRepository()->load($app,$providers); $app->boot();
在上面提供的代码片段中,框架注册的所有核心组件,并且您知道,每个组件都有一个服务提供程序类(即FilesystemServiceProvider),并且在每个服务提供程序类中都有一个方法寄存器(用于FilesystemServiceProvider)
/** * Register the service provider. * * @return void */ public function register() { $this->app['files'] = $this->app->share(function() { return new Filesystem; }); }
那么在这种情况下,这个$this-> app [‘files’]设置(返回新的Filesystem)一个匿名函数,它在执行时返回文件系统
$this->app['files'] = $this->app->share(function() { return new Filesystem; });
到$app [‘files’]所以,当你调用File :: get()时,它最终调用匿名函数,在这种情况下,下面的行
return static::$resolvedInstance[$name] = static::$app[$name];
调用static :: $app [‘file’]的函数;并且此函数返回实例,但在返回之前,它将实例存储在$resolvedInstance变量中,因此,下一次它可以从变量返回实例,而不再重新调用匿名函数.
新评新新新旗新新新旗新新新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新旗新旗新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新新新旗新新新旗新新旗新新旗新新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗新新旗旗新新旗新新旗200新新新旗新新旗新新200新新旗新新旗2001-
重要提示
X-45454545 X- 200 X- 200 200 X- 200 200 X- 200 200 X- 200 200 X- 200 200 X- 200 200 X- 200 200 X-
X-45454545 X- 200 X- 200 200 X- 200 200 X- 200 X- 200 200 X- 200: