国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

php反射學習之不用new方法實例化類操作示例

2024-05-05 00:09:39
字體:
來源:轉載
供稿:網友

本文實例講述了php反射學習之不用new方法實例化類操作。分享給大家供大家參考,具體如下:

上一篇php反射入門示例簡單介紹了 php 反射的幾個常見類的使用方法,但是用反射能做些什么,你可能還是想象不到,

下面我稍微應用反射類來做點東西,大家知道實例化一個類需要用new 關鍵字,不用 new 可以嗎?答案是可以的,用反射就能實現:

首先創建一個文件 student.php:

<?phpclass 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();  }}

另新建一個文件run.php

<?phprequire '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} 沒有傳值且沒有默認值。");        }      } else {        $resolveParams[] = $default;      }    }  }  return $ref->newInstanceArgs($resolveParams);}

run.php 中make 函數就是我們用來實例化類而編寫的函數,第一個參數傳入類名,第二個參數是類的構造函數需要傳入的參數數據。

根據 Student 的構造函數的參數不同有幾種情況:(以下代碼,請按不同情況追加到 run.php 中運行)

情況一: 沒有提供 $name 的值

try {  $stu = make('Student', ['id' => 1]);  print_r($stu);  $stu->study();} catch (Exception $e) {  echo $e->getMessage();}

在構造函數中$name 沒有默認值時,情況一會報錯, 你可以稍微修改下 Student類,給 $name 提供一個默認值,這時候就不會報錯了。

情況二 提供了 $name 的值

try {  $stu = make('Student', ['id' => 1, 'name' => 'li']);  print_r($stu);  $stu->study();} catch (Exception $e) {  echo $e->getMessage();}

情況三,我們把 student.php 改一下

<?phpclass Bag{  public function name(){    return "學生包".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 類加了一個參數$bag, 類型 是 Bag

這時候運行一下

<?phptry {  $stu = make('Student', ['id' => 1, 'name' => 'li']);  print_r($stu);  $stu->study();  $stu->showBag();} catch (Exception $e) {  echo $e->getMessage();}

可以看到構造函數的第三個參數 $bag ,被自動實例化了,然后傳遞給了 Student 類的構造函數,這個部分很關鍵,這個地方可以用來實現依賴注入,我們不必在手動實例化對象了,我們可以根據參數的對應的類來自動實例化對象,從而實現類之間的解耦。如果你學過 Laravel的話,你應該對這個很熟悉了。

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 措勤县| 诏安县| 漳平市| 资中县| 新晃| 新龙县| 尼木县| 常山县| 辉县市| 明溪县| 隆回县| 博野县| 崇明县| 平利县| 沧州市| 高密市| 克山县| 尼勒克县| 健康| 鹰潭市| 鄂伦春自治旗| 穆棱市| 龙井市| 彩票| 临洮县| 手游| 和静县| 河北省| 南投市| 晋州市| 永平县| 岚皋县| 虹口区| 手游| 北流市| 七台河市| 河北省| 宜兰县| 邢台市| 凯里市| 高淳县|