2012-05-21 2 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"; 
    } 
} 

Так что я хотел бы быть в состоянии сделать это продлить BaseController с FrontController. Я полагал, что расширение BaseController позволит мне добавить общую функциональность ко всему моему приложению. Проблема в том, что я не уверен, как это сделать должным образом. Я знаю, что мне нужно «потребовать» BaseController.php в FrontController.php, но я видел много разных способов, и я хочу знать, что является наиболее правильным.

То, что я попробовал, просто добавляет «require_once («/application/BaseController.php »); вверху FrontController.php, а затем расширяя класс FrontController, но это не работает (пустая страница) и из того, что я прочитал, это не лучший способ.

Я прочитал в __autoload(), но я не понимаю, как использовать его эффективно. Я просто поместил это в начало моего файла FrontController.php и расширил мой класс после этого?

Итак, чтобы обобщить, я хотел бы расширить мой класс FrontController (и другие будущие классы, когда это необходимо) с помощью моего BaseController. Мне просто хотелось бы дать совет о том, как эффективно выполнять эту задачу. Возможно, даже возможно, что так, как я это продумал, задница назад, и если это так, пожалуйста, дайте мне знать!

ответ

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

Независимо от того, какой класс обрабатывает маршрутизацию, вы должны добавить туда автозагрузку. Кажется, ваш метод go уже делает это. __autoload - это просто вспомогательный метод, похожий на _set и _get. Они автоматизируют проблемы, с которыми разработчики сталкивались вручную с годами. –

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. Использование разделяет пространства имен вокруг вашего приложения

регуляторе

<?php namespace App\Controller; 

    class BaseController { ... } 

FrontController

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

    class FrontController extends BaseController { ... } 
Смежные вопросы