PHP 7.4类型属性迭代

问题描述 投票:0回答:1

我刚刚发现了有关PHP 7.4的一些“奇怪的东西”,但我不确定这是否只是我遗漏了一些东西,或者可能是一个实际的错误。我通常对您的意见/确认感兴趣。

因此,在PHP中,您可以像这样遍历对象属性:

class DragonBallClass 
{
    public $goku;
    public $bulma = 'Bulma';
    public $vegeta = 'Vegeta';
}

$dragonBall = new DragonBallClass();

foreach ($dragonBall as $character) {
  var_dump($character);

}

RESULT

NULL
string(5) "Bulma"
string(6) "Vegeta"

现在,如果我们开始使用像这样的强类型属性:

class DragonBallClass 
{
    public string $goku;
    public string $bulma = 'Bulma';
    public string $vegeta = 'Vegeta';
}

$dragonBall = new DragonBallClass();

foreach ($dragonBall as $character) {
  var_dump($character);

}

我们将得到不同的结果:

string(5) "Bulma"
string(6) "Vegeta"

现在有什么不同:

当您不为强类型属性分配默认值时,它将是Uninitialized类型。哪个当然有意义。问题是,如果它们以这种方式结束,您将无法遍历它们,它们将被简单地省略-没有错误,没有任何东西,如您在第二个示例中看到的那样。因此,我只是无法访问它们。

这很有意义,但请想象您有一个自定义的Request / Data类,如下所示:

namespace App\Request\Request\Post;

use App\Request\Request\Request;

class GetPostsRequest extends Request
{
    public string $title = '';
}

您看到那个难看的字符串分配吗?如果我想使类的属性可迭代,则必须:

  • 拖放类型
  • 分配虚拟值

我可能希望有一个带有类型化属性的对象,但其中没有任何值来遍历它们并在可行时填充它们。

还有其他更好的方法吗?是否可以选择保留类型并保持可迭​​代性,而不必进行此伪值可憎的操作?

php types iteration php-7 php-7.4
1个回答
1
投票

如果要允许类型化的属性为空,则可以在类型之前简单地添加?并将NULL作为默认值,就像这样:

class DragonBallClass 
{
    public ?string $goku = NULL;
    public string $bulma = 'Bulma';
    public string $vegeta = 'Vegeta';
}

在这种情况下,NULL是一个完全合法的值(而不是虚拟值)。

© www.soinside.com 2019 - 2024. All rights reserved.