search
HomeBackend DevelopmentPHP Tutorialyii2 source code study notes (9), yii2 source code study notes_PHP tutorial

yii2源码学习笔记(九),yii2源码学习笔记

Application是所有应用程序类的基类,接下来了解一下它的源码。yii2\base\Application.php。

<span>  1</span> <?<span>php
</span><span>  2</span> <span>/*</span><span>*
</span><span>  3</span> <span> * @link </span><span>http://www.yiiframework.com/</span>
<span>  4</span> <span> * @copyright Copyright (c) 2008 Yii Software LLC
</span><span>  5</span> <span> * @license </span><span>http://www.yiiframework.com/license/</span>
<span>  6</span>  <span>*/</span>
<span>  7</span> 
<span>  8</span> <span>namespace</span> yii\<span>base</span><span>;
</span><span>  9</span> 
<span> 10</span> <span>use Yii;
</span><span> 11</span> 
<span> 12</span> <span>/*</span><span>*
</span><span> 13</span> <span> * Application is the base class for all application classes.
</span><span> 14</span> <span> * 是所有应用程序类的基类
</span><span> 15</span> <span> * @property \yii\web\AssetManager $assetManager The asset manager application component. This property is
</span><span> 16</span> <span> * read-only.资产管理器应用组件,只读
</span><span> 17</span> <span> * @property \yii\rbac\ManagerInterface $authManager The auth manager application component. Null is returned
</span><span> 18</span> <span> * if auth manager is not configured. This property is read-only.认证管理器应用程序组件。未配置返回null,只读
</span><span> 19</span> <span> * @property string $basePath The root directory of the application. 应用程序的根目录。
</span><span> 20</span> <span> * @property \yii\caching\Cache $cache The cache application component. Null if the component is not enabled.
</span><span> 21</span> <span> * This property is read-only.缓存应用程序组件。
</span><span> 22</span> <span> * @property \yii\db\Connection $db The database connection. This property is read-only.数据库连接。
</span><span> 23</span> <span> * @property \yii\web\ErrorHandler|\yii\console\ErrorHandler $errorHandler The error handler application
</span><span> 24</span> <span> * component. This property is read-only.错误处理程序应用程序组件
</span><span> 25</span> <span> * @property \yii\i18n\Formatter $formatter The formatter application component. This property is read-only.
</span><span> 26</span> <span> * 格式化程序的应用程序组件。
</span><span> 27</span> <span> * @property \yii\i18n\I18N $i18n The internationalization application component. This property is read-only.
</span><span> 28</span> <span> * 国际化应用组件。
</span><span> 29</span> <span> * @property \yii\log\Dispatcher $log The log dispatcher application component. This property is read-only.
</span><span> 30</span> <span> * 日志调度程序组件。
</span><span> 31</span> <span> * @property \yii\mail\MailerInterface $mailer The mailer application component. This property is read-only.
</span><span> 32</span> <span> * 邮件应用程序组件。
</span><span> 33</span> <span> * @property \yii\web\Request|\yii\console\Request $request The request component. This property is read-only.
</span><span> 34</span> <span> * 请求组件。
</span><span> 35</span> <span> * @property \yii\web\Response|\yii\console\Response $response The response component. This property is
</span><span> 36</span> <span> * read-only.反应元件。
</span><span> 37</span> <span> * @property string $runtimePath The directory that stores runtime files. Defaults to the "runtime"
</span><span> 38</span> <span> * subdirectory under [[basePath]].存储运行时文件的目录。
</span><span> 39</span> <span> * @property \yii\base\Security $security The security application component. This property is read-only.
</span><span> 40</span> <span> * 安全应用组件。
</span><span> 41</span> <span> * @property string $timeZone The time zone used by this application.该应用程序使用的时区。
</span><span> 42</span> <span> * @property string $uniqueId The unique ID of the module. This property is read-only.模块的唯一标识。
</span><span> 43</span> <span> * @property \yii\web\UrlManager $urlManager The URL manager for this application. This property is read-only.
</span><span> 44</span> <span> * 此应用程序的网址管理器。
</span><span> 45</span> <span> * @property string $vendorPath The directory that stores vendor files. Defaults to "vendor" directory under
</span><span> 46</span> <span> * [[basePath]].存储供应商文件的目录。
</span><span> 47</span> <span> * @property View|\yii\web\View $view The view application component that is used to render various view
</span><span> 48</span> <span> * files. This property is read-only.用于呈现各种视图文件的视图应用程序组件
</span><span> 49</span> <span> *
</span><span> 50</span> <span> * @author Qiang Xue <qiang.xue@gmail.com>
</span><span> 51</span> <span> * @since 2.0
</span><span> 52</span>  <span>*/</span>
<span> 53</span> <span>abstract</span> <span>class</span><span> Application extends Module
</span><span> 54</span> <span>{
</span><span> 55</span>     <span>/*</span><span>*
</span><span> 56</span> <span>     * @event Event an event raised before the application starts to handle a request.
</span><span> 57</span> <span>     * 在应用程序开始处理请求之前提出的事件。
</span><span> 58</span>      <span>*/</span>
<span> 59</span>     <span>const</span> EVENT_BEFORE_REQUEST = <span>'</span><span>beforeRequest</span><span>'</span><span>;
</span><span> 60</span>     <span>/*</span><span>*
</span><span> 61</span> <span>     * @event Event an event raised after the application successfully handles a request (before the response is sent out).
</span><span> 62</span> <span>     * 该应用程序成功处理请求后提出的事件
</span><span> 63</span>      <span>*/</span>
<span> 64</span>     <span>const</span> EVENT_AFTER_REQUEST = <span>'</span><span>afterRequest</span><span>'</span><span>;
</span><span> 65</span>     <span>/*</span><span>*
</span><span> 66</span> <span>     * Application state used by [[state]]: application just started.
</span><span> 67</span> <span>     * [[state]]适用状态:刚开始应用
</span><span> 68</span>      <span>*/</span>
<span> 69</span>     <span>const</span> STATE_BEGIN = <span>0</span><span>;
</span><span> 70</span>     <span>/*</span><span>*
</span><span> 71</span> <span>     * Application state used by [[state]]: application is initializing.
</span><span> 72</span> <span>     *  [[state]]应用程序状态:应用程序初始化。
</span><span> 73</span>      <span>*/</span>
<span> 74</span>     <span>const</span> STATE_INIT = <span>1</span><span>;
</span><span> 75</span>     <span>/*</span><span>*
</span><span> 76</span> <span>     * Application state used by [[state]]: application is triggering [[EVENT_BEFORE_REQUEST]].
</span><span> 77</span> <span>     *  [[state]]应用程序状态:应用触发[[EVENT_BEFORE_REQUEST]]
</span><span> 78</span>      <span>*/</span>
<span> 79</span>     <span>const</span> STATE_BEFORE_REQUEST = <span>2</span><span>;
</span><span> 80</span>     <span>/*</span><span>*
</span><span> 81</span> <span>     * Application state used by [[state]]: application is handling the request.
</span><span> 82</span> <span>     *  [[state]]应用程序状态:应用程序处理请求。
</span><span> 83</span>      <span>*/</span>
<span> 84</span>     <span>const</span> STATE_HANDLING_REQUEST = <span>3</span><span>;
</span><span> 85</span>     <span>/*</span><span>*
</span><span> 86</span> <span>     * Application state used by [[state]]: application is triggering [[EVENT_AFTER_REQUEST]]..
</span><span> 87</span> <span>     *  [[state]]应用程序状态:应用触发[[EVENT_AFTER_REQUEST]]
</span><span> 88</span>      <span>*/</span>
<span> 89</span>     <span>const</span> STATE_AFTER_REQUEST = <span>4</span><span>;
</span><span> 90</span>     <span>/*</span><span>*
</span><span> 91</span> <span>     * Application state used by [[state]]: application is about to send response.
</span><span> 92</span> <span>     *  [[state]]应用程序状态:应用程序即将发送响应。
</span><span> 93</span>      <span>*/</span>
<span> 94</span>     <span>const</span> STATE_SENDING_RESPONSE = <span>5</span><span>;
</span><span> 95</span>     <span>/*</span><span>*
</span><span> 96</span> <span>     * Application state used by [[state]]: application has ended.
</span><span> 97</span> <span>     *  [[state]]应用程序状态:应用程序结束。
</span><span> 98</span>      <span>*/</span>
<span> 99</span>     <span>const</span> STATE_END = <span>6</span><span>;
</span><span>100</span> 
<span>101</span>     <span>/*</span><span>*
</span><span>102</span> <span>     * @var string the namespace that controller classes are located in.控制器类的命名空间位置。
</span><span>103</span> <span>     * This namespace will be used to load controller classes by prepending it to the controller class name.
</span><span>104</span> <span>     * The default namespace is `app\controllers`.
</span><span>105</span> <span>     * 此命名空间将用于负载控制器类重写它的控制器类的名字。 默认命名空间是`app\controllers`。
</span><span>106</span> <span>     * Please refer to the [guide about class autoloading](guide:concept-autoloading.md) for more details.
</span><span>107</span>      <span>*/</span>
<span>108</span>     <span>public</span> $controllerNamespace = <span>'</span><span>app\\controllers</span><span>'</span><span>;
</span><span>109</span>     <span>/*</span><span>*
</span><span>110</span> <span>     * @var string the application name.应用程序名称。
</span><span>111</span>      <span>*/</span>
<span>112</span>     <span>public</span> $name = <span>'</span><span>My Application</span><span>'</span><span>;
</span><span>113</span>     <span>/*</span><span>*
</span><span>114</span> <span>     * @var string the version of this application.此应用程序的版本。
</span><span>115</span>      <span>*/</span>
<span>116</span>     <span>public</span> $version = <span>'</span><span>1.0</span><span>'</span><span>;
</span><span>117</span>     <span>/*</span><span>*
</span><span>118</span> <span>     * @var string the charset currently used for the application.目前使用的字符集。
</span><span>119</span>      <span>*/</span>
<span>120</span>     <span>public</span> $charset = <span>'</span><span>UTF-8</span><span>'</span><span>;
</span><span>121</span>     <span>/*</span><span>*
</span><span>122</span> <span>     * @var string the language that is meant to be used for end users. It is recommended that you
</span><span>123</span> <span>     * use [IETF language tags](</span><span>http://en.wikipedia.org/wiki/IETF_language_tag</span><span>). For example, `en` stands
</span><span>124</span> <span>     * for English, while `en-US` stands for English (United States).
</span><span>125</span> <span>     * 用来作为终端用户使用的语言
</span><span>126</span> <span>     * @see sourceLanguage
</span><span>127</span>      <span>*/</span>
<span>128</span>     <span>public</span> $language = <span>'</span><span>en-US</span><span>'</span><span>;
</span><span>129</span>     <span>/*</span><span>*
</span><span>130</span> <span>     * @var string the language that the application is written in. This mainly refers to
</span><span>131</span> <span>     * the language that the messages and view files are written in.
</span><span>132</span> <span>     * 应用程序编写的语言。
</span><span>133</span> <span>     * @see language
</span><span>134</span>      <span>*/</span>
<span>135</span>     <span>public</span> $sourceLanguage = <span>'</span><span>en-US</span><span>'</span><span>;
</span><span>136</span>     <span>/*</span><span>*
</span><span>137</span> <span>     * @var Controller the currently active controller instance当前活动控制器实例
</span><span>138</span>      <span>*/</span>
<span>139</span>     <span>public</span><span> $controller;
</span><span>140</span>     <span>/*</span><span>*
</span><span>141</span> <span>     * @var string|boolean the layout that should be applied for views in this application. Defaults to 'main'.
</span><span>142</span> <span>     * If this is false, layout will be disabled.
</span><span>143</span> <span>     * 该应用程序中应用的布局。
</span><span>144</span>      <span>*/</span>
<span>145</span>     <span>public</span> $layout = <span>'</span><span>main</span><span>'</span><span>;
</span><span>146</span>     <span>/*</span><span>*
</span><span>147</span> <span>     * @var string the requested route请求的路径    请求的路径
</span><span>148</span>      <span>*/</span>
<span>149</span>     <span>public</span><span> $requestedRoute;
</span><span>150</span>     <span>/*</span><span>*
</span><span>151</span> <span>     * @var Action the requested Action. If null, it means the request cannot be resolved into an action.
</span><span>152</span> <span>     * 操作所要求的行动
</span><span>153</span>      <span>*/</span>
<span>154</span>     <span>public</span><span> $requestedAction;
</span><span>155</span>     <span>/*</span><span>*
</span><span>156</span> <span>     * @var array the parameters supplied to the requested action.
</span><span>157</span> <span>     * 所请求的动作提供的参数。
</span><span>158</span>      <span>*/</span>
<span>159</span>     <span>public</span><span> $requestedParams;
</span><span>160</span>     <span>/*</span><span>*
</span><span>161</span> <span>     * @var array list of installed Yii extensions. Each array element represents a single extension
</span><span>162</span> <span>     * with the following structure:
</span><span>163</span> <span>     * 安装Yii扩展名列表。每个数组元素代表一个扩展
</span><span>164</span> <span>     *
</span><span>165</span> <span>     * ~~~
</span><span>166</span> <span>     * [
</span><span>167</span> <span>     *     'name' => 'extension name',
</span><span>168</span> <span>     *     'version' => 'version number',
</span><span>169</span> <span>     *     'bootstrap' => 'BootstrapClassName',  // optional, may also be a configuration array
</span><span>170</span> <span>     *     'alias' => [
</span><span>171</span> <span>     *         '@alias1' => 'to/path1',
</span><span>172</span> <span>     *         '@alias2' => 'to/path2',
</span><span>173</span> <span>     *     ],
</span><span>174</span> <span>     * ]
</span><span>175</span> <span>     * ~~~
</span><span>176</span> <span>     *
</span><span>177</span> <span>     * The "bootstrap" class listed above will be instantiated during the application
</span><span>178</span> <span>     * [[bootstrap()|bootstrapping process]]. If the class implements [[BootstrapInterface]],
</span><span>179</span> <span>     * its [[BootstrapInterface::bootstrap()|bootstrap()]] method will be also be called.
</span><span>180</span> <span>     *
</span><span>181</span> <span>     * If not set explicitly in the application config, this property will be populated with the contents of
</span><span>182</span> <span>     * 如果在应用程序配置中没有设置,该属性将填充到内容
</span><span>183</span> <span>     * @vendor/yiisoft/extensions.php`.
</span><span>184</span>      <span>*/</span>
<span>185</span>     <span>public</span><span> $extensions;
</span><span>186</span>     <span>/*</span><span>*
</span><span>187</span> <span>     * @var array list of components that should be run during the application [[bootstrap()|bootstrapping process]].
</span><span>188</span> <span>     * 组件的列表,运行在 [[bootstrap()|bootstrapping process]]中的应用
</span><span>189</span> <span>     * Each component may be specified in one of the following formats:
</span><span>190</span> <span>     *
</span><span>191</span> <span>     * - an application component ID as specified via [[components]].
</span><span>192</span> <span>     * - a module ID as specified via [[modules]].
</span><span>193</span> <span>     * - a class name.
</span><span>194</span> <span>     * - a configuration array.
</span><span>195</span> <span>     *
</span><span>196</span> <span>     * During the bootstrapping process, each component will be instantiated. If the component class
</span><span>197</span> <span>     * implements [[BootstrapInterface]], its [[BootstrapInterface::bootstrap()|bootstrap()]] method
</span><span>198</span> <span>     * will be also be called.
</span><span>199</span> <span>     * 在整个启动过程中,每个组件被实例化。如果组件类提到 [[BootstrapInterface]], 
</span><span>200</span> <span>     * [[BootstrapInterface::bootstrap()|bootstrap()]]方法也会调用
</span><span>201</span>      <span>*/</span>
<span>202</span>     <span>public</span> $bootstrap =<span> [];
</span><span>203</span>     <span>/*</span><span>*
</span><span>204</span> <span>     * @var integer the current application state during a request handling life cycle.
</span><span>205</span> <span>     * This property is managed by the application. Do not modify this property.    
</span><span>206</span> <span>     * 在请求处理生命周期中的当前应用程序状态。属性由应用程序管理。不要修改此属性。
</span><span>207</span>      <span>*/</span>
<span>208</span>     <span>public</span><span> $state;
</span><span>209</span>     <span>/*</span><span>*
</span><span>210</span> <span>     * @var array list of loaded modules indexed by their class names.
</span><span>211</span> <span>     * 加载模块列表由它们的类名称索引组成。
</span><span>212</span>      <span>*/</span>
<span>213</span>     <span>public</span> $loadedModules =<span> [];
</span><span>214</span> 
<span>215</span> 
<span>216</span>     <span>/*</span><span>*
</span><span>217</span> <span>     * Constructor.构造函数
</span><span>218</span> <span>     * @param array $config name-value pairs that will be used to initialize the object properties.
</span><span>219</span> <span>     * Note that the configuration must contain both [[id]] and [[basePath]].
</span><span>220</span> <span>     * 用来初始化对象属性的 name-value 注意配置必须包含[[id]] 和[[basePath]].
</span><span>221</span> <span>     * @throws InvalidConfigException if either [[id]] or [[basePath]] configuration is missing.
</span><span>222</span> <span>     * 如果是修改[[id]] 或[[basePath]] 则配置丢失。
</span><span>223</span>      <span>*/</span>
<span>224</span>     <span>public</span> function __construct($config =<span> [])
</span><span>225</span> <span>    {
</span><span>226</span>         Yii::$app = $<span>this</span>;<span>//</span><span> 将自身的实例绑到Yii的$app上</span>
<span>227</span>         $<span>this</span>->setInstance($<span>this</span>);<span>//</span><span> 将自身加入到loadedModules中</span>
<span>228</span> 
<span>229</span>         $<span>this</span>->state = self::STATE_BEGIN;<span>//</span><span> 设置状态为刚开始
</span><span>230</span> 
<span>231</span>         <span>//</span><span> 做预处理配置</span>
<span>232</span>         $<span>this</span>-><span>preInit($config);
</span><span>233</span> 
<span>234</span>         $<span>this</span>-><span>registerErrorHandler($config);
</span><span>235</span> 
<span>236</span> <span>        Component::__construct($config);
</span><span>237</span> <span>    }
</span><span>238</span> 
<span>239</span>     <span>/*</span><span>*
</span><span>240</span> <span>     * Pre-initializes the application. 初始化应用。
</span><span>241</span> <span>     * This method is called at the beginning of the application constructor.
</span><span>242</span> <span>     * It initializes several important application properties.
</span><span>243</span> <span>     * 在构造函数中调用该方法,用于初始化一些重要的属性
</span><span>244</span> <span>     * If you override this method, please make sure you call the parent implementation.
</span><span>245</span> <span>     * @param array $config the application configuration   应用的配置
</span><span>246</span> <span>     * @throws InvalidConfigException if either [[id]] or [[basePath]] configuration is missing.
</span><span>247</span>      <span>*/</span>
<span>248</span>     <span>public</span> function preInit(&<span>$config)
</span><span>249</span> <span>    {
</span><span>250</span>          <span>//</span><span> 使用了&符号,表示$config的修改会保留</span>
<span>251</span>         <span>if</span> (!isset($config[<span>'</span><span>id</span><span>'</span>])) {<span>//</span><span>判断配置中是否有application ID ,如果没有,抛出异常</span>
<span>252</span>             <span>throw</span> <span>new</span> InvalidConfigException(<span>'</span><span>The "id" configuration for the Application is required.</span><span>'</span><span>);
</span><span>253</span> <span>        }
</span><span>254</span>         <span>if</span> (isset($config[<span>'</span><span>basePath</span><span>'</span><span>])) {
</span><span>255</span>             <span>//</span><span> 是否配置项目的root路径</span>
<span>256</span>             $<span>this</span>->setBasePath($config[<span>'</span><span>basePath</span><span>'</span><span>]);
</span><span>257</span>              <span>//</span><span>赋值给模块的_basepath属性,并在设置后删除</span>
<span>258</span>             unset($config[<span>'</span><span>basePath</span><span>'</span><span>]);
</span><span>259</span>         } <span>else</span> {<span>//</span><span>否则抛出异常</span>
<span>260</span>             <span>throw</span> <span>new</span> InvalidConfigException(<span>'</span><span>The "basePath" configuration for the Application is required.</span><span>'</span><span>);
</span><span>261</span> <span>        }
</span><span>262</span>         <span>//</span><span>如果配置文件中设置了 vendorPath 使用配置的值,并在设置后删除,否则使用默认的</span>
<span>263</span>         <span>if</span> (isset($config[<span>'</span><span>vendorPath</span><span>'</span><span>])) {
</span><span>264</span>             $<span>this</span>->setVendorPath($config[<span>'</span><span>vendorPath</span><span>'</span><span>]);
</span><span>265</span>             unset($config[<span>'</span><span>vendorPath</span><span>'</span><span>]);
</span><span>266</span>         } <span>else</span><span> {
</span><span>267</span>             <span>//</span><span> set "@vendor"</span>
<span>268</span>             $<span>this</span>-><span>getVendorPath();
</span><span>269</span> <span>        }
</span><span>270</span>         <span>//</span><span>如果配置文件中设置了 runtimePath 使用配置的值,并在设置后删除,否则使用默认的</span>
<span>271</span>         <span>if</span> (isset($config[<span>'</span><span>runtimePath</span><span>'</span><span>])) {
</span><span>272</span>             $<span>this</span>->setRuntimePath($config[<span>'</span><span>runtimePath</span><span>'</span><span>]);
</span><span>273</span>             unset($config[<span>'</span><span>runtimePath</span><span>'</span><span>]);
</span><span>274</span>         } <span>else</span><span> {
</span><span>275</span>             <span>//</span><span> set "@runtime"</span>
<span>276</span>             $<span>this</span>-><span>getRuntimePath();
</span><span>277</span> <span>        }
</span><span>278</span>          <span>//</span><span>如果配置文件中设置了 timeZone 使用配置的值,并在设置后删除,否则使用默认的时区</span>
<span>279</span>         <span>if</span> (isset($config[<span>'</span><span>timeZone</span><span>'</span><span>])) {
</span><span>280</span>             $<span>this</span>->setTimeZone($config[<span>'</span><span>timeZone</span><span>'</span><span>]);
</span><span>281</span>             unset($config[<span>'</span><span>timeZone</span><span>'</span><span>]);
</span><span>282</span>         } elseif (!ini_get(<span>'</span><span>date.timezone</span><span>'</span><span>)) {
</span><span>283</span>             $<span>this</span>->setTimeZone(<span>'</span><span>UTC</span><span>'</span><span>);
</span><span>284</span> <span>        }
</span><span>285</span> 
<span>286</span>         <span>//</span><span> merge core components with custom components</span>
<span>287</span>         <span>foreach</span> ($<span>this</span>->coreComponents() <span>as</span> $id =><span> $component) {
</span><span>288</span>             <span>if</span> (!isset($config[<span>'</span><span>components</span><span>'</span><span>][$id])) {
</span><span>289</span>                 <span>//</span><span> 如果配置中没有配置相应的核心component,就赋给它</span>
<span>290</span>                 $config[<span>'</span><span>components</span><span>'</span>][$id] =<span> $component;
</span><span>291</span>             } elseif (is_array($config[<span>'</span><span>components</span><span>'</span>][$id]) && !isset($config[<span>'</span><span>components</span><span>'</span>][$id][<span>'</span><span>class</span><span>'</span><span>])) {
</span><span>292</span>                  <span>//</span><span> 如果存在相应的核心component,但没有定义它的class,就直接赋到class的key上</span>
<span>293</span>                 $config[<span>'</span><span>components</span><span>'</span>][$id][<span>'</span><span>class</span><span>'</span>] = $component[<span>'</span><span>class</span><span>'</span><span>];
</span><span>294</span> <span>            }
</span><span>295</span> <span>        }
</span><span>296</span> <span>    }
</span><span>297</span> 
<span>298</span>     <span>/*</span><span>*
</span><span>299</span> <span>     * @inheritdoc
</span><span>300</span>      <span>*/</span>
<span>301</span>     <span>public</span><span> function init()
</span><span>302</span> <span>    {
</span><span>303</span>         $<span>this</span>->state =<span> self::STATE_INIT;
</span><span>304</span>         $<span>this</span>-><span>bootstrap();
</span><span>305</span> <span>    }
</span><span>306</span> 
<span>307</span>     <span>/*</span><span>*
</span><span>308</span> <span>     * Initializes extensions and executes bootstrap components.初始化扩展并执行初始化程序组件
</span><span>309</span> <span>     * This method is called by [[init()]] after the application has been fully configured.
</span><span>310</span> <span>     * 该方法在应用完全配置后被[[init()]]调用
</span><span>311</span> <span>     * If you override this method, make sure you also call the parent implementation.
</span><span>312</span>      <span>*/</span>
<span>313</span>     <span>protected</span><span> function bootstrap()
</span><span>314</span> <span>    {
</span><span>315</span>         <span>if</span> ($<span>this</span>->extensions === <span>null</span>) {<span>//</span><span>如果没有配置,则调用Yii的默认扩展组件</span>
<span>316</span>             $file = Yii::getAlias(<span>'</span><span>@vendor/yiisoft/extensions.php</span><span>'</span><span>);
</span><span>317</span>             $<span>this</span>->extensions = is_file($file) ?<span> include($file) : [];
</span><span>318</span> <span>        }
</span><span>319</span>         <span>foreach</span> ($<span>this</span>->extensions <span>as</span><span> $extension) {
</span><span>320</span>             <span>if</span> (!empty($extension[<span>'</span><span>alias</span><span>'</span>])) {<span>//</span><span>如果扩展组件有设置别名</span>
<span>321</span>                 <span>foreach</span> ($extension[<span>'</span><span>alias</span><span>'</span>] <span>as</span> $name =><span> $path) {
</span><span>322</span>                     Yii::setAlias($name, $path);<span>//</span><span>将给扩展的别名注册到别名数组中</span>
<span>323</span> <span>                }
</span><span>324</span> <span>            }
</span><span>325</span>             <span>if</span> (isset($extension[<span>'</span><span>bootstrap</span><span>'</span>])) {<span>//</span><span>如果扩展组件有[[bootstrap]]配置 则初始化给扩展组件</span>
<span>326</span>                 $component = Yii::createObject($extension[<span>'</span><span>bootstrap</span><span>'</span><span>]);
</span><span>327</span>                 <span>if</span><span> ($component instanceof BootstrapInterface) {
</span><span>328</span>                     Yii::trace(<span>"</span><span>Bootstrap with </span><span>"</span> . get_class($component) . <span>'</span><span>::bootstrap()</span><span>'</span><span>, __METHOD__);
</span><span>329</span>                     $component->bootstrap($<span>this</span><span>);
</span><span>330</span>                 } <span>else</span><span> {
</span><span>331</span>                     Yii::trace(<span>"</span><span>Bootstrap with </span><span>"</span><span> . get_class($component), __METHOD__);
</span><span>332</span> <span>                }
</span><span>333</span> <span>            }
</span><span>334</span> <span>        }
</span><span>335</span> 
<span>336</span>         <span>foreach</span> ($<span>this</span>->bootstrap <span>as</span> $<span>class</span><span>) {
</span><span>337</span>             $component = <span>null</span><span>;
</span><span>338</span>             <span>if</span> (is_string($<span>class</span><span>)) {
</span><span>339</span>                 <span>if</span> ($<span>this</span>->has($<span>class</span><span>)) {
</span><span>340</span>                     $component = $<span>this</span>-><span>get</span>($<span>class</span><span>);
</span><span>341</span>                 } elseif ($<span>this</span>->hasModule($<span>class</span><span>)) {
</span><span>342</span>                     $component = $<span>this</span>->getModule($<span>class</span><span>);
</span><span>343</span>                 } elseif (strpos($<span>class</span>, <span>'</span><span>\\</span><span>'</span>) === <span>false</span><span>) {
</span><span>344</span>                     <span>throw</span> <span>new</span> InvalidConfigException(<span>"</span><span>Unknown bootstrapping component ID: $class</span><span>"</span><span>);
</span><span>345</span> <span>                }
</span><span>346</span> <span>            }
</span><span>347</span>             <span>if</span> (!isset($component)) {<span>//</span><span>如果不存在,则调用Yii创建对象</span>
<span>348</span>                 $component = Yii::createObject($<span>class</span><span>);
</span><span>349</span> <span>            }
</span><span>350</span> 
<span>351</span>             <span>if</span><span> ($component instanceof BootstrapInterface) {
</span><span>352</span>                 Yii::trace(<span>"</span><span>Bootstrap with </span><span>"</span> . get_class($component) . <span>'</span><span>::bootstrap()</span><span>'</span><span>, __METHOD__);
</span><span>353</span>                 $component->bootstrap($<span>this</span><span>);
</span><span>354</span>             } <span>else</span><span> {
</span><span>355</span>                 Yii::trace(<span>"</span><span>Bootstrap with </span><span>"</span><span> . get_class($component), __METHOD__);
</span><span>356</span> <span>            }
</span><span>357</span> <span>        }
</span><span>358</span>     }

未完待续。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1130670.htmlTechArticleyii2源码学习笔记(九),yii2源码学习笔记 Application是所有应用程序类的基类,接下来了解一下它的源码。yii2\base\Application.php。 1 ? php 2 /*...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
How does PHP type hinting work, including scalar types, return types, union types, and nullable types?How does PHP type hinting work, including scalar types, return types, union types, and nullable types?Apr 17, 2025 am 12:25 AM

PHP type prompts to improve code quality and readability. 1) Scalar type tips: Since PHP7.0, basic data types are allowed to be specified in function parameters, such as int, float, etc. 2) Return type prompt: Ensure the consistency of the function return value type. 3) Union type prompt: Since PHP8.0, multiple types are allowed to be specified in function parameters or return values. 4) Nullable type prompt: Allows to include null values ​​and handle functions that may return null values.

How does PHP handle object cloning (clone keyword) and the __clone magic method?How does PHP handle object cloning (clone keyword) and the __clone magic method?Apr 17, 2025 am 12:24 AM

In PHP, use the clone keyword to create a copy of the object and customize the cloning behavior through the \_\_clone magic method. 1. Use the clone keyword to make a shallow copy, cloning the object's properties but not the object's properties. 2. The \_\_clone method can deeply copy nested objects to avoid shallow copying problems. 3. Pay attention to avoid circular references and performance problems in cloning, and optimize cloning operations to improve efficiency.

PHP vs. Python: Use Cases and ApplicationsPHP vs. Python: Use Cases and ApplicationsApr 17, 2025 am 12:23 AM

PHP is suitable for web development and content management systems, and Python is suitable for data science, machine learning and automation scripts. 1.PHP performs well in building fast and scalable websites and applications and is commonly used in CMS such as WordPress. 2. Python has performed outstandingly in the fields of data science and machine learning, with rich libraries such as NumPy and TensorFlow.

Describe different HTTP caching headers (e.g., Cache-Control, ETag, Last-Modified).Describe different HTTP caching headers (e.g., Cache-Control, ETag, Last-Modified).Apr 17, 2025 am 12:22 AM

Key players in HTTP cache headers include Cache-Control, ETag, and Last-Modified. 1.Cache-Control is used to control caching policies. Example: Cache-Control:max-age=3600,public. 2. ETag verifies resource changes through unique identifiers, example: ETag: "686897696a7c876b7e". 3.Last-Modified indicates the resource's last modification time, example: Last-Modified:Wed,21Oct201507:28:00GMT.

Explain secure password hashing in PHP (e.g., password_hash, password_verify). Why not use MD5 or SHA1?Explain secure password hashing in PHP (e.g., password_hash, password_verify). Why not use MD5 or SHA1?Apr 17, 2025 am 12:06 AM

In PHP, password_hash and password_verify functions should be used to implement secure password hashing, and MD5 or SHA1 should not be used. 1) password_hash generates a hash containing salt values ​​to enhance security. 2) Password_verify verify password and ensure security by comparing hash values. 3) MD5 and SHA1 are vulnerable and lack salt values, and are not suitable for modern password security.

PHP: An Introduction to the Server-Side Scripting LanguagePHP: An Introduction to the Server-Side Scripting LanguageApr 16, 2025 am 12:18 AM

PHP is a server-side scripting language used for dynamic web development and server-side applications. 1.PHP is an interpreted language that does not require compilation and is suitable for rapid development. 2. PHP code is embedded in HTML, making it easy to develop web pages. 3. PHP processes server-side logic, generates HTML output, and supports user interaction and data processing. 4. PHP can interact with the database, process form submission, and execute server-side tasks.

PHP and the Web: Exploring its Long-Term ImpactPHP and the Web: Exploring its Long-Term ImpactApr 16, 2025 am 12:17 AM

PHP has shaped the network over the past few decades and will continue to play an important role in web development. 1) PHP originated in 1994 and has become the first choice for developers due to its ease of use and seamless integration with MySQL. 2) Its core functions include generating dynamic content and integrating with the database, allowing the website to be updated in real time and displayed in personalized manner. 3) The wide application and ecosystem of PHP have driven its long-term impact, but it also faces version updates and security challenges. 4) Performance improvements in recent years, such as the release of PHP7, enable it to compete with modern languages. 5) In the future, PHP needs to deal with new challenges such as containerization and microservices, but its flexibility and active community make it adaptable.

Why Use PHP? Advantages and Benefits ExplainedWhy Use PHP? Advantages and Benefits ExplainedApr 16, 2025 am 12:16 AM

The core benefits of PHP include ease of learning, strong web development support, rich libraries and frameworks, high performance and scalability, cross-platform compatibility, and cost-effectiveness. 1) Easy to learn and use, suitable for beginners; 2) Good integration with web servers and supports multiple databases; 3) Have powerful frameworks such as Laravel; 4) High performance can be achieved through optimization; 5) Support multiple operating systems; 6) Open source to reduce development costs.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat Commands and How to Use Them
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools