Note that even though isset/empty works on classes implementing ArrayAccess, array_key_exists does not. At least not in PHP 5.3.
(PHP 5, PHP 7, PHP 8)
ArrayAccess::offsetExists — Определяет, существует ли заданное смещение (ключ)
Определяет, существует или нет данное смещение (ключ).
Данный метод выполняется при использовании isset() или empty() на объектах, реализующих интерфейс ArrayAccess.
Замечание:
При использовании функции empty(), вызывается метод ArrayAccess::offsetGet() и проверка на пустоту произойдёт, только если метод ArrayAccess::offsetExists() вернёт
true
.
offset
Смещение (ключ) для проверки.
Возвращает true
в случае успешного выполнения или false
в случае возникновения ошибки.
Замечание:
Возвращаемое значение будет приведено к логическому типу (bool), если возвращаемое значение не является логическим.
Пример #1 Пример использования ArrayAccess::offsetExists()
<?php
class obj implements ArrayAccess {
public function offsetSet($offset, $value): void {
var_dump(__METHOD__);
}
public function offsetExists($var): bool {
var_dump(__METHOD__);
if ($var == "foobar") {
return true;
}
return false;
}
public function offsetUnset($var): void {
var_dump(__METHOD__);
}
#[\ReturnTypeWillChange]
public function offsetGet($var) {
var_dump(__METHOD__);
return "value";
}
}
$obj = new obj;
echo "Выполняется obj::offsetExists()\n";
var_dump(isset($obj["foobar"]));
echo "\nВыполняется obj::offsetExists() и obj::offsetGet()\n";
var_dump(empty($obj["foobar"]));
echo "\nВыполняется obj::offsetExists(), но *не* obj:offsetGet(), поскольку нечего возвращать\n";
var_dump(empty($obj["foobaz"]));
?>
Вывод приведённого примера будет похож на:
Выполняется obj::offsetExists() string(17) "obj::offsetExists" bool(true) Выполняется obj::offsetExists() и obj::offsetGet() string(17) "obj::offsetExists" string(14) "obj::offsetGet" bool(false) Выполняется obj::offsetExists(), но *не* obj:offsetGet(), поскольку нечего возвращать string(17) "obj::offsetExists" bool(true)
Note that even though isset/empty works on classes implementing ArrayAccess, array_key_exists does not. At least not in PHP 5.3.
It seems that in PHP 7, if this method returns FALSE then offsetGet() will return NULL (in PHP 5, offsetGet() didn't first check what value offsetExists() returned). So if your code suddenly stops working when you upgrade to PHP 7 make sure that offsetExists() returns a sensible value!
If you care about key-strictness, you may need to use an alternative solution (maybe overriding offsetExists() in subclass(es)). So, offsetExists() acts like array_key_exists() and does not handle the key types. Here;
<?php
$array = ['one', 'two', 3.=>'boom!'];
$arrayObject = new ArrayObject($array);
$key = '3';
var_dump(array_key_exists($key, $array)); // bool(true)
var_dump(in_array($key, array_keys($array), true)); // bool(false)
var_dump($arrayObject->offsetExists($key)); // bool(true)
var_dump(in_array($key, array_keys($arrayObject->getArrayCopy()), true)); // bool(false)
// @override;
public function offsetExists($key)
{
// make a strict check
return in_array($key, array_keys($this->getArrayCopy()), true);
}
?>