gpt4 book ai didi

php - 静态构造函数的最佳实践

转载 作者:IT王子 更新时间:2023-10-28 23:51:58 25 4
gpt4 key购买 nike

我想在一行代码中创建一个类的实例并调用该实例的方法。

PHP 不允许在常规构造函数上调用方法:

new Foo()->set_sth(); // Outputs an error.

所以我正在使用,如果我可以这样调用它的话,一个静态构造函数:

Foo::construct()->set_sth();

这是我的问题:

使用这样的静态构造函数是否被认为是一种好的做法?如果是,您建议如何命名这些静态构造函数的方法?

我一直在犹豫以下选项:

Foo::construct();
Foo::create();
Foo::factory()
Foo::Foo();
constructor::Foo();

最佳答案

正如@koen 所说,静态构造函数(或“命名构造函数”)仅有助于证明意图。

虽然从 5.4 开始,出现了称为“解引用”的东西,它允许您直接通过方法调用内联类实例化。

(new MyClass($arg1))->doSomething(); // works with newer versions of php

因此,静态构造函数仅在您有多种方法实例化对象时才有用。如果您只有一个(总是相同类型的参数和参数数量),则不需要静态构造函数。

但是如果你有多种实例化方式,那么静态构造函数就非常有用,因为它避免了无用的参数检查污染你的主构造函数,削弱了语言约束。

例子:

<?php

class Duration
{
private $start;
private $end;

// or public depending if you still want to allow direct instantiation
private function __construct($startTimeStamp = null, $endTimestamp = null)
{
$this->start = $startTimestamp;
$this->end = $endTimestamp;
}

public static function fromDateTime(\DateTime $start, \DateTime $end)
{
return new self($start->format('U'), $end->format('U'));
}

public static function oneDayStartingToday()
{
$day = new self;
$day->start = time();
$day->end = (new \DateTimeImmutable)->modify('+1 day')->format('U');

return $day;
}

}

正如您在 oneDayStartingToday 中看到的,静态方法可以访问实例的私有(private)字段!疯了吧? :)

有关更好的解释,请参阅 http://verraes.net/2014/06/named-constructors-in-php/

关于php - 静态构造函数的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5368199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com