Инстанция в расширенных классах - PullRequest
0 голосов
/ 22 марта 2012

Я работаю над пользовательской платформой и у меня есть пара вопросов о создании родительских классов в дочерних классах.

Я вставлю некоторые фрагменты кода, а затем перейду к вопросам

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();

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

localhost / childController / index - вызывает функцию index () в классе childController localhost / childController / register - вызывает функцию register () в классе childController

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

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

Мои вопросы:

1) Имеет ли это какое-либо вредное влияние?

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

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

Ответы [ 2 ]

1 голос
/ 22 марта 2012

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

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

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

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

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

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

0 голосов
/ 22 марта 2012

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

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

  2. Помимо того, что написано в 2., вы должны узнать, что такое принципы SOLID, что такое закон Деметры, что такое внедрение зависимостей. И только потом снова попробуйте создать MVC-фреймворк.

...