ArrayAccess::offsetExists

(PHP 5, PHP 7, PHP 8)

ArrayAccess::offsetExistsComprobar si existe un índice

Descripción

public ArrayAccess::offsetExists(mixed $offset): bool

Comprueba si existe o no un índice.

Este método se ejecuta cuando se utilizan las funciones isset() o empty() sobre los objetos que implementan ArrayAccess.

Nota:

Cuando se utiliza empty(), ArrayAccess::offsetGet() será invocada para comprobar si está vacío solamente si ArrayAccess::offsetExists() devuelve true.

Parámetros

offset

El índice a comprobar.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Nota:

El valor de retorno se debe convertir a bool si no devuelve un valor boleano.

Ejemplos

Ejemplo #1 Ejemplo de 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
"Runs obj::offsetExists()\n";
var_dump(isset($obj["foobar"]));

echo
"\nRuns obj::offsetExists() and obj::offsetGet()\n";
var_dump(empty($obj["foobar"]));

echo
"\nRuns obj::offsetExists(), *not* obj:offsetGet() as there is nothing to get\n";
var_dump(empty($obj["foobaz"]));
?>

El resultado del ejemplo sería algo similar a:

Runs obj::offsetExists()
string(17) "obj::offsetExists"
bool(true)

Runs obj::offsetExists() and obj::offsetGet()
string(17) "obj::offsetExists"
string(14) "obj::offsetGet"
bool(false)

Runs obj::offsetExists(), *not* obj:offsetGet() as there is nothing to get
string(17) "obj::offsetExists"
bool(true)

add a note add a note

User Contributed Notes 3 notes

up
5
driezasson at icloud dot com
9 years ago
Note that even though isset/empty works on classes implementing ArrayAccess, array_key_exists does not. At least not in PHP 5.3.
up
0
Martin Q
4 years ago
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!
up
0
kgun ! mail ! com
5 years ago
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);
}
?>
To Top