我刚刚发现了有关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 = '';
}
您看到那个难看的字符串分配吗?如果我想使类的属性可迭代,则必须:
我可能希望有一个带有类型化属性的对象,但其中没有任何值来遍历它们并在可行时填充它们。
还有其他更好的方法吗?是否可以选择保留类型并保持可迭代性,而不必进行此伪值可憎的操作?
如果要允许类型化的属性为空,则可以在类型之前简单地添加?
并将NULL
作为默认值,就像这样:
class DragonBallClass
{
public ?string $goku = NULL;
public string $bulma = 'Bulma';
public string $vegeta = 'Vegeta';
}
在这种情况下,NULL
是一个完全合法的值(而不是虚拟值)。