Я написал простой PHP-класс, реализующий интерфейс ArrayAccess:
class MyArray implements ArrayAccess
{
public $value;
public function __construct($value = null)
{
$this->value = $value;
}
public function &offsetGet($offset)
{
var_dump(__METHOD__);
if (!isset($this->value[$offset])) {
throw new Exception('Undefined index: ' . $offset);
}
return $this->value[$offset];
}
public function offsetExists($offset)
{
var_dump(__METHOD__);
return isset($this->value[$offset]);
}
public function offsetSet($offset, $value)
{
var_dump(__METHOD__);
$this->value[$offset] = $value;
}
public function offsetUnset($offset)
{
var_dump(__METHOD__);
$this->value[$offset] = null;
}
}
Нормально работает в PHP 7, но проблема в PHP 5.6 и HHVM.
Если я вызову функцию isset()
для неопределенного индекса, PHP вызовет offsetGet()
вместо offsetExists()
, что вызовет уведомление Undefined index
.
В PHP 7 он вызывает offsetGet()
, только если offsetExists()
возвращает true
, поэтому ошибки нет.
Я думаю, что это связано с ошибкой PHP 62059.
Код доступен на 3V4L, так что вы можете увидеть, что не так. Я добавил еще несколько отладочных вызовов и выдал исключение, если индекс не определен, поскольку уведомления не отображаются в 3V4L: https://3v4l.org/7C2Fs
Не должно быть никаких уведомлений, иначе тесты PHPUnit не пройдут. Как я могу исправить эту ошибку?
offsetSet
. - person zerkms   schedule 05.08.2018isset
, чтобы проверить, существует ли ключ, прежде чем обращаться к нему. - person zerkms   schedule 05.08.2018offsetGet
? - person Filip Š   schedule 05.08.2018