- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个类,即 foo 和 Bar
class bar extends foo
{
public $element = null;
public function __construct()
{
}
}
类 foo 为
class foo implements ArrayAccess
{
private $data = [];
private $elementId = null;
public function __call($functionName, $arguments)
{
if ($this->elementId !== null) {
echo "Function $functionName called with arguments " . print_r($arguments, true);
}
return true;
}
public function __construct($id = null)
{
$this->elementId = $id;
}
public function offsetSet($offset, $value)
{
if (is_null($offset)) {
$this->data[] = $value;
} else {
$this->data[$offset] = $value;
}
}
public function offsetExists($offset)
{
return isset($this->data[$offset]);
}
public function offsetUnset($offset)
{
if ($this->offsetExists($offset)) {
unset($this->data[$offset]);
}
}
public function offsetGet($offset)
{
if (!$this->offsetExists($offset)) {
$this->$offset = new foo($offset);
}
}
}
我希望当我运行下面的代码时:
$a = new bar();
$a['saysomething']->sayHello('Hello Said!');
应该从 foo 的 __call 魔术方法返回 Function sayHello Called with arguments Hello Said!。
在这里,我想说的是 saysomething 应该从 foo 的 __construct 函数和 sayHello 传入 $this->elementId 应该作为 method 并且 Hello Said 应该作为 parameters 用于 sayHello 函数,它将从 __call 呈现魔术方法。
此外,需要链接方法,如:
$a['saysomething']->sayHello('Hello Said!')->sayBye('Good Bye!');
最佳答案
如果我没记错的话,你应该把 foo::offsetGet()
改成这样:
public function offsetGet($offset)
{
if (!$this->offsetExists($offset)) {
return new self($this->elementId);
} else {
return $this->data[$offset];
}
}
如果在给定的偏移处没有元素,它返回一个自身的实例。
也就是说,foo::__construct()
也应该从 bar::__construct()
调用,并且 传递一个值除了null
:
class bar extends foo
{
public $element = null;
public function __construct()
{
parent::__construct(42);
}
}
更新
要链式调用,您需要从 __call()
返回实例:
public function __call($functionName, $arguments)
{
if ($this->elementId !== null) {
echo "Function $functionName called with arguments " . print_r($arguments, true);
}
return $this;
}
关于PHP 实现 ArrayAccess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21825768/
编辑:我意识到文字的数量可能令人生畏。本题实质: 如何以可以设置多维值的方式实现 ArrayAccess? 我知道有人对此进行了讨论 here已经,但我似乎无法正确实现 ArrayAccess 接口(
我一直在SPL 上阅读PHP 的常用接口(interface),例如Iterator、Countable 和ArrayAccess。但是,我不明白它们是如何工作的。 他们的实现是否修改了 PHP 的核
我有两个类,即 foo 和 Bar class bar extends foo { public $element = null; public function __construc
我如何在我的静态类中使用数组访问?F.e.我喜欢执行下一个脚本: class A { ... } A['p'] = 15; echo isset(A['p']) ? A['p'] : 0; 最佳
假设我有以下代码: var = array( 'a' => array('b' => 'c'), 'd' => array('e' => 'f'),
array_values() 不适用于 ArrayAccess 对象。array_keys() 也没有 为什么? 如果我可以访问 $object['key'] 我应该能够进行所有类型的数组操作 最佳答
这两个有什么区别?从 API 文档来看,它们似乎是为了做完全相同的事情。 ArrayAccess 对比 ArrayIndex 在这种情况下,它们似乎是多余的,所以我一定在这里遗漏了一些东西。 最佳答案
首先,引用关于 ArrayAccess::offsetSet() 的 ole' 手册: This function is not called in assignments by reference
我有一个实现 ArrayAccess 的类,我正试图让它与多维数组一起工作。 exists 和 get 起作用。 set 和 unset 给我带来了问题。 class ArrayTest implem
我正在使用提供的解决方案将批量操作的复选框添加到 CRUD 列表 here . 但是,我的结果是用 Pagerfanta 分页的,所以我似乎需要在我的表单中使用 DataMapper。 我尝试了各种解
有什么办法可以使用array_merge() , array_pop() , .. 可以与 ArrayAccess 一起使用的函数吗? 从现在开始我已经尝试过Iterate接口(interface)和
当一个类实现了ArrayAccess 接口(interface)时,它就可以作为数组发挥作用,完成 OffsetGet、OffsetSet 等。 我没有看到的一件事是当我们想要 count() 或 s
我的表单有问题,每次我想保存评论时都会出现此错误: Expected argument of type array or Traversable and ArrayAccess, object giv
我需要转型 xyz[3].aaa[1].bbb[2].jjj 至 getXyz(3).getAaa(1).getBbb(2).getJjj() 使用JDT核心。 用一些 getter 方法替换 Arr
这是我尝试实现 https://www.php.net/manual/en/class.iterator.php对于 ArrayAccess。许多示例使用容器数组作为私有(private)成员变量;但
我有一个对象,它是对象的集合,表现得像一个数组。它是一个数据库结果对象。类似于以下内容: $users = User::get(); foreach ($users as $user) ech
在 PHP 中实现 ArrayAccess 接口(interface),我们可以访问对象属性作为数组键。让对象的行为像数组有什么好处? 就像我看到使用 ArrayAccess Interface 实现
我有以下文件: obj = new obj; } } // obj taken from PHP ArrayAccess page as example, contents not imp
是否可以允许实现 ArrayAccess 的数组或对象? 例如: class Config implements ArrayAccess { ... } class I_Use_A_Confi
在PHP中,一个类可以实现ArrayAccess接口(interface),所以类可以像这样被实例化和访问: class MyClass implements ArrayAccess { prot
我是一名优秀的程序员,十分优秀!