学习了《深入PHP 面向对象、模式与实践》,根据自己理解也写了一个类似的反射类使用,以便加深理解
namespace ref\myExample;
abstract class Capacity{
public function show($skill)
{
echo static::class ." show skill:{$skill}";
}
}
interface module{
public function execute();
}
class SupermanModule extends Capacity implements module
{
public function execute(){
}
public function setName($name)
{
echo "Superman name:{$name}";
echo PHP_EOL;
}
public function setAge($age)
{
echo "Superman age:{$age}";
echo PHP_EOL;
}
}
class RouterModule extends Capacity implements module
{
protected $host;
protected $username;
public function execute(){
}
public function setHost($host)
{
$this->host = $host;
echo "Router host:{$host}";
echo PHP_EOL;
}
public function setUsername($username)
{
echo "Router username:{$username}";
echo PHP_EOL;
}
}
class runModule
{
private $module = [];
private $configData = [
"\\ref\\myExample\\SupermanModule"=>[
'name'=>'amy',
'age'=>36
],
"\\ref\\myExample\\RouterModule" => [
'host'=> 'rg.com',
'username'=>'jim'
]
];
public function init(){
//$interface = new \ReflectionClass('\ref\myExample\module');
static $c =0;
foreach($this->configData as $moduleName=>$param){
//print_r($param);
// echo PHP_EOL;
$moduleClass =new \ReflectionClass($moduleName);
if(!$moduleClass->isSubclassOf('\ref\myExample\module')){
// echo PHP_EOL;
continue;
}
//print_r($moduleClass->getMethods());
$this->handleMethod($moduleClass,$param);
}
}
public function handleMethod(\ReflectionClass $moduleClass ,$param){
foreach($moduleClass->getMethods() as $method){
$args = $method->getParameters();
print_r($args[0]->getClass());
print_r($args[0]);
break;
//print_r($args);continue;
if(substr($method->name,0,3)!='set' ){ //方法名不带有 set
// echo substr($method->name,0,3);echo PHP_EOL;
continue;
}
$property = strtolower(substr($method->name,3)); //取出如方法名setUsername的左起第三4位开始:Username 并转小写
if(!isset($param[$property])){//找不到该配置
//echo $property;echo PHP_EOL;
continue;
}
$module = $moduleClass->newInstance();
$method->invoke($module,$param[$property]);//调用方法,等同下面一行 $param['username'] = 'jim'
//call_user_func_array([$module,$method->name],[$param[$property]]);
}
}
}
$run = new runModule();
$run->init();