3v4l.org

run code in 300+ PHP versions simultaneously
<?php class Foo { private int $age; private string $name; public function __construct () { $this->age = rand(12, 60); } } class FooList { private array $elementsList = []; public function setList (array $newList): void { foreach ($newList as $key => $value) { if (!$value instanceof Foo) { throw new Exception("GOVNYAK!!!"); } } $this->elementsList = $newList; } public function getList (): array { return $this->elementsList; } public function addToList (mixed $element): void { // Тут не используется TypeHint, потому что класс FooList на самом деле базовый, от которого наследуются другие. Я ведь не могу сделать что-то типа `addToList ($this->expectedClass $element): void`, проверять приходится в коде. Да и один хрен в коде придётся проверять для метода `setList()`, потому что там тип array, а условное Foo[] в качестве типа в PHP не завезли. if (!$element instanceof Foo) { throw new Exception("GOVNYAK!!!"); } $this->elementsList[] = $element; } public function removeFromList (int $index): void { $tmpList = $this->getList(); array_splice($tmpList, $index, 1); // Вот а если тут ещё какой-то код, который дополнительно преобразовывает массив каким-то образом? Не знаю, сортирует там. И проверяет, чтобы сумма $age всех элементов массива не была больше X и меньше Y. array_splice уже выполнен, и если мы будем выполнять его не над $tmpList, а над $this->elementsList, то элемент один хрен будет удалён. Хотя на самом деле метод должен выкинуть исключение и откатить данные к тому состоянию, которое было до его вызова. $this->setList($tmpList); } } $lst = new FooList(); $fooOne = new Foo(); $fooTwo = new Foo(); $govnyak = new stdClass(); $lst->addToList($fooOne); $lst->addToList($fooTwo); var_dump($lst); $lst->addToList($govnyak);
Output for 8.3.0
object(FooList)#1 (1) { ["elementsList":"FooList":private]=> array(2) { [0]=> object(Foo)#2 (1) { ["age":"Foo":private]=> int(59) ["name":"Foo":private]=> uninitialized(string) } [1]=> object(Foo)#3 (1) { ["age":"Foo":private]=> int(42) ["name":"Foo":private]=> uninitialized(string) } } } Fatal error: Uncaught Exception: GOVNYAK!!! in /in/5UORL:32 Stack trace: #0 /in/5UORL(55): FooList->addToList(Object(stdClass)) #1 {main} thrown in /in/5UORL on line 32
Process exited with code 255.

preferences:
49.64 ms | 406 KiB | 5 Q