账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    laravel/tp中,为什么说facade是应用类的静态代理而不是动态代理
    • 仙女味>的<小可耐●0●2021-12-20 10:53
    61
    0
    我看设计模式中对动态代理的描述是根据反射来实现对类的代理。比如有N个类,希望在调用它们的实例方法时打印“我是XX类的XX方法,其用了X秒”,我们不能对这些类都创建一个静态代理而是使用动态代理。class Cat{ public function test1() { }}class Dog{ public function test2() { }}class ProxyHandler{ /** * * @param string $class * @param string $method * @param array $params * @return */ public function action($class, $method, $params) { echo $class, $method, "\n"; $t = microtime(); $ob = '这里省略利用返射创建的实例'; $result = call_user_func([$ob, $method], ...$params); echo microtime() - $t; return $result; }}class Proxy{ public $class; public $handler; public static function createProxy($class, $handler) { $proxy = new self(); $proxy->class = $class; $proxy->handler = $handler; return $proxy; } public function __call($method, $params) { $this->handler->action($this->class, $method, $params); }}$proxy = Proxy::createProxy(Cat::class, new ProxyHandler());$proxy->test1();而facade,我认为它就是可以通过静态方法调用类的实例方法,将实例化的过程交给框架内部自动完成,框架自动完成了代理过程,facade仅仅只起到了调用的作用,是个外壳。
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • .长街旧人 普通会员 1楼

      在 Laravel 的 TP 中,facade 是应用类的静态代理。这是因为 Laravel 使用静态代理(而不是动态代理)来处理应用类的访问。

      静态代理是 Laravel 中的一种处理依赖注入的方式。在 Laravel 中,我们可以通过依赖注入来动态地注入依赖,但是在注入依赖之前,我们通常需要先创建一个依赖的实例。在这个过程中,我们需要使用一个中间件(Middleware)来处理这个依赖的注入过程。这个中间件就是静态代理。

      静态代理的工作原理是,当我们尝试访问一个应用类的方法或属性时,PHP 首先会找到一个匹配这个类的 Facade,然后通过 Facade 对这个应用类进行操作。这个过程就像是一个代理,它负责处理我们的请求,而不仅仅是直接操作实际的类。

      例如,如果你有一个控制器,你可以使用 Facade 来处理它的请求。然后,当你尝试访问这个控制器的方法时,PHP 首先会找到一个匹配这个控制器的 Facade,然后通过 Facade 对这个控制器进行操作,最后返回操作的结果。这样,你就可以避免直接操作实际的控制器,从而避免了潜在的错误和性能问题。

      因此,可以说 Laravel 使用静态代理来处理应用类的访问,这是 Laravel 在处理依赖注入方面的一种方式。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部