Переменные не определены, когда требуется просмотр родительским контроллером

Я работаю с контроллерами и представлениями (без фреймворка) и имею проблему с требованием представления от родительского контроллера, что приводит к неопределенности переменных.

Есть основной Контроллер с функцией представления, которая выполняет запрос представлений.

class Controller {
public function view($view, $data =[]){
require_once './app/views/' . $view . '.php';
}

Затем есть пользовательский контроллер, расширяющий контроллер с помощью метода «mypage», который загружает данные в переменные и требует представления. (Вы можете получить доступ к Mypage в URL, если вы вошли в систему).

class User extends Controller{
public function mypage(){
$userdetails = $this->getuserdetails();
$userstatus = $this->getstatus();
$messages = new Messages();
$showmessages = $messages->showMessages();
$friends = new Friends();
$outrequests = $friends->outRequests();
$increquests = $friends->incRequests();
$friendsstatuses = $friends->friendsstatuses();
$getfriends = $friends->friends();
$this->view('mypage');
}
}

Линия $ This-> Вид ( ‘MyPage’); запускает метод представления в родительском контроллере, который требует представления mypage (mypage.php), где используются переменные. Проблема в том, что все переменные становятся неопределенными в mypage.php.

Если я обменяю эту строку с

require_once "./app/views/mypage.php";

, тогда это работает. Итак, почему я теряю переменные при запросе от контроллера, и что я делаю неправильно?

1

Решение

Дикая догадка, но я думаю, что это проблема масштаба:

Вы определяете свои переменные в mypage() функция, поэтому эти переменные живут только в области действия этой функции.
призвание $this->view(...) просто вызывает другой метод, который имеет свою область видимости (где ваши переменные не существуют).

Принимая во внимание, что когда вы звоните напрямую require_once(...)Ваш включенный скрипт просмотра наследует переменные, уже определенные в текущей области видимости.

2

Другие решения

Других решений пока нет …