对于Laravel控制器修饰符的疑问

发布于 2022-09-07 23:21:28 字数 1457 浏览 14 评论 0

为什么Laravel控制器使用protected修饰也可以正常访问?

protected function advert()
        {
            try {
                $result = $this->systemService->advert ();
                
                return $this->response->array (Response::return (200, '获取成功', $result));
            } catch (\Exception $e) {
                return $this->response->array (Response::return (0, $e->getMessage ()));
            }
        }

就算使用反射实例化也不能访问protected修饰的方法吧,laravel源码如下

$constructor = $reflector->getConstructor();
        // If there are no constructors, that means there are no dependencies then
        // we can just resolve the instances of the objects right away, without
        // resolving any other types or dependencies out of these containers.
        if (is_null($constructor)) {
    
            array_pop($this->buildStack);
    
            return new $concrete;
        }

        $dependencies = $constructor->getParameters();
        // Once we have all the constructor's parameters we can create each of the
        // dependency instances and then use the reflection instances to make a
        // new instance of this class, injecting the created dependencies in.
        $instances = $this->resolveDependencies(
            $dependencies
        );

        array_pop($this->buildStack);
        
        return $reflector->newInstanceArgs($instances);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羁客 2022-09-14 23:21:28

Illuminate\Routing\Controller 这是laravel调用控制器方法的方法

public function dispatch(Route $route, $controller, $method)
{
    
    $parameters = $this->resolveClassMethodDependencies(
        $route->parametersWithoutNulls(), $controller, $method
    );

    if (method_exists($controller, 'callAction')) {

            return $controller->callAction($method, $parameters);
    }
        
    return $controller->{$method}(...array_values($parameters));
}

Laravel通过controller继承的callAction去调用子类的指定方法,也就是我们希望调用的自定义方法。

public function callAction($method, $parameters)
{
    return call_user_func_array([$this, $method], $parameters);
}

因为是继承自父类,所以父类能调用子类的保护的方法也是自然的了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文