php 什么时候使用`public static function createInstance()`而不是通常的构造函数来示例化类?

zsohkypk  于 2023-08-02  发布在  PHP
关注(0)|答案(3)|浏览(78)

我正在研究这段代码: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() {....}

dm7nw8vv

dm7nw8vv1#

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

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

字符串
这样的Oneliner在原生PHP中是不可能的。这就是为什么有些人将类的示例化 Package 在静态方法中以使其成为可能:

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


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

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

**编辑:**让我在这里引用戈登(从评论):

静态调用与将函数放入全局范围相同。调用它将始终依赖于全局作用域。
您应该意识到这一事实,因为它会降低代码的灵活性。

lokaqttq

lokaqttq2#

最常见的情况是您想要创建一个单例示例,或者使用工厂模式。

gdx19jrr

gdx19jrr3#

PHP只允许 * 一个 * 构造函数,这意味着如果你想有一种以上的方式来构造一个对象,多个静态函数被认为是一个有效的解决方案。然而,仅仅拥有一个调用构造函数的静态函数似乎没有多大意义。
例如,可以有一个构造函数,它为对象的每个属性获取参数。还有一个静态函数,它只接受一个id,并执行一个数据库调用来检索所有属性以检索对象。这意味着您不必在调用代码中包含所有数据库过程。静态函数负责。
经常有人建议创建一个单独的Factory类来实现这一点,但我认为这并不总是有意义的。如果对你有意义的话,你应该在做决定之前先了解一下这个问题。

相关问题