В настоящее время я работаю над мини-фреймворком, и у меня возникают некоторые трудности. Я пытаюсь это сделать, чтобы укрепить мое понимание базовых понятий, используемых в большинстве MVC (по крайней мере, из того, что я видел). Так что да, я понимаю, что использование структуры может быть проще, и не все, что я делаю, идеально. Я просто пытаюсь узнать больше.PHP - Правильный способ расширения класса
У меня есть 2 файла, с которыми я сейчас работаю.
FrontController.php
<?php
class FrontController {
public function __construct() {
$this->go(); // RUNS GO FUNCTION UPON LOADING
}
public function go() {
$url = $_SERVER['REQUEST_URI']; // GRABS URL
$action = explode("/", $url); // SPLITS UP URL INTO SECTIONS
$object = ucfirst($action[2]) . "Controller"; // SETS 2ND SECTION OF URL TO UPPERCASE AND IDENTIFIES THE CONTROLLER
$file = APP_DIR . "/" . $object . ".php"; // IDENTIFIES THE FILE THAT WILL BE USED
if(!is_file($file)){ // DETERMINES IF FILE EXISTS
$this->fail(); // IF NOT, FAILS
} else {
require_once $file; // IF EXISTS, PULLS IT IN
$method = ucfirst($action[3]); // THE 3RD SECTION OF THE URL IS THE METHOD
$controller = new $object(); // CREATE INSTANCE OF THE IDENTIFIED OBJECT
if(!method_exists($controller, $method)){ // DETERMINES IF METHOD EXISTS IN THE CLASS
$this->fail(); // IF NOT, FAILS
}
$controller->$method(); // RUN METHOD
exit(0);
}
}
public function fail() {
echo "<h1>Failure</h1>"; // FAILURE MESSAGE
}
}
/application/BaseController.php
<?php
class BaseController {
public function __construct() {
$this->session();
}
public function session() {
session_start();
$_SESSION['is_logged_in'] = 1;
echo "hi";
}
}
Так что я хотел бы быть в состоянии сделать это продлить BaseController с FrontController. Я полагал, что расширение BaseController позволит мне добавить общую функциональность ко всему моему приложению. Проблема в том, что я не уверен, как это сделать должным образом. Я знаю, что мне нужно «потребовать» BaseController.php в FrontController.php, но я видел много разных способов, и я хочу знать, что является наиболее правильным.
То, что я попробовал, просто добавляет «require_once («/application/BaseController.php »); вверху FrontController.php, а затем расширяя класс FrontController, но это не работает (пустая страница) и из того, что я прочитал, это не лучший способ.
Я прочитал в __autoload(), но я не понимаю, как использовать его эффективно. Я просто поместил это в начало моего файла FrontController.php и расширил мой класс после этого?
Итак, чтобы обобщить, я хотел бы расширить мой класс FrontController (и другие будущие классы, когда это необходимо) с помощью моего BaseController. Мне просто хотелось бы дать совет о том, как эффективно выполнять эту задачу. Возможно, даже возможно, что так, как я это продумал, задница назад, и если это так, пожалуйста, дайте мне знать!
Так это будет выходить за пределы фактического класса в FrontController.php файл? Разве это не сделало бы это бесполезным для моих нужд? Он будет использоваться только для этого единственного экземпляра. Я не уверен, как реализовать его, чтобы его можно было повторно использовать. – ohiock
Я обновил свой ответ - забыл обернуть мой пример кода. –
Независимо от того, какой класс обрабатывает маршрутизацию, вы должны добавить туда автозагрузку. Кажется, ваш метод go уже делает это. __autoload - это просто вспомогательный метод, похожий на _set и _get. Они автоматизируют проблемы, с которыми разработчики сталкивались вручную с годами. –