PHP - 扩展类的正确方法

时间:2012-05-21 14:16:19

标签: php oop class extend

我目前正在制作一个迷你'框架',我遇到了一些困难。我正在尝试这样做,以加强我对大多数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
    }
}

/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类(以及必要时的其他未来类)。我想就如何有效地完成这项任务提出一些建议。甚至有可能我想出来的方式是向后倾斜,如果是这样的话,请告诉我!!

2 个答案:

答案 0 :(得分:1)

您可以扩展类:

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


?>

__ autoload是一种自动加载类的魔术方法。因此,您可以在FrontController中添加它作为示例,并根据需要加载控制器。在这里阅读自动加载类:

http://php.net/manual/en/language.oop5.autoload.php

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

答案 1 :(得分:1)

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

  • 命名空间:为了更好地组织代码和类
  • 自动加载:以智能方式自动加载课程

命名空间http://php.net/manual/en/language.namespaces.php和自动加载http://php.net/manual/en/language.oop5.autoload.php可在官方文档中查看。

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

  1. 定义并注册自动加载功能

    function autoload($class) {
        preg_match('/^(.+)?([^\\\\]+)$/U', ltrim( $class, '\\' ), $match ) );
        require str_replace( '\\', '/', $match[ 1 ] ). str_replace( [ '\\', '_' ], '/', $match[ 2 ] ). '.php';
    }
    
    spl_autoload_register('autoload');
    
  2. 在您的应用程序周围使用命名空间

  3. 基本控制器

        <?php namespace App\Controller;
    
        class BaseController { ... }
    

    FrontController

        <?php namespace App\Controller;
        use App\Controller\BaseController as BaseController;
    
        class FrontController extends BaseController { ... }