Я только что нашел что-то "немного странное" в 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
тип. Что, конечно, имеет смысл. Проблема, однако, в том, что если они окажутся такими, как вы, вы не сможете l oop над ними, они просто будут опущены - без ошибок, без всего, что вы можете видеть во втором примере. Поэтому я просто теряю к ним доступ.
Это имеет смысл, но просто представьте, что у вас есть собственный класс запросов / данных, подобный этому:
namespace App\Request\Request\Post;
use App\Request\Request\Request;
class GetPostsRequest extends Request
{
public string $title = '';
}
Видите ли вы это уродливое строковое назначение? Если я хочу сделать свои свойства в классе итеративными, то мне нужно:
- отбросить типы
- назначить фиктивные значения
Я мог бы захотеть иметь объект с типизированными свойствами без каких-либо значений в них до l oop над ними и заполнять их, если это имеет смысл.
Есть ли лучший способ сделать это? Есть ли возможность сохранять типы и поддерживать их повторяемость, не прибегая к этим мерзким мерзостным значениям?