TP5.1 原始碼窺探之反射和 Yaconf 配置擴充套件

zs4336發表於2020-03-27

在解讀TP原始碼之前我們首先了解一下,什麼是反射,什麼是Yaconf配置,什麼是Yaml配置,甚至一些常見的設計模式,比如單例模式,簡單工廠模式,註冊樹模式等。

反射

官方的解釋:PHP 5 具有完整的反射 API,新增了對類、介面、函式、方法和擴充套件進行反向工程的能力。 此外,反射 API 提供了方法來取出函式、類和方法中的文件註釋。它不需要其他擴充套件,是PHP核心的一部分。我們平常在物件導向開發的時候,經常使用到類,介面,方法等。而類是有屬性和方法組成的,利用PHP的反射機制,我們可以讀取類,介面,方法,屬性的資訊。

舉個例子,一目瞭然

include 'note/Obj.php';

$class = Obj::class;
$reflectionClass = new \ReflectionClass($class);

//檢查一個類中指定的方法是否已定義
$hasMethod = $reflectionClass->hasMethod('buy');

//類報告了一個方法的有關資訊
$method = new ReflectionMethod($class,'buy');

//判斷方法是否是公共方法
$methodIsPublic    = $method->isPublic();
//判斷方法是否是受保護方法
$methodIsProtected = $method->isProtected();
//判斷方法是否是私有方法
$methodIsPrivate   = $method->isPrivate();
//判斷方法是否是靜態方法
$methodIsStatic   = $method->isStatic();
//獲取方法的註釋
$methodDocument   = $method->getDocComment();

$methodNumOfParameters   = $method->getNumberOfParameters();
$methodNumOfRequiredParameters   = $method->getNumberOfRequiredParameters();
//返回 ReflectionParameter 陣列
$methodParameters   = $method->getParameters();
$args = [];
if($methodNumOfParameters){
    foreach($methodParameters as $methodParameter){
        //獲取引數名
        $parameterName = $methodParameter->getName();
        //獲取引數的型別提示類,型別為ReflectionClass物件
        $class = $methodParameter->getClass();
        //檢查引數是否有預設值
        $isDefaultValueAvailable = $methodParameter->isDefaultValueAvailable();
        if($isDefaultValueAvailable){
            $defaultValue = $methodParameter->getDefaultValue();
            $args[] = $defaultValue;
        }else{
            $args[] = '大奔';
        }
    }
}
if($methodIsPublic && $methodIsStatic){
    //使用陣列給方法傳送引數,並執行他
    $res = $method->invokeArgs(null,$args);
}

//一個 ReflectionMethod 物件,反射了類的建構函式,或者當類不存在建構函式時返回 NULL。
$construct = $reflectionClass->getConstructor();
$args = $construct ? [30] : [];
//例項化一個Obj物件
$newObj = $reflectionClass->newInstanceArgs($args);

配置

我們平常專案開發配置檔案的型別,要麼是env檔案,php檔案,json檔案,ini檔案,txt檔案等,今天介紹兩個配置,一個是Yaconf,另外一個是Yaml

安裝yaconf和yaml擴充套件

你也可以在[PECL]中直接安裝,以及下載windows下的dll。yaconf要求php7才能用。另外windows安裝擴充套件的時候,echo pathinfo()檢視是否是nts或者ts,同時注意系統是32位還是64位。

配置

在php.ini中新增此兩個擴充套件。同時配置yaconf目錄yaconf.directoryyaconf.check_delay。不要忘記重啟PHP。

extension=php_yaml.dll
extension=php_yaconf.dll
yaconf.directory="D:\xxx\xxx\www\tp5\yaconf"
yaconf.check_delay=0

舉例

yaconf.ini

name="bar"

person.name='張三'
person.sex='男'

arr[]=1
arr[]=2

[estate]
location = '鄭州'
price=118

[children:estate]
price=5210
son=18

yaml.yaml

animal: pets
hash: { name: Steve, foo: bar }
animals:
- Cat
- Dog
- Goldfish

#數值陣列
languages:
  - Ruby
  - Perl
  - Python

#關聯陣列
websites:
  YAML: yaml.org
  Ruby: ruby-lang.org
  Python: python.org
  Perl: use.perl.org

index.php

if(class_exists('Yaconf')){
    $res = Yaconf::get('yaconf.name');//yaconf對應yaconf.ini檔案
    $res = Yaconf::get('yaconf.arr');
    $res = Yaconf::get('yaconf.person');
    $res = Yaconf::get('yaconf.person.name');
    $res = Yaconf::get('yaconf.estate');
    $res = Yaconf::get('yaconf.children');
    var_dump($res);
}

$file = 'yaml.yaml';
if( function_exists('yaml_parse_file') ){
   $config =yaml_parse_file($file);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

趁還沒掉光,趕緊給每根頭髮起個名字吧~

相關文章