我刚刚发现关于 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
类型。这当然是有道理的。问题是,如果它们以这样的方式结束,您将无法遍历它们,它们将被简单地省略 - 没有错误,没有任何东西,正如您在第二个示例中看到的那样。所以我只是无法访问它们。
这是有道理的,但想象一下你有一个这样的自定义请求/数据类:
namespace App\Request\Request\Post;
use App\Request\Request\Request;
class GetPostsRequest extends Request
{
public string $title = '';
}
你看到那个丑陋的字符串赋值了吗?如果我想让我的类上的属性可迭代,那么我必须:
- 掉落类型
- 分配虚拟值
我可能想要一个具有类型化属性的对象,其中没有任何值来循环它们并在有意义的情况下填充它们。
有没有更好的方法来做到这一点?是否有任何选项可以保留类型并保持可迭代而不必执行这种虚拟值可憎?