繁体   English   中英

php:调用来自数组的 object 的方法

[英]php: call a method of an object coming from an array

我试图找出一种方法来调用来自 class 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();

?>

总结一下,我想知道我的方法是否被认为是不好的和/或我是否可以采取一些措施来修复错误。 在您不同意我的代码之前,请查看我实际正在处理的 php 代码 这就是我的问题。

现在说说我为什么要在里面调用一个成员 A 的方法。 对于我的任务,我想要一个使用 class a 的方法 do_something 单独执行某些操作的程序。 到目前为止,唯一的方法是存储 A 的单独成员。

我不确定我是否接近这个错误,因为我来自 Java。 所以,我想出的第一件事就是上面显示的方法。 当我在 Java 中执行此操作时,它工作正常。 但是 php 与 Java 不同,我仍在学习 php 是如何工作的,因为我是新手。

您的代码并不遥远,您只是在构建A对象集合的方式上遇到了问题。

array_push($this->arr, (object) [ 
    $this->current_index => $new_a
]);

这是创建一个数据结构,我很确定这不是您所期望的。 你最终会得到一个充满 stdClass 对象的数组,每个对象都有一个A成员和它自己的内部索引:

Array
(
    [0] => stdClass Object
        (
            [0] => A Object
                (
                )

        )

)

然后,您正在检索 stdClass object 并尝试在其上运行该方法,因此您会看到Call to undefined method stdClass::do_something...错误。

相反,您需要做的就是:

$this->arr[$this->current_index] = $new_a;

您的代码的 rest 只需要一个A对象数组,没有更深的嵌套。

我在这里放了一个完整的例子: https://3v4l.org/ijvQa 您现有的代码还有其他几个错别字,这些错别字也已修复。 如果您打开错误报告,您将很容易发现它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM