如果另一个值不可用,则offset参数将设置为NULL。这在php中意味着什么?
我正在为我最后一年的项目学习如何使用ArrayAccess接口。我不知道ArrayAccess::offsetSet()的offset参数何时设置为NULL。如php.net中所述 注意:如果未指定其他值,则偏移参数将设置为NULL 可用,如下面的示例中所示 那么,NULL的概念是什么?谁能说出来 参考链接如果另一个值不可用,则offset参数将设置为NULL。这在php中意味着什么?,php,arrayaccess,Php,Arrayaccess,我正在为我最后一年的项目学习如何使用ArrayAccess接口。我不知道ArrayAccess::offsetSet()的offset参数何时设置为NULL。如php.net中所述 注意:如果未指定其他值,则偏移参数将设置为NULL 可用,如下面的示例中所示 那么,NULL的概念是什么?谁能说出来 参考链接 谢谢 您提到了ArrayAccess,这是一个接口,如果您在类中实现它,您将能够将类用作数组 您从手册中复制了有关偏移集方法的句子 注意:如果另一个值不可用,则offset参数将设置为NUL
谢谢 您提到了ArrayAccess,这是一个接口,如果您在类中实现它,您将能够将类用作数组 您从手册中复制了有关偏移集方法的句子 注意:如果另一个值不可用,则offset参数将设置为NULL,如以下示例所示 这里的示例并不正确,因此我准备了另一个示例: 输出为:
this is MyTest::offsetSet offset: NULL; value: 'first value'
this is MyTest::offsetSet offset: NULL; value: 'second value'
如果不在代码中设置偏移量参数,则可以看到该参数为NULL,但是如果使用这样的代码:
$arrayOffset[3]=“第三个值”代码>
偏移参数将为3
更新:
回答你的问题:
否。如果要同时支持插入和更新。您应该在offsetSet
方法中实现此逻辑。e、 g:
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}
正如我们所了解的,ArrayAccess
接口的offsetSet()
方法提供了将值赋值给实现ArrayAccess
的对象偏移量所需的逻辑:
public function offsetSet($offset, $value)
{
if ($offset === null) {
echo "Offset is NULL!";
} else {
echo "You assigned '$value' to '$offset'.";
}
}
当我们指定一个键为ArrayAccess
对象的偏移量赋值时,PHP将该键传递给offsetSet()
:
但是,如果我们不提供键,PHP会将offsetSet()
的第一个参数的值设置为null
:
$arrayAccess[] = 'Alex';
// Outputs: "Offset is NULL!"
此语法类似于未指定偏移量时数组执行推送操作的方式:
$array = [];
$array[] = 'Alex';
当我们实现ArrayAccess
接口的offsetSet()
方法时,我们可以选择模仿这种行为,或者我们可以执行不同的行为,例如,如果我们不想支持空偏移量,则抛出异常ArrayAccess
对象不一定需要复制数组的行为。因此这意味着如果没有分配偏移量,offsetSet()第一个参数偏移量将接收空值?但是在插入到数组中的过程中,偏移量将根据插入位置而不是空值进行分配?哈?@MummyDaddy是的,没错ArrayAccess
允许我们选择当偏移量为空时,是希望对象的行为类似于array
,还是让它执行其他操作。查看更新!是,如果不在代码中设置第一个参数,则该参数将为null。在php数组语法中,如果不设置偏移量,则基本上表示“array_push($array,“your value”);`,您没有提供偏移量,这就是为什么它为Null,并且在插入过程中,偏移量将根据位置在数组中分配,而不是Null,是吗?
$arrayAccess['name'] = 'Alex';
// Outputs: "You assigned 'Alex' to 'name'."
$arrayAccess[] = 'Alex';
// Outputs: "Offset is NULL!"
$array = [];
$array[] = 'Alex';