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

标签 php design-patterns

我正在研究这段代码: http://www.w3style.co.uk/a-lightweight-and-flexible-front-controller-for-php-5

作者在其中使用了一个static 函数来实例化一个类。我基本上是一个初学者,我从来没有见过这个。为什么要使用 static 实例化器而不是通常的构造函数?

代码如下:
索引.php

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

前 Controller .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() {....} 

最佳答案

这是 PHP 的变通方法,因为它对于这样的东西来说太笨了:

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

像这样的单行代码在原生 PHP 中是不可能的。这就是为什么有些人将类的实例化包装在静态方法中以使其成为可能:

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

它有助于保持作用域干净,因为您不需要额外的变量。它看起来像这样,否则:

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

编辑:让我在这里引用 Gordon(来自评论):“静态调用与将函数放入全局范围相同。调用它将始终依赖于全局范围。” 你应该意识到这个事实,因为它会降低你的代码的灵 active 。

关于php - 何时使用 `public static function createInstance()` 而不是通常的构造函数来实例化类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4428316/

相关文章:

PHP 遍历对象数组给出了意想不到的结果

php - 执行另一个 PHP 文件而不等待它完成执行

php - PHP 中是否有空条件运算符?

Eclipse控制台: detect warning and error patterns and make them clickable

Php crypt() 函数返回 "weird results"

javascript - 使用新功能 AJAX 重新加载页面

php - 模块化设计模式

javascript - Durandal TodoMVC - 无法将值写入 ko.compulated

model-view-controller - 在 MVC 中通知观察者的最佳方式?

design-patterns - 有经理设计模式这样的东西吗?