2012-03-22 8 views
0

Я работаю над пользовательской структурой и задаю пару вопросов о создании родительского класса через дочерние классы.Создание в расширенных классах

Я вставить некоторые фрагменты кода, а затем попасть в вопросы

class CFrameWork { 

    private $applicationName = "Application Name"; 

    function __construct($instance = "development") { 
     echo "Hello, I am the Parent and I have been constructed<BR />"; 
    } 

    public 
    function startApplication() { 
     $this->checkMaintenanceMode(); 
     if (!isset($_GET['query'])) { 
      $this->intialize(); 
     } else { 
      // Call the appropriate controller 
      // Method and function are pulled from the query 
      // Code not displayed 
      // EDITS BELOW 

      if (method_exists($method, $function)) { 
       try { 
        call_user_func(array(new $method, $function), $this); 
       } catch (CFException $exp) { 
        $this->show404(); 
        exit; 
       } 
      } else { 
       $this->show404(); 
       exit; 
      } 
     } 
    } 

} 

Далее мы имеем класс контроллера

class childController extends CFrameWork { 

    function index() { 
     echo "Index Controller"; 
    } 

    function register() { 
     echo "Registration Controller"; 
    } 
} 

Теперь в index.php, у меня есть

$application = new CFrameWork(); 
$application->startApplication(); 

Способ, которым эта платформа интерпретирует запросы:

локальный/childController/индекс - Вызывает индекс() функция в классе childController локальный/childController/регистрация - Вызывает функцию регистра() в классе childController

и так далее ...

Итак, вот моя забота. Родительский класс в этой структуре запускается дважды каждый раз при вызове метода контроллера. Один раз - index.php (где создается начальное приложение), а затем контроллером при его расширении. Другими словами, CFrameWork :: __ construct() создается снова каждый раз, когда достигается метод контроллера.

Мои вопросы:

1) это имеет какой-либо вредное воздействие?

2) Можно ли этого избежать?

3) Любые предложения о том, как вы это сделаете по-другому?

+1

Вы искали одноточечные рисунки ООП? –

+1

Ваш контроллер, вероятно, не должен расширять класс, запускающий приложение, но класс главного контроллера. – jeremyharris

+3

Сам по себе, 'класс childController extends CFrameWork' имеет плохой запах кода. Контроллер [IS-NOT-A] (http://en.wikipedia.org/wiki/Liskov_substitution_principle), так почему он наследует от одного? – Jon

ответ

1

PHP приложений существуют только в течение очень короткого промежутка времени:

  1. Вы идете на веб-страницу.
  2. Сценарий интерпретируется и генерируется вывод.
  3. Сценарий завершается.

Это ожидаемый и рекомендуемый рабочий процесс большинства языков сценариев, таких как PHP. Это означает, что каждый раз, когда вы обращаетесь к странице, должен быть создан новый класс, поэтому каждый раз будет вызываться конструктор. Таким образом, чтобы ответить на ваши вопросы:

  1. ли это какие-либо вредное воздействие?
    Как правило, нет. Так оно и должно работать. Может ли это иметь вредный эффект для вашего приложения, зависит от того, что вы делаете в конструкторе.

  2. Можно ли этого избежать?
    Этого можно избежать, используя кеширование или сериализацию и сохранение экземпляров класса, но я не могу на всю жизнь найти вескую причину, почему вы хотели бы этого.

  3. Любые предложения о том, как вы это сделаете по-другому?
    Я бы не стал по-другому. Это как должно работать Model-View-Controller pattern. Взгляните на популярные фреймворки, такие как Yii, CodeIgniter, CakePHP - они все делают так, как вы.

+0

@ tereško, можете ли вы сказать мне, что лучше всего писать, делать больше фреймовых фреймов? Я собираюсь переключиться на это. –

0

Это плохо на нескольких уровнях:

    • , как Jon уже указывал, что ваш объект наследования не имеет смысла.
    • childController класс теперь имеет два набора обязанностей: выполнение действий и выполнение маршрутизации, это нарушение SRP. Они должны быть двумя совершенно отдельными классами.
  1. Создать класс, который касается исключительно маршрутизации. Это будет тот, который имеет дело с $_GET['query']. Дайте этому классу метод getControllerName() .. или что-то и getControllerMethod(). Неважно, как вы их называете. Важно то, что результат тысяч методов, которые вы используете для создания нового экземпляра Controller прямо там в index.php и выполните действие над этим контроллером.

  2. Кроме того, что написано в 2., вы должны узнать, что такое СОВЕРШЕННЫЕ принципы, что такое Закон Деметры, что такое инъекция зависимости. И только тогда попытайтесь снова создать структуру MVC.

+0

Во-первых, дочерний контроллер не несет ответственности за выполнение Маршрутизация.Я отредактировал код, чтобы это было ясно. Цель всех дочерних классов - отображать соответствующие представления. Вероятно, теперь это будет яснее. Причина, по которой я расширяю дочерние элементы родителя, заключается в том, что он может обращаться к переменным типа $ applicationName и несколько других переменных. Я ценю конструктивную критику, и я точно знаю, что означает LoD и DI. Нет необходимости быть таким грубым. –

+0

@RohitChopra, так что делает 'startApplication()' do if not * routing *? И как именно я был груб? –