php: вызов метода объекта из массива - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь найти способ вызова метода для указанного члена (класса A) из массива членов класса B.

<?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();

?>

To В завершение, я хочу знать, считается ли мой подход плохим и / или есть ли что-то, что я могу сделать, чтобы исправить ошибку. Прежде чем не согласиться с моим кодом, взгляните на мой php код, над которым я на самом деле работаю . Вот и все на мой вопрос.

Теперь о том, почему я хочу вызвать метод члена A внутри. Для моего назначения я хочу программу, которая делает что-то отдельно с методом do_something класса a. Пока что единственный способ сделать это - хранить отдельных членов A.

Я не уверен, что я подхожу к этому неправильно или нет, потому что я прихожу с Java. Итак, первое, что я придумал, это подход, показанный выше. Когда я делаю это в Java, все работает нормально. Но php отличается от Java, и я все еще изучаю, как работает php, так как я новичок в этом.

1 Ответ

1 голос
/ 04 мая 2020

Ваш код не за горами, у вас просто возникла проблема с тем, как вы собираете коллекцию 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. Ваш существующий код имел несколько других опечаток, которые также исправлены. Вы легко заметите их, если включите отчеты об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...