VicTHOR
@VicTHOR
(╮°-°)╮┳━━┳ ( ╯°□°)╯ ┻━━┻

Можно ли магическим образом создать объект?

Использую пакет simple router примерно такRouter::get('/', [SiteController::class, 'home'])
Метод home не статический и там пишу return $this->render('...');
Ошибка Using $this when not in object context.
Можно ли как-то не переписывать на static? Сначала подумал __call() написать, но он применяется к существующим объектам
  • Вопрос задан
  • 165 просмотров
Решения вопроса 2
Skiphog
@Skiphog
Crutch developer. Ищу работу.
Вы всё делаете правильно, метод render() и не должен быть статическим, но что бы всё заработало корректно, вам нужно использовать другой вид записи.
Router::get('/', 'Неймспейс\\SiteController@home');

Либо использовать PHP 8.0

Постараюсь вкратце пояснить почему.
Когда вы пишете такую конструкцию
use App\Controllers; // к примеру
//...

Router::get('/', [SiteController::class, 'home']);

SiteController::class как бы так сказать, преобразуется в App\Controllers\SiteController

Но автор библиотеки плевать хотел на эти ваши неймспейсы и всё что вы там себе придумали.
Он берёт данные, которые вы передали и получает массив вида
[
    0 => 'App\Controllers\SiteController',
    1 => 'home'
];

Потом проверяет этот массив на is_callable()
https://github.com/skipperbent/simple-php-router/b...

А такое выражение до PHP8 возвращает true, поэтому всё это дело отправляется дальше на исполнение в
call_user_func_array() пытаясь вызвать метод статически
https://github.com/skipperbent/simple-php-router/b...
Отсюда и ошибка.
Объект же класса ещё не создан
---
Автор предлагает все неймспейсы указать отдельным методом до старта
SimpleRouter::setDefaultNamespace('App\Controllers');

Тогда можно указывать класс без неймспейса и всё будет работать.

Но в этом случае любой анализатор кода либо тот же Шторм скажет вам, что вы делаете какую-то дичь.
И как поступить решать уже вам.
Ответ написан
Может так?
Router::get('/', [new SiteController(), 'home'])
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы