PHP 是否有办法减少 class 和构造函数中参数声明和初始化的重复?
Does PHP have a facility to reduce the duplication of parameter declaration and initialization in the class and the constructor?
考虑在下面写 class:
class SomeClass
{
/** @var array */
private $files;
/** @var string */
private $productName;
/** @var bool */
private $singlePage;
/** @var bool */
private $signatureRequested;
function __construct(array $files, string $productName, bool $singlePage, bool $signatureRequested = true)
{
$this->files = $files;
$this->productName = $productName;
$this->singlePage = $singlePage;
$this->signatureRequested = $signatureRequested;
}
}
$files
,其他参数列出了 4 次 - 您必须键入参数名称然后复制粘贴,或者在上述锅炉模板代码中输入 3 次。有没有办法减少输入所有这些代码所需的工作?
在我看来,理想情况下我想要一些东西,我可以指定我需要在构造函数中初始化一次的参数,并且一些机制将继续并填充剩余的样板代码。
有这样的mechanism/code结构吗?
如果您使用的是 PHPStorm,您可以看看:
PhpStorm shortcut to generate constructor params functionality
我可以使用一些简单的快捷方式生成所有这些。我确定其他 IDE 具有相同的功能。
虽然在写这个问题时答案是“否”,但现在是“是”:Constructor Property Promotion 正是出于这个目的在 PHP 8.0 中添加的。
它的工作方式是在构造函数签名中列出 属性 可见性,并同时声明 属性 和参数。
因此您的整个示例将简化为:
class SomeClass
{
function __construct(
private array $files,
private string $productName,
private bool $singlePage,
private bool $signatureRequested = true
) { }
}
考虑在下面写 class:
class SomeClass
{
/** @var array */
private $files;
/** @var string */
private $productName;
/** @var bool */
private $singlePage;
/** @var bool */
private $signatureRequested;
function __construct(array $files, string $productName, bool $singlePage, bool $signatureRequested = true)
{
$this->files = $files;
$this->productName = $productName;
$this->singlePage = $singlePage;
$this->signatureRequested = $signatureRequested;
}
}
$files
,其他参数列出了 4 次 - 您必须键入参数名称然后复制粘贴,或者在上述锅炉模板代码中输入 3 次。有没有办法减少输入所有这些代码所需的工作?
在我看来,理想情况下我想要一些东西,我可以指定我需要在构造函数中初始化一次的参数,并且一些机制将继续并填充剩余的样板代码。
有这样的mechanism/code结构吗?
如果您使用的是 PHPStorm,您可以看看:
PhpStorm shortcut to generate constructor params functionality
我可以使用一些简单的快捷方式生成所有这些。我确定其他 IDE 具有相同的功能。
虽然在写这个问题时答案是“否”,但现在是“是”:Constructor Property Promotion 正是出于这个目的在 PHP 8.0 中添加的。
它的工作方式是在构造函数签名中列出 属性 可见性,并同时声明 属性 和参数。
因此您的整个示例将简化为:
class SomeClass
{
function __construct(
private array $files,
private string $productName,
private bool $singlePage,
private bool $signatureRequested = true
) { }
}