我正在为我的最后一年项目学习 ArrayAccess 界面。我不知道 ArrayAccess :: offsetSet()的偏移参数何时设置为 NULL 。如 php.net 中所述。
注意:如果不是另一个值,则offset参数将设置为NULL 可用,如下例所示。
<?php
$arrayaccess[] = "first value";
$arrayaccess[] = "second value";
print_r($arrayaccess);
?>
以上示例将输出:
Array
(
[0] => first value
[1] => second value
)
那么 NULL 的概念是什么?有谁能说出来?
参考链接http://php.net/manual/en/arrayaccess.offsetset.php。
谢谢!
答案 0 :(得分:1)
你提到了ArrayAccess,这是界面,如果你在你的类中实现它 - 你将能够将你的类用作数组。
您从手册中复制了有关offsetSet方法的句子
注意:如果没有其他值,则offset参数将设置为NULL,如下例所示。
那里的例子并不正确,所以我准备另一个:
http://sandbox.onlinephpfunctions.com/code/baedfadc9bd6bbfbde5ef7152e8c4e7d4a1d99e2
输出是:
this is MyTest::offsetSet offset: NULL; value: 'first value'
this is MyTest::offsetSet offset: NULL; value: 'second value'
如果你没有在代码中设置它,你可以看到offset参数是NULL,但是如果你使用这样的代码:
$arrayOffset[3] = "third value";
偏移参数将为3
<强>更新强> 回答你的问题:
没有。如果要同时支持,插入和更新。您应该在offsetSet
方法中实现此逻辑。 e.g:
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}
答案 1 :(得分:1)
正如我们已经了解的那样,offsetSet()
接口的ArrayAccess
方法提供了将值的赋值处理为 offset <所需的逻辑/ em>实现ArrayAccess
的对象:
public function offsetSet($offset, $value)
{
if ($offset === null) {
echo "Offset is NULL!";
} else {
echo "You assigned '$value' to '$offset'.";
}
}
当我们指定一个键来为ArrayAccess
对象的偏移量赋值时,PHP将密钥传递给offsetSet()
:
$arrayAccess['name'] = 'Alex';
// Outputs: "You assigned 'Alex' to 'name'."
但是,如果我们不提供密钥,PHP会将offsetSet()
的第一个参数的值设置为null
:
$arrayAccess[] = 'Alex';
// Outputs: "Offset is NULL!"
此语法类似于未指定偏移量时数组执行 push 操作的方式:
$array = [];
$array[] = 'Alex';
当我们实现offsetSet()
接口的ArrayAccess
方法时,我们可以选择模仿此行为,或者我们可以执行不同的行为,例如,如果我们不这样做则抛出异常想要支持空偏移。 ArrayAccess
个对象不一定需要来复制数组的行为。