利用反射動態驗證方法呼叫方法

2021-09-11 11:47:34 字數 3639 閱讀 2761

基於webmozart assert封裝的驗證,利用反射簡化了原有的呼叫過程,增加了語言包,自定義驗證規則

//驗證規則

$rule = [

//字串方式 '驗證的字段'=>'規則1|規則2:引數1|規則3:引數1:引數2'

'category_num' =>'notempty|eq:10|lengthbetween:1:3',

//陣列方式

'category_name' => [ //驗證的字段

'notempty',//規則1

'eq' => [ //規則2

10, //引數1

],'lengthbetween' => [ //規則3

1, //引數1

3, //引數2

],],

];//自定義message,如果沒有自定義,就預設讀語言包的

$msg =[

'category_num.notempty'=>'必填'

];//呼叫驗證

(new validator())->v($this->in, $rule);

複製**

語言包檔案是lang/zh-cn.php(框架自帶或者任意配置檔案)

'notempty'  => '請填寫%s', //%s代表替換字段

'eq' => '', 如果預設訊息為空,可以自定義新增

複製**

在ext目錄下新建或者在已有的trait裡新增方法方法名必須是唯一的,不能跟現有的重複,方法名即驗證規則

trait test

}}複製**

已有的驗證規則可以檢視github.com/webmozart/a…上面的

是指在php執行狀態中,擴充套件分析php程式,匯出或提取出關於類、方法、屬性、引數等的詳細資訊,包括注釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射api。 反射是操縱物件導向范型中元模型的api,其功能十分強大,可幫助我們構建複雜,可擴充套件的應用

其用途如:自動載入外掛程式,自動生成文件,甚至可用來擴充php語言。

本人比較懶就直接貼**了、、、、、、、

.

+-- validator.class.php

+-- validatorext.class.php

+-- ext

| +-- test.class.php

| +-- header.html

複製**

<?php

namespace restfulapi\common\validator;

use webmozart\assert\assert;

/** * 驗證

* class validator

* @package restfulapi\common\validator

* @author matao

* @since 2018-08-01

*/class validator

/*** 格式化rule

* @param $rules

* @return array

* @author matao

* @since 2018-08-01

*/private function formatrule($rules)

else

}$rule[$key] = $currentrule;

} else

}return

$rule;

}/**

* data轉換

* @param $datas

* @param $rules

* @return array

* @author matao

* @since 2018-08-07

*/private function conversion($datas, $rules)

/*** 執行驗證

* @param $data

* @param $rule

* @param array $msg

* @throws \reflectionexception

* @author matao

* @since 2018-08-01

*/private function validator($data, $rule, $msg = )

foreach ($rule[$key] as $k => $value) else

$message = '';

//如果有自定義message就使用

if (!empty($msg["."])) ."];

} elseif (l($method))

$param = $message ?: ''; //$param是該方法的引數[$val1,$val2]

//呼叫具體的方法

$this->scheduler($method, $param);

unset($param);}}

}/**

* 排程

* @param $method

* @param $param

* @throws \reflectionexception

* @author matao

* @since 2018-08-01

*/private function scheduler($method, $param)

}/**

* 反射

* @param $class

* @param $method

* @param $param

* @return bool

* @throws \reflectionexception

* @author matao

* @since 2018-08-01

*/public function reflection($class, $method, $param)

return

false;

}}複製**

<?php

namespace restfulapi\common\validator;

//自定義驗證,方法不能跟已有的重複

use restfulapi\common\validator\ext\mysqlvalidator;

use restfulapi\common\validator\ext\test;

class validatorext

}複製**

<?php

namespace restfulapi\common\validator\ext;

trait test

}}複製**

set_exception_handler(function (\invalidargumentexception $exception) );

複製**

利用反射機制呼叫私有方法

步驟1 獲取到當前執行緒的類載入器 classloader classloader thread.currentthread getcontextclassloader 步驟2 用類載入器獲取的class物件 class clazz classloader.loadclass com.wxw.tes...

利用反射動態呼叫類成員

使用反射動態呼叫類成員,需要type類的乙個方法 invokemember。對該方法的宣告如下 摘抄於msdn public object invokemember string name,bindingflags invokeattr,binder binder,object target,obj...

C 利用反射呼叫類下的方法

1.主窗體下的 namespace testreflection private void comboboxedit1 selectedindexchanged object sender,eventargs e 反射呼叫類中的方法 private void testmethod string me...