Вызов статического метода из другого класса, который вызывает защищенный метод внутри того же класса - PullRequest
0 голосов
/ 20 октября 2019

Может быть, это потому, что я устал и работаю весь день, или, может быть, это потому, что я не очень хорошо разбираюсь в 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 были методы, загружающие несколько ресурсов, такие как представления, миграции, маршруты и т. Д.

Что мне здесь не хватает?

1 Ответ

2 голосов
/ 20 октября 2019

Проблема в том, что вы пытаетесь вызвать метод экземпляра из статического метода.

Статические методы не связаны с конкретным экземпляром вашего класса;вместо они связаны только с самим классом . Вот почему вы можете вызывать статические методы, фактически не создавая экземпляр класса.

С другой стороны, методы экземпляра можно вызывать только для реального экземпляра класса, и по этой причине они могутникогда не вызываться из статических методов (если только статический метод не создает экземпляр).

Для того, чтобы это работало, все 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');
        });
    }
}
...