1

我正在为我的最后一年项目学习ArrayAccess接口。我不知道ArrayAccess::offsetSet()的offset参数何时设置为NULL。如php.net中所述。

注意:如果另一个值不可用,偏移参数将设置为 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

谢谢 !

4

2 回答 2

2

正如我们所了解offsetSet()的,接口的方法提供了处理将值分配给实现的对象的偏移量ArrayAccess所需的逻辑: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!" 

此语法类似于未指定偏移量时数组执行推送操作的方式:

$array = []; 
$array[] = 'Alex'; 

当我们实现接口的offsetSet()方法时ArrayAccess,我们可以选择模仿这种行为,或者我们可以执行不同的行为,例如如果我们不想支持空偏移量则抛出异常。ArrayAccess对象不一定需要复制数组的行为。

于 2017-10-08T06:14:38.580 回答
1

你提到了 ArrayAccess,这是接口,如果你在你的类中实现它 - 你将能够将你的类用作数组。

您从手册中复制了关于 offsetSet 方法的句子

注意:如果另一个值不可用,偏移参数将设置为 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'

如果您没有在代码中设置它,您可以看到偏移参数为 NULL,但是如果您使用这样的代码:

$arrayOffset[3] = "third value";

偏移参数将是3

更新: 回答你的问题:

否。如果您想同时支持插入和更新。offsetSet您应该在方法中实现此逻辑。例如:

public function offsetSet($offset, $value)
{
    if (is_null($offset)) {
        $this->data[] = $value;
    } else {
        $this->data[$offset] = $value;
    }
}
于 2017-10-08T06:00:59.537 回答