我目前正在开发一个迷你'框架',我遇到了一些困难。我正在尝试这样做,以加强我对大多数MVC中使用的基本概念的理解(至少从我所看到的(。所以,是的,我确实明白使用框架可能更容易,并不是我所做的一切都是理想的。我只是想了解更多。
所以我目前正在处理 2 个文件。
前端控制器.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";
}
}
因此,我希望能够做的是使用FrontController扩展BaseController。我认为扩展 BaseController 将允许我为整个应用程序添加通用功能。问题是我不确定如何正确地做到这一点。我知道我需要以某种方式"要求"BaseController.php进入FrontController.php但是我已经看到了许多不同的方法,我想知道哪种方法最正确。
我尝试只是简单地将"require_once("/application/BaseController.php"(;"添加到FrontController的顶部.php然后扩展FrontController类,但这不起作用(空白页(,从我所读到的内容来看,这不是最好的方法。
我读了__autoload((,但我不明白如何有效地使用它。我是否只是把它放在我的 FrontController.php 文件的顶部,然后扩展我的类?
因此,总而言之,我想用我的 BaseController 扩展我的 FrontController 类(以及必要时的其他未来类(。我只是想就如何有效地完成这项任务提供一些建议。甚至有可能我的想法是倒退,如果是这样的话,请告诉我!!
扩展类如下:
<?php
class FrontController extends BaseController {
..code...
}
?>
__autoload是一种自动加载类的神奇方法。因此,您可以将其作为示例添加到前端控制器中,并根据需要加载控制器。在此处阅读有关自动加载类的信息:
http://php.net/manual/en/language.oop5.autoload.php
此外,利用PHP中的SPL,这将有助于更好地定义您的应用程序。
的框架和你未来的项目提供更好的结构,我建议你使用一些技巧和最佳实践。
- 命名空间:为了更好地组织代码和类
- 自动加载:用于以智能方式自动加载您的类
可以在官方文档中查看命名空间 http://php.net/manual/en/language.namespaces.php 和自动加载 http://php.net/manual/en/language.oop5.autoload.php。
为了更好地理解,你可以看看这里
定义和注册自动加载功能
function autoload($class) { preg_match('/^(.+)?([^'''']+)$/U', ltrim( $class, '''' ), $match ) ); require str_replace( '''', '/', $match[ 1 ] ). str_replace( [ '''', '_' ], '/', $match[ 2 ] ). '.php'; } spl_autoload_register('autoload');
在应用程序周围使用命名空间
基本控制器
<?php namespace App'Controller;
class BaseController { ... }
前端控制器
<?php namespace App'Controller;
use App'Controller'BaseController as BaseController;
class FrontController extends BaseController { ... }