php反射學(xué)習(xí)之不用new方法實(shí)例化類操作示例
本文實(shí)例講述了php反射學(xué)習(xí)之不用new方法實(shí)例化類操作。分享給大家供大家參考,具體如下:
上一篇php反射入門示例簡(jiǎn)單介紹了 php 反射的幾個(gè)常見(jiàn)類的使用方法,但是用反射能做些什么,你可能還是想象不到,
下面我稍微應(yīng)用反射類來(lái)做點(diǎn)東西,大家知道實(shí)例化一個(gè)類需要用new 關(guān)鍵字,不用 new
可以嗎?答案是可以的,用反射就能實(shí)現(xiàn):
首先創(chuàng)建一個(gè)文件 student.php:
<?php class Student { public $id; public $name; public function __construct($id,$name) { $this->id = $id; $this->name = $name; } public function study() { echo $this->name.' is learning.....'.PHP_EOL; } public function showBag(){ echo "My bag have ".$this->bag->all(); } }
另新建一個(gè)文件run.php
<?php require 'student.php'; function make($class, $vars = []) { $ref = new ReflectionClass($class); if(!$ref->isInstantiable()) { throw new Exception("類{$class} 不存在"); } $constructor = $ref->getConstructor(); if(is_null($constructor)) { return new $class; } $params = $constructor->getParameters(); $resolveParams = []; foreach ($params as $key=>$value) { $name = $value->getName(); if(isset($vars[$name])) { $resolveParams[] = $vars[$name]; } else { $default = $value->isDefaultValueAvailable() ? $value->getDefaultValue() : null; if(is_null($default)) { if($value->getClass()) { $resolveParams[] = make($value->getClass()->getName(), $vars); } else { throw new Exception("{$name} 沒(méi)有傳值且沒(méi)有默認(rèn)值。"); } } else { $resolveParams[] = $default; } } } return $ref->newInstanceArgs($resolveParams); }
run.php 中make 函數(shù)就是我們用來(lái)實(shí)例化類而編寫的函數(shù),第一個(gè)參數(shù)傳入類名,第二個(gè)參數(shù)是類的構(gòu)造函數(shù)需要傳入的參數(shù)數(shù)據(jù)。
根據(jù) Student 的構(gòu)造函數(shù)的參數(shù)不同有幾種情況:(以下代碼,請(qǐng)按不同情況追加到 run.php 中運(yùn)行)
情況一: 沒(méi)有提供 $name 的值
try { $stu = make('Student', ['id' => 1]); print_r($stu); $stu->study(); } catch (Exception $e) { echo $e->getMessage(); }
在構(gòu)造函數(shù)中$name 沒(méi)有默認(rèn)值時(shí),情況一會(huì)報(bào)錯(cuò), 你可以稍微修改下 Student類,給 $name 提供一個(gè)默認(rèn)值,這時(shí)候就不會(huì)報(bào)錯(cuò)了。
情況二 提供了 $name 的值
try { $stu = make('Student', ['id' => 1, 'name' => 'li']); print_r($stu); $stu->study(); } catch (Exception $e) { echo $e->getMessage(); }
情況三,我們把 student.php 改一下
<?php class Bag{ public function name(){ return "學(xué)生包".PHP_EOL; } } class Student { public $id; public $name; public function __construct($id, $name="xxx", Bag $bag) { $this->id = $id; $this->name = $name; $this->bag = $bag; } public function study() { echo $this->name.' is learning.....'.PHP_EOL; } public function showBag(){ echo "My bag is ".$this->bag->name(); } }
可以看到,給 Student 類加了一個(gè)參數(shù)$bag, 類型 是 Bag
這時(shí)候運(yùn)行一下
<?php try { $stu = make('Student', ['id' => 1, 'name' => 'li']); print_r($stu); $stu->study(); $stu->showBag(); } catch (Exception $e) { echo $e->getMessage(); }
可以看到構(gòu)造函數(shù)的第三個(gè)參數(shù) $bag ,被自動(dòng)實(shí)例化了,然后傳遞給了 Student 類的構(gòu)造函數(shù),這個(gè)部分很關(guān)鍵,這個(gè)地方可以用來(lái)實(shí)現(xiàn)依賴注入,我們不必在手動(dòng)實(shí)例化對(duì)象了,我們可以根據(jù)參數(shù)的對(duì)應(yīng)的類來(lái)自動(dòng)實(shí)例化對(duì)象,從而實(shí)現(xiàn)類之間的解耦。如果你學(xué)過(guò) Laravel的話,你應(yīng)該對(duì)這個(gè)很熟悉了。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
- PHP的反射動(dòng)態(tài)獲取類方法、屬性、參數(shù)操作示例
- php面試實(shí)現(xiàn)反射注入的詳細(xì)方法
- PHP反射原理與用法深入分析
- php提供實(shí)現(xiàn)反射的方法和實(shí)例代碼
- PHP進(jìn)階學(xué)習(xí)之反射基本概念與用法分析
- PHP反射學(xué)習(xí)入門示例
- PHP反射實(shí)際應(yīng)用示例
- 用PHP的反射實(shí)現(xiàn)委托模式的講解
- 淺析PHP類的反射來(lái)實(shí)現(xiàn)依賴注入過(guò)程
- PHP基于反射機(jī)制實(shí)現(xiàn)自動(dòng)依賴注入的方法詳解
- PHP基于反射獲取一個(gè)類中所有的方法
- PHP反射基礎(chǔ)知識(shí)回顧
相關(guān)文章
使用WordPress發(fā)送電子郵件的相關(guān)PHP函數(shù)用法解析
這篇文章主要介紹了使用WordPress發(fā)送電子郵件的相關(guān)PHP函數(shù)用法解析,文中還提到了常見(jiàn)的郵件無(wú)法發(fā)送的情況的解決,需要的朋友可以參考下2015-12-12自定義session存儲(chǔ)機(jī)制避免會(huì)話保持問(wèn)題
PHP服務(wù)端session以文件的方式存儲(chǔ),當(dāng)用戶訪問(wèn)量過(guò)大時(shí)就會(huì)面臨會(huì)話保持的問(wèn)題,下面有兩種解決方案,需要的朋友可以參考下2014-10-10php生成4位數(shù)字驗(yàn)證碼的實(shí)現(xiàn)代碼
這篇文章主要介紹了php數(shù)字驗(yàn)證碼的實(shí)現(xiàn)代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2015-11-11php + ajax 實(shí)現(xiàn)的寫入數(shù)據(jù)庫(kù)操作簡(jiǎn)單示例
這篇文章主要介紹了php + ajax 實(shí)現(xiàn)的寫入數(shù)據(jù)庫(kù)操作,結(jié)合實(shí)例形式分析了php + ajax 寫入數(shù)據(jù)庫(kù)基本原理、操作技巧與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2020-05-05php 數(shù)組的創(chuàng)建、調(diào)用和更新實(shí)現(xiàn)代碼
對(duì)于php的數(shù)組是php中很重要的一個(gè)地方,大家一定要仔細(xì)看。2009-03-03