<?php
final class Options {
// This is OK but why redundant initialization?
// public array $stack = [];
public array $stack;
public function __construct(array $stack) {
$this->stack = $stack;
}
public function __set(string $name, $value) {
// if (empty($this->stack)) {
// // This line below yields: object(acme\Options)#1 (0) { ["stack"]=> uninitialized(array) }.
// // return;
// // This line below yields: object(acme\Options)#1 (1) { ["stack"]=> array(1) { ["stack"]=> array(1) { ["one"]=> int(1) } } }.
// // $this->stack = [];
// }
// This is solving problem but the purpose is not that also corrupting $stack structure inserting a new sub-array.
// object(acme\Options)#1 (1) { ["stack"]=> array(2) { ["one"]=> int(1) ["stack"]=> array(1) { ["one"]=> int(1) } } }
// $this->stack = $value;
// This is indicating that __set called before (before __construct).
// throw new \Exception();
// This is problematic part.
$this->stack[$name] = $value;
}
public function __get(string $name) {
// This is indicating that __get called before (before __construct).
// throw new \Exception();
return $this->stack[$name] ?? null;
}
}
var_dump(new Options(['one' => 1]));
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
object(Options)#1 (1) {
["stack"]=>
array(1) {
["one"]=>
int(1)
}
}
Parse error: syntax error, unexpected 'array' (T_ARRAY), expecting function (T_FUNCTION) or const (T_CONST) in /in/VJFBK on line 6
Process exited with code 255.