php:调用来自数组的对象的方法

时间:2020-05-04 09:46:52

标签: php arrays

我正在尝试找到一种方法,该方法可以调用来自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的工作原理。

1 个答案:

答案 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。您现有的代码还有其他一些错别字,这些错别字也已修复。如果打开错误报告,您将很容易发现它们。

相关问题