关于工厂模式中的优化反射类的应用,静态调用和动态调用问题

来源:7-11 代码高度优化-利用反射机制处理工厂模式做到真正的高大上思想

淹死De鱼

2020-10-13

return KaTeX parse error: Expected 'EOF', got '\ReflectionClass' at position 29: …== true ? (new \̲R̲e̲f̲l̲e̲c̲t̲i̲o̲n̲C̲l̲a̲s̲s̲(className))->newInstanceArgs(params):params):params):className;
这个返回值统一用
$aliSms = classObj::sendCode(classObj::sendCode(classObj::sendCode(phone,$code);
这种调用静态调用方式不行吧?
如果不行 在calssAttr.php文件应该不是静态方法和动态方法通用的吧?

写回答

2回答

淹死De鱼

提问者

2020-10-15

public static function smsClassStat(){
   return [
       "ali" => "app\common\lib\sms\AliSms",
       "baidu" => "app\common\lib\sms\BaiduSms",
       "jd" => "app\common\lib\sms\JdSms",
   ];
}

public static function initClass ($type,$classes,$params=[],$needInstance = false){
   if(!array_key_exists($type,$classes)){
       return false;
   }
   $className = $classes[$type];

return $needInstance == true?(new \ReflectionClass($className))->newInstanceArgs():$className;

}

上面是关于短信验证的优化代码

这是调用,视频中是说短信验证优化可以适用静态调用和动态调用两种方式,但是在business层调用的统一动用静态调用

$classStats = ClassAttr::smsClassStat();
$classObj = ClassAttr::initClass($type,$classStats);
$aliSms = $classObj::sendCode($phone,$code);

如果都用$classObj::sendCode($phone,$code)这种调用是否能用(包括动态调用,这种调用好像只能用于静态方法的作用)?

我测试了一下 把短信验证的静态方法全部改了,会报错,说$classObj::sendCode($phone,$code);这Non-static method app\\common\\lib\\sms\\AliSms::sendCode() should not be called statically(非静态方法app\\common\\lib\ sms\\AliSms::sendCode()不应该被静态调用),在lib层是不是要更改代码  做一步判断

$needInstance = false;

$classStats = ClassAttr::smsClassStat();
$classObj = ClassAttr::initClass($type,$classStats,$needInstance);

if(!$needInstance){

$aliSms = $classObj::sendCode($phone,$code);

}else{

$aliSms = $classObj->sendCode($phone,$code);

}



0
0

singwa

2020-10-14

您好。您代码写清楚点哈。方便老师快速帮您定位问题,谢谢。

0
0

全流程开发 TP6.0实战高并发电商服务系统

一课就能掌握TP6.0基础及运用,打造完整高并发的电商后端项目

1463 学习 · 1332 问题

查看课程