PHP—扩展类的正确方法

PHP—扩展类的正确方法,php,oop,class,extend,Php,Oop,Class,Extend,我目前正在研究一个小型“框架”,我遇到了一些困难。我尝试这样做是为了加强我对大多数MVC中使用的基本概念的理解(至少从我所看到的情况来看)。所以,是的,我明白使用一个框架可能更容易,而且我所做的并不是每件事都是理想的。我只是想了解更多 因此,我有2个文件,我目前正在处理 FrontController.php <?php class FrontController { public function __construct() { $this->go()

我目前正在研究一个小型“框架”,我遇到了一些困难。我尝试这样做是为了加强我对大多数MVC中使用的基本概念的理解(至少从我所看到的情况来看)。所以,是的,我明白使用一个框架可能更容易,而且我所做的并不是每件事都是理想的。我只是想了解更多

因此,我有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
    }
}
<?php   
class BaseController {
    public function __construct() {
        $this->session();
    }

    public function session() {
        session_start();
        $_SESSION['is_logged_in'] = 1;
        echo "hi";
    }
}

您可以扩展如下类:

<?php
class FrontController extends BaseController {
 ..code...
}


?>

__自动加载是一种神奇的方法,它可以自动加载类。因此,您可以将其添加到FrontController中作为示例,并根据需要加载控制器。在此处阅读有关自动加载类的信息:


另外,利用PHP中的SPL,这将有助于更好地定义您的应用程序。

为了在您的框架和未来的项目中提供更好的结构,我建议您使用一些技巧和最佳实践

  • 名称空间:用于更好地组织代码和类
  • 自动加载:以智能方式自动加载类
可以在官方文档中查看名称空间和自动加载

为了更好地理解,你可以看看这里

  • 定义并注册自动加载功能

    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 { ... }
    

    那么这将超出FrontController.php文件中的实际类?这难道不足以满足我的需要吗?它将仅用于此单个实例。我不知道如何实现它以便可以重用。无论哪个类处理路由,您都应该在那里添加自动加载。不过,您的go方法似乎已经在这样做了__自动加载仅仅是一种辅助方法,非常类似于_set和_get。它们自动化了开发人员多年来手动处理的问题。我会回顾一下像CodeIgniter这样的框架,看看它们如何处理加载类。我还应该注意,框架通常使用一个加载类,由您的控制器启动。然后所有的子类都可以访问这个加载类来使用。我想这回答了我的问题,但我仍然觉得有些事情对我来说是未知的。你帮不了什么忙,我感谢你的努力。非常感谢。