我正在尝试找到一种方法,该方法可以调用来自B类成员数组的指定成员(A类)的方法。
<?php
class A
{
public function do_something()
{
echo "class A did something";
}
}
class B
{
private $arr = array();
private $current_index = 0;
public function add_new_A()
{
$new_a = new A;
array_push($this->arr, (object) [
$this->current_index => $new_a
]);
$this->current_index++;
}
public function get_an_A_by_index($index)
{
return $this->arr{$index};
}
public function do_something_with_A_member_inside_array($index)
{
self::get_an_A_by_index($index)->do_someting();
}
}
$b = new B;
$b->add_new_a();
$b->add_new_a();
echo print_r($b->get_an_A_by_index(0));
echo "\n";
$b->do_something_with_A_member_inside_array(0); // returns error
// console:
// stdClass Object ( [0] => A Object ( ))
// Uncaught Error: Call to undefined method stdClass::do_something();
?>
总结一下,我想知道我的方法是否被认为是不好的,和/或是否可以采取一些措施来纠正错误。在您不同意我的代码之前,请看一下my php code I'm actually working on。这就是我的问题。
现在介绍为什么我要在内部调用成员A的方法。对于我的作业,我想要一个程序,它与类a的do_something方法分别执行某些操作。到目前为止,唯一的方法是存储A的单独成员。
我不确定是否要解决这个问题,因为我来自Java。所以,我想到的第一件事就是上面显示的方法。 When I do this in Java,效果很好。但是php与Java不同,由于我是新手,所以我仍在学习php的工作原理。
答案 0 :(得分:1)
您的代码不是遥不可及,您在构建A
对象集合的方式上遇到了问题。
array_push($this->arr, (object) [
$this->current_index => $new_a
]);
这正在创建一个我很确定不是您期望的数据结构。您将得到一个充满stdClass对象的数组,每个对象只有一个A
成员及其自己的内部索引:
Array
(
[0] => stdClass Object
(
[0] => A Object
(
)
)
)
然后,您将检索stdClass对象并尝试在该对象上运行该方法,因此您看到的对未定义方法stdClass :: do_something ... 的调用。
相反,您需要做的只是这个:
$this->arr[$this->current_index] = $new_a;
您其余的代码只是期望一个A
对象的数组,没有更深层的嵌套。
我在这里举了一个完整的例子:https://3v4l.org/ijvQa。您现有的代码还有其他一些错别字,这些错别字也已修复。如果打开错误报告,您将很容易发现它们。