何时使用`public static function createInstance()`而不是通常的构造函数来实现类?

JDe*_*age 2 php design-patterns

我正在研究这段代码: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();
Run Code Online (Sandbox Code Playgroud)

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() {....} 
Run Code Online (Sandbox Code Playgroud)

jwu*_*ler 6

这是PHP的一种解决方法,因为它对于这样的东西来说太愚蠢了:

(new SomeClass())->doSomething();
Run Code Online (Sandbox Code Playgroud)

类似的Oneliners在本机PHP中是不可能的.这就是为什么有些人在静态方法中包装类的实例化以使其成为可能:

SomeClass::create()->doSomething();
Run Code Online (Sandbox Code Playgroud)

它有助于保持范围清洁,因为您不需要额外的变量.它看起来像这样,否则:

$instance = new SomeClass();
$instance->doSomething();
unset($instance);
Run Code Online (Sandbox Code Playgroud)

编辑:让我在这里引述戈登(从评论):"静态调用都是一样把一个函数到全球范围内调用该函数将始终对全球范围的依赖." 您应该了解这一事实,因为它会降低您的代码的灵活性.

  • 应该注意,静态调用与将函数放入全局范围相同.调用它将始终依赖于全局范围.应该避免. (2认同)