php框架|
php框架-
廚房app源碼,安裝很慢,昆侖系統(tǒng)和,ROSE配置,數(shù)據(jù)怎么錄入,分段進(jìn)度條插件,web前端怎么建框架,爬蟲那種做藥材,遍歷文件PHP,百度seo分析工具,在線考試系統(tǒng)網(wǎng)絡(luò)考試網(wǎng)站源碼下載,激活碼網(wǎng)頁源碼,企業(yè)模板,主頁面框架, 管理系統(tǒng),pt站點(diǎn)程序lzw
“
源碼,下載安裝包, win游戲,如何創(chuàng)建jsp, 爬蟲學(xué)習(xí),hrm php,河南短視頻seo優(yōu)化專業(yè)布局,網(wǎng)站通欄廣告制作教程lzw
前文中我們簡單的梳理了一下容器類js在容器里面加進(jìn)度條,接下來就是對其中一個細(xì)節(jié)進(jìn)行深度分析。
c 聊天源碼, 關(guān)閉vim,中關(guān)村,的class,視頻采集 ,商品對比插件2.0,前端框架技術(shù)制作專題網(wǎng)站交流,大數(shù)據(jù)網(wǎng)絡(luò)爬蟲應(yīng)用, php,seo技巧pdf下載,淘客網(wǎng)站商品采集,登錄網(wǎng)頁特效,婚禮請柬文字模板微信lzw
”
實(shí)例調(diào)用make方法
本文沒有太多文字解析,都在代碼注釋中說明了執(zhí)行過程。
代碼::()返回了的實(shí)例后,就會去調(diào)用本類的make方法,接下來就是對make方法進(jìn)行詳解了。
在開始閱讀make方法里邊的源碼之前,我們需要先對幾個屬性進(jìn)行簡單的梳理一下。
這四個屬性一定要有點(diǎn)印象,并且一定要區(qū)別和。
這倆個屬性一個是單例模式返回當(dāng)前類的實(shí)例js在容器里面加進(jìn)度條,一個是容器中的所有的實(shí)例。
第一次執(zhí)行結(jié)果
/**
* 創(chuàng)建類的實(shí)例
* @access public
* @param string $abstract 類名或者標(biāo)識
* @param array|true $vars 變量
* @param bool $newInstance 是否每次創(chuàng)建新的實(shí)例
* @return object
*/
public function make($abstract, $vars = [], $newInstance = false)
{
// 判斷$vars這個變量是否為true
if (true === $vars) {
// 總是創(chuàng)建新的實(shí)例化對象
$newInstance = true;
$vars = [];
}
// app 這里就是在容器別名里獲取傳遞過來的app 如果沒有則就是app
$abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;
// 從容器實(shí)例中獲取 如果存在則直接返回對應(yīng)的實(shí)例 也就是使用注冊樹模式
if (isset($this->instances[$abstract]) && !$newInstance) {
return $this->instances[$abstract];
}
// think\App 從容器標(biāo)識中獲取
if (isset($this->bind[$abstract])) {
// 將think\App 復(fù)制給$concrete變量
$concrete = $this->bind[$abstract];
// 用于代表匿名函數(shù)的類 判斷是不是閉包
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)建新的實(shí)例化對象
$newInstance = true;
$vars = [];
}
// app 這里就是在容器別名里獲取傳遞過來的app 如果沒有則就是app
// 第二次執(zhí)行時 $abstract = think\App
$abstract = isset($this->name[$abstract]) ? $this->name[$abstract] : $abstract;
// 從容器實(shí)例中獲取 如果存在則直接返回對應(yīng)的實(shí)例 也就是使用注冊樹模式
if (isset($this->instances[$abstract]) && !$newInstance) {
return $this->instances[$abstract];
}
// think\App 從容器標(biāo)識中獲取
// 第二次執(zhí)行$this->bind['think\App']不存在走else
if (isset($this->bind[$abstract])) {
// 將think\App 復(fù)制給$concrete變量
$concrete = $this->bind[$abstract];
// 用于代表匿名函數(shù)的類 判斷是不是閉包
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的構(gòu)造函數(shù)
$constructor = $reflect->getConstructor();
$args = $constructor ? $this->bindParams($constructor, $vars) : [];
// 從給出的參數(shù)創(chuàng)建一個新的類實(shí)例
return $reflect->newInstanceArgs($args);
} catch (ReflectionException $e) {
throw new ClassNotFoundException('class not exists: ' . $class, $class);
}
}
執(zhí)行流程圖
既然把代碼都理清楚了,這時來理一下執(zhí)行的流程圖可以看的更清晰。
“
堅(jiān)持學(xué)習(xí)、堅(jiān)持寫博、堅(jiān)持分享是咔咔從業(yè)以來一直所秉持的信念。希望在偌大互聯(lián)網(wǎng)中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。
”