Когда использовать «открытую статическую функцию createInstance ()» вместо обычного конструктора для создания экземпляра класса? - PullRequest
2 голосов
/ 13 декабря 2010

Я изучаю этот код: http://www.w3style.co.uk/a-lightweight-and-flexible-front-controller-for-php-5

В нем автор использует функцию static для создания экземпляра класса.Я в основном начинающий, и я никогда не видел этого.Почему нужно использовать static экземпляр, а не обычный конструктор?

Вот код:
index.php

<?php
define("PAGE_DIR", dirname(__FILE__) . "/pages");
require_once "FrontController.php";
FrontController::createInstance()->dispatch();

FrontController.php

<?php
class FrontController {
  public static function createInstance() {
    if (!defined("PAGE_DIR")) {
      exit("Critical error: Cannot proceed without PAGE_DIR.");
    }
    $instance = new self();
    return $instance;
  }
  public function dispatch() {....} 

Ответы [ 3 ]

6 голосов
/ 13 декабря 2010

Это обходной путь для PHP, поскольку он слишком глуп для таких вещей:

(new SomeClass())->doSomething();

Подобные единицы невозможны в нативном PHP.Вот почему некоторые люди оборачивают создание экземпляра класса в статический метод, чтобы сделать это возможным:

SomeClass::create()->doSomething();

Это помогает поддерживать чистоту области видимости, поскольку вам не нужны дополнительные переменные.В противном случае это выглядело бы следующим образом:

$instance = new SomeClass();
$instance->doSomething();
unset($instance);

РЕДАКТИРОВАТЬ: позвольте мне процитировать Гордона здесь (из комментариев): "Статические вызовы аналогичны помещению функцииглобальная область видимости. Вызов ее всегда будет зависеть от глобальной области видимости. " Вам следует помнить об этом факте, поскольку он делает ваш код менее гибким.

2 голосов
/ 13 декабря 2010

Наиболее распространенные ситуации - это когда вы хотите создать одноэлементный экземпляр или использовать фабричный шаблон.

1 голос
/ 13 декабря 2010

PHP допускает только один конструктор, что означает, что если вы хотите иметь более одного способа создания объекта, то несколько статических функций считаются правильным решением. Однако просто иметь статическую функцию, которая вызывает конструктор, похоже, не имеет особого смысла.

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

Часто для этого предлагается создать отдельный класс Factory, но я не думаю, что это всегда имеет смысл. Вы должны прочитать эту тему, прежде чем принимать решение, если оно имеет смысл для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...