首页 > 解决方案 > 调用不同类中的静态方法,该方法调用同一类中的受保护方法

问题描述

也许只是因为我累了,整天都在工作,或者是因为我并没有像我想象的那样真正掌握 PHP 类。但无论如何。这是我的问题。

我正在使用下面的这行代码从文件中调用静态方法ServiceProvider.php

use webdevhacks\LaraBlog\Resources;
public function boot() {
Resources::load();
}

现在在名为 的资源类Resources.php中,我有以下代码。

namespace webdevhacks\LaraBlog;

use Illuminate\Support\Facades\Route;
use webdevhacks\LaraBlog\LaraBlog;


class Resources {

    // Load Resources
    public static function load() {
        // Load Package Routes
        return $this->loadRoutes();
    }

    // Load Routes
    protected function loadRoutes() {
        return Route::group($this->routeConfiguration(), function() {
            $this->loadRoutesFrom(__DIR__ . '/../routes/web.php');
        });
    }
}

我收到以下错误消息:

不在对象上下文中时使用 $this

现在,我的最终目标是能够使用静态方法加载多个资源load()。我希望在Resources.php其中加载多个资源的方法,例如视图、迁移、路由等。

我在这里想念什么?

标签: phplaravellaravel-6

解决方案


问题是,您试图从静态方法调用实例方法。

静态方法与类的特定实例无关;相反,它们只与类本身相关联。这就是为什么您可以在不实际创建类实例的情况下调用静态方法的原因。

另一方面,实例方法只能在类的实际实例上调用,因此,它们永远不能从静态方法中调用(除非静态方法实际创建了一个实例)。

为了使其工作,loadRoutes、loadRoutesFrom 和 routeConfiguration 也都需要是静态方法。如果您希望能够更改 routeConfiguration,最好将其作为参数传递给 loadRoutes。像这样的东西:

class Resources {
    // Load Resources
    public static function load($configuration) {
        // Load Package Routes
        return Resources::loadRoutes($configuration);
    }

    // Load Routes
    protected static function loadRoutes($configuration) {
        return Route::group($configuration, function() {
            Resources::loadRoutesFrom(__DIR__ . '/../routes/web.php');
        });
    }
}

推荐阅读