2012-05-21 127 views
1

我目前正在研究一個迷你的'框架',我有一些困難。我試圖這樣做是爲了加強我對大多數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"; 
    } 
} 

所以我想什麼,能夠做的是FrontController設計延長BaseController。我認爲擴展BaseController將允許我爲我的整個應用程序添加通用功能。問題是我不確定如何正確地做到這一點。我知道我需要以某種方式'需要'BaseController.php到FrontController.php中,但是我看到了很多不同的方法,我想知道哪一個最正確。

我試過的只是簡單的添加'require_once(「/ application/BaseController.php」);'到FrontController.php的頂部,然後擴展FrontController類,但這不起作用(空白頁),從我讀過的內容來看,這不是最好的方法。

我讀入__autoload(),但我不明白如何有效地使用它。我只是把它放在我的FrontController.php文件的頂部,然後擴展我的類嗎?因此,總結一下,我想用我的BaseController擴展我的FrontController類(以及其他未來的類,必要時)。我想就如何有效完成這項任務提供一些建議。我想這個想法的方式甚至有可能是倒退,如果是這樣的話,請讓我知道!

回答

1

您擴展類,如:

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


?> 

__autoload是自動加載類的魔術方法。所以你可以在你的FrontController中加入這個例子並根據需要加載你的控制器。閱讀關於這裏的自動加載類:

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

此外,利用SPL的在PHP中,這將有助於定義應用程序更好。

+0

所以這會去實際課堂外的FrontController.php文件?這不會讓我的需求變得毫無用處嗎?它只會用於這個單一實例。我不知道如何實現它,以便它可以被重用。 – ohiock

+0

我更新了我的答案 - 忘記包裝我的代碼示例。 –

+0

無論什麼類處理路由,你都會在那裏添加自動加載。儘管你的方法似乎已經這樣做了。 __autoload只是一個輔助方法,很像_set和_get。他們自動化了開發人員多年來手動處理的問題。 –

1

爲了給你的框架和你的未來項目提供更好的結構,我建議你使用一些技巧和最佳實踐。

自動加載的類。

爲了更好地瞭解你可以採取這裏

  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. 使用在你的應用程序命名空間

基本控制器

<?php namespace App\Controller; 

    class BaseController { ... } 

FrontController

<?php namespace App\Controller; 
    use App\Controller\BaseController as BaseController; 

    class FrontController extends BaseController { ... }