Почему не работает array_push() в классе?

У меня есть класс. Там есть метод, который добавляет (должен) добавлять новый элемент в конец массива. Вместо этого происходит ахинея.

Вместо одного элемента в конец массива добавляется 3 элемента, при том добавляется только один первый символ.

Вопрос: что я делаю не так? Как исправить эту проблему?

UPD. То, что добавляется в конец массива:

А мне надо чтобы вместо того, что добавилось - добавилась одна запись: Круглов Илья 20

class.php

class Students {
.......
public $arr=array();
public function AddStud($surname, $name, $age) {
        array_push($this->arr, "$surname", "$name", "$age");
    }
}

index.php

................
<?
include 'class.php';
$s = new Students;
$s->AddStud("Круглов", "Илья", 20);
?>

UPD2. Информацию вывожу в таблицу следующим образом:

<table>
<? foreach ($s->arr as $f) { ?>
    <tr>
      <td><? echo $f["Фамилия"]; ?></td>
      <td><? echo $f["Имя"]; ?></td>
      <td><? echo $f["Возраст"]; ?></td>
    </tr>
    <? } ?>
</table>

Ответы (1 шт):

Автор решения: Алексей Шиманский

Ваша проблема у меня не воспроизводится. Но есть так или иначе куча других проблем.

  1. Само добавление array_push($this->arr, "$surname", "$name", "$age"); некорректно, потому что вы добавляете в нумерованный массив данные. И получается вот что:

     $s->AddStud("Круглов", "Илья", 20);
     $s->AddStud("Привет", "Андрей", 30);
    
     Array
     (
         [0] => Круглов
         [1] => Илья
         [2] => 20
         [3] => Привет
         [4] => Андрей
         [5] => 30
     )
    

    Как вы понимаете это совсем не корректно.

  2. Если даже исправить пуш на этот:

     array_push($this->arr, [$surname, $name, $age]);
    

    То получим что-то уже лучшее:

     Array
     (
         [0] => Array
             (
                 [0] => Круглов
                 [1] => Илья
                 [2] => 20
             )
    
         [1] => Array
             (
                 [0] => Привет
                 [1] => Андрей
                 [2] => 30
             )
    
     )
    
  3. Но даже в случае выше, работа у вас просто неверна сразу. Потому что класс в данном случае должен знать только о себе и ни о каких других пользователях. По сути, студент - это отдельная сущность, и он должен знать только о себе: о своей фамилии, о своём имени и своём возрасте. А вы пихаете ему всё сразу.

    Тут надо либо просто отдельно массив с пользователями хранить:

     <?php
    
    
     class Student {
    
         public $lastname;
         public $name;
         public $age;
    
         public function __construct($lastname, $name, $age) {
             $this->lastname = $lastname;
             $this->name = $name;
             $this->age = $age;
         }
     }
    
     $staticData = [
         ['lastname' => "Круглов", 'name' => "Илья", 'age' => 20],
         ['lastname' => "Привет", 'name' => "Андрей", 'age' => 30],
     ];
    
     $arrOfStudenrs = [];
    
     foreach ($staticData as $data) {
         $arrOfStudenrs[] = new Student($data['lastname'], $data['name'], $data['age']);
     }
    
    
     print_r($arrOfStudenrs);
    
    
     Array
     (
         [0] => Student Object
             (
                 [lastname] => Круглов
                 [name] => Илья
                 [age] => 20
             )
    
         [1] => Student Object
             (
                 [lastname] => Привет
                 [name] => Андрей
                 [age] => 30
             )
    
     )
    

    Либо делать итерируемую коллекцию со студентами

     class UserRepository {
         public $studenrts = [];
    
    
    
         public function addStudend(Student $student) {
             array_push($this->studenrts , $student));
         }
    
         // методы для итерирования и доступа к коллекции
     }
    

    И уже работать с этой коллекцией


На самом деле на этом проблемы не заканчиваются. Там ещё много нюансов. Но это вам нужно учить ООП. Долго. :)

→ Ссылка