首先说一下自己理解的依赖注入,控制反转,AOP
如果不准确的欢迎吐槽啦
- 依赖注入 : 操作类实现一个专有接口 ,然后根据实际情况调用接口,如发送短信,发送邮件,本身都是发送,直接实现send方法,调用,我不用管里面是什么逻辑,我只要用send就可以了
- 控制反转 : 本来依赖注入的方法需要你自己实例化根据类型调用,现在我配置好,交给系统自动实例化调用的过程,叫控制反转
- AOP: 主要是为了分离关注点,比如,记录日志, 在场景用户各种的操作都需要日志,在专门的节点里面实现这个功能就可以了
简单代码实现AOP动态代理原理
<?php
/**
* aop基本概念,动态代理
*/
class LogicProxy
{
private $obj;
/**
* LogicProxy constructor.
* @param string $class
* @throws Exception
*/
public function __construct(string $class)
{
if (!class_exists($class)) {
throw new \Exception("{$class} 类不存在啦");
}
$this->obj = new $class();
}
/**
* @param $name
* @param $arguments
* @throws ReflectionException
* @throws \Exception
*/
public function __call($name, $arguments)
{
$reflect = new ReflectionClass($this->obj);
$method = $reflect->getMethod($name);
if (!$method) {
throw new \Exception("{$name} 方法名不存在");
}
if (!$method->isPublic() || $method->isAbstract()) {
throw new \Exception("{$name} 方法不能执行");
}
echo "before 执行了" . PHP_EOL;
$method->invoke($this->obj, ...$arguments);
echo "after 执行了" . PHP_EOL;
}
}
class Login
{
public function save($message)
{
echo "日志 : {$message}" . PHP_EOL;
}
}
//测试方法
try {
/** @var Login $logicProxy */
$logicProxy = new LogicProxy(Login::class);
$logicProxy->save("我只是想写个日志而已");
} catch (\Exception $e) {
echo "ERROR : {$e->getMessage()}" . PHP_EOL;
}