Есть страница с логином PHP: <?php include ROOT . '/views/layout/header.php'; ?> <section class="content clearfix"> <?php if (isset($errors) && is_array($errors)): ?> <ul> <?php foreach ($errors as $error): ?> <li> - <?php echo $error; ?></li> <?php endforeach; ?> </ul> <?php endif; ?> <div class="signup-form"><!--sign up form--> <h2>Вход на сайт</h2> <form action="#" method="post"> <input type="input" name="name" placeholder="Логин" value="<?php echo $name; ?>"/> <!-- переменные берутся из UserController actionLogin() --> <input type="password" name="password" placeholder="Пароль" value="<?php echo $password; ?>"/> <input type="submit" name="submit" class="btn btn-default" value="Вход" /> </form> </div><!--/sign up form--> </section> Переменные name и password находятся в классе User в методе actionLogin и я не понимаю, как они вызываются напрямую? Все действия обрабатывает роутер PHP: <?php class Router { private $routes; //здесь будет массив, в котором будут храниться маршруты public function __construct() { $routesPath = ROOT . '/config/routes.php'; $this->routes = include($routesPath); } //метод возвращает строку private function getURI() { if(!empty($_SERVER['REQUEST_URI'])) { return trim($_SERVER['REQUEST_URI'], '/'); } } public function run() { $uri = $this->getURI(); echo '<pre>'; print_r($uri); echo '</pre>'; echo '<pre>'; print_r($this->routes); echo '</pre>'; foreach($this->routes as $uriPattern => $path) { if(preg_match("~$uriPattern~", $uri)) { $internalRoute = preg_replace("~$uriPattern~", $path, $uri); echo $internalRoute; //ввели в браузер catalog и изменили на catalog/index //echo '<br>'; //echo '--------------------------'; //echo '<br>'; $segments = explode('/', $internalRoute); //разделили на catalog и index echo '<pre>'; print_r($segments); echo '</pre>'; //берём первое значение массива, то есть catalog и присоединяем Controller //в итоге получается catalogController //после этого из массива этот элемент пропадает $controllerName = array_shift($segments).'Controller'; //делаем первую букву большой и получается CatalogController $controllerName = ucfirst($controllerName); echo '<br>$controllerName: ' . $controllerName; //присоединяем action к первому элементу массива и это получится //метод в классе, который лежит в контроллере $actionName = 'action'.ucfirst(array_shift($segments)); $parameters = $segments; //ищем этот контроллер файл $controllerFile = ROOT . './controllers/' . $controllerName . '.php'; echo '<br>'; echo '<br>' . $controllerFile; //если файл есть, то подключаем его if(file_exists($controllerFile)) { require_once($controllerFile); } $controllerObject = new $controllerName; echo '<br>$actionName: ' . $actionName; echo '<br>'; if(method_exists($controllerObject,$actionName)) { //$result = call_user_func_array([$controllerObject, $actionName], $parameters); $result = $controllerObject->$actionName(...$parameters); } else { echo 404; $result = 0; } // print_r($controllerObject); echo '<pre>'; print_r($parameters); echo '</pre>'; //прекращаем цикл, потомуч то найден элемент, а дальше смысла искать нет //и посыпятся ошибки, будет перебирать каждую букву if($result != null) { break; } } } } } PHP: <?php include_once ROOT. '/models/User.php'; /** * Контроллер UserController */ class UserController { /** * Action для страницы "Вход на сайт" */ public function actionLogin() //метод просто проверяет был ли нажат submit всё это делается в роутере { // Переменные для формы $name = false; $password = false; // Обработка формы if (isset($_POST['submit'])) { // Если форма отправлена // Получаем данные из формы $name = $_POST['name']; $password = $_POST['password']; // Флаг ошибок $errors = false; // Валидация полей if (!User::checkPassword($password)) { $errors[] = 'Пароль не должен быть короче 6-ти символов'; } // Проверяем существует ли пользователь $userId = User::checkUserData($name, $password); if ($userId == false) { // Если данные неправильные - показываем ошибку $errors[] = 'Неправильные данные для входа на сайт'; } else { // Если данные правильные, запоминаем пользователя (сессия) User::auth($userId); // Перенаправляем пользователя в закрытую часть - кабинет header("Location: /cabinet"); } } // Подключаем вид require_once(ROOT . '/views/user/login.php'); return true; } Я думаю, что эту магию, делает функция PHP: $result = call_user_func_array([$controllerObject, $actionName], $parameters); Но не знаю как? --- Добавлено --- Пробовал вывести напрямую, но почему-то не выводит PHP: <?php class User { public function actionLogin($a, $b) { $name = false; $password = false; $name = $a; $password = $b; return [$name, $password]; } } $result = call_user_func_array([new User, 'actionLogin'], ['Dima', 123456]); echo $name; echo '<pre>'; print_r($result); echo '</pre>'; --- Добавлено --- или это работает, потому что в метод подключён шаблон?
так ты же инклудишь require_once(ROOT .'/views/user/login.php'); файл вот они там и видны... --- Добавлено --- не... она просто вызывает метод объекта и в качестве аргументов ставит данные из массива.. --- Добавлено --- потому что область видимости тех переменых - внутри метода.. тебе что бы получить к ним доступ надо сделать их свойстами объекта - а оптом уже из объекта их достать.. а по сабжу - ты внутри метода объявил дви переменные и тут же заинклудил файл.. вот тебе и видны переменные внутри файла, потому что одна область видимости. .
@Dimon2x, никакой магии. Ты забыл, что include и require в php буквально включают содержимое одного файла в другой. Т.е. если ты пишешь: PHP: <?php // a.php echo $a; echo $b; ?> <?php // b.php function f() { $a = 5; $b = 7; require "a.php"; } то это работает также, как если бы ты написал PHP: <?php function f() { $a = 5; $b = 6; echo $a; echo $b; } Поэтому не надо лезть в MVC, пока не поняты основы PHP. Там тоже самое.
они могут и записывать содержимое файла: PHP: $routesPath = ROOT . '/config/routes.php'; $this->routes = include($routesPath); return array(...) из файла просто не скопипастишь.
@keren, другой случай. Для этого нужно, чтоб во включаемом файле был return. Но, как бы, форум - не замена документации, и я не обязан в каждом ответе про include пересказывать её полностью.