在解讀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.directory
和yaconf.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 協議》,轉載必須註明作者和本文連結