2014-02-08 6 views
0

Привет, у меня есть один класс как дочерний и один класс как родительский. Один класс снова как информация для писателя.Как передать массив объектов в функции PHP OOP

Я получаю сообщение об ошибке при передаче массива из двух объектов (объект из двух дочерних классов) в функции класса писателя. Я получаю это:

Catchable fatal error: Argument 1 passed to PersonWriter::setData() must be an instance of 
Person, array given, called in C:\xampp\htdocs\php\oop\book\Person.php on line 62 and 
defined in C:\xampp\htdocs\php\oop\book\Person.php on line 40 

Мои вопросы:

  1. У меня есть один дочерний класс, который непосредственно потомок родительского класса. И я создаю метод, используя тип класса Parent. Почему бы не работать?
  2. Как это исправить?

Это мой код:

<?php 
    // Class Person 
    class Person { 
     public $name; 
     public $gender; 
     public $age; 

     public function __construct($name, $gender, $age) { 
      $this->name = $name; 
      $this->gender = $gender; 
      $this->age = $age; 
     } 

     public function getInfo() { 
      $info = "Name : $this->name<br/>Gender : $this->gender<br/>Age : $this->age"; 
      return $info; 
     } 
    } 

    // Class Mahasiswa 
    class Mahasiswa extends Person { 
     public $npm; 

     public function __construct($npm, $name, $gender, $age) { 
      parent::__construct($name, $gender, $age); 
      $this->npm = $npm; 
     } 

     public function getInfo() { 
      $info = "NPM : $this->npm<br/>"; 
      $info .= parent::getInfo(); 
      return $info; 
     } 
    } 

    // Class PersonWriter 
    class PersonWriter { 
     private $persons = array(); 

     public function setData(Person $persons) { 
      $this->persons[] = $persons; 
     } 

     public function write() { 
      $str = ""; 
      foreach ($this->persons as $person) { 
       $str = "Name : $person->name<br/>"; 
       $str .= "Gender : $person->gender<br/>"; 
       $str .= "Age : $person->age<br/>"; 
      } 

      echo $str; 
     } 
    } 

    // Create 2 objects 
    $mhs = new Mahasiswa("201143579091","Fandi Akhmad", "L", 21); 
    $mhs2 = new Mahasiswa("201143579092","Annisya Ferronica", "P", 19); 

    // Add objects to Array 
    $persons = array($mhs, $mhs2); 

    $writer = new PersonWriter(); 
    $writer->setData($persons); 
    $writer->write(); 
?> 

Ответ:

  1. В примере кода, который проверяется в ответ ниже.
  2. О, ладно, я поймаю его. Я знаю, что понимаю мою функцию setData (Person $ persons) Потому что в моей книге не рассказывайте объяснения.

Теперь я добавить объект человека в массив как:

<?php ... 
    $writer->setData($mhs); 
    $writer->setData($mhs2); 
?> 

И я отредактировал мою функцию, как это:

public function write() { 
      $str = ""; 
      foreach ($this->persons as $person) { 
       $str = "Name : $person->name<br/>"; 
       $str .= "Gender : $person->gender<br/>"; 
       $str .= "Age : $person->age<br/>"; 

       echo "<br/>"; 
       echo $str; 
      } 
     } 

И он работает сейчас.

+1

Прочитать сообщение об ошибке. Вы намекаете на экземпляр Person в методе, но хотите передать массив. –

+0

Да, я понимаю это сообщение об ошибке, и я хочу передать массив объектов в функцию. Как это сделать? – fanjavaid

+0

Передача массива. И не намекая на экземпляр «Человека». –

ответ

1

Для этого нужен Person не массив;

$writer->setData($persons); 

Это будет работать;

$p = new Person("Jake", "male", 29); 
$writer->setData($p); 

Это потому, что функция setData требует Person объекта;

public function setData(Person $persons) { 
    $this->persons[] = $persons; 
} 

Если вы хотите, чтобы он принимал массив do;

public function setData(array $persons) { 
    $this->persons[] = $persons; 
} 

Или вы можете заставить его принять все, что хотите, удалив подсказку;

public function setData($persons) { 
    $this->persons[] = $persons; 
} 

EDIT

Я предполагаю, что это не ваш код, потому что если бы это было было бы совершенно очевидно, почему его мели при переходе в массиве. Пожалуйста, изучите основы OO перед погружением в два фута сначала и боретесь. Ошибка делает очевидным, в чем проблема.Здесь объясняется;

// You are meant to pass in a Person object here, it then appends that 
// to an existing array of Persons 
public function setData(Person $persons) { 
    $this->persons[] = $persons; 
} 

// This array of Persons is then iterated over in this function, this is 
// where line 48 is, 

public function write() { 
    $str = ""; 
    // Here the foreach goes over the Persons array 
    foreach ($this->persons as $person) 
    { 
     // But the $person objects are being accessed like objects using the 
     // -> operator, so if you pass in an array it will fail because you do 
     // no access an array using -> 
     $str = "Name : $person->name<br/>"; 
     $str .= "Gender : $person->gender<br/>"; 
     $str .= "Age : $person->age<br/>"; 
    } 

    echo $str; 
} 

Вы можете изменить эти строки следующим образом, чтобы получить доступ к массиву;

$str = "Name : " . $person['name'] . "<br/>"; 
$str .= "Gender : " . $person['gender'] . "<br/>"; 
$str .= "Age : " . $person['age'] . "<br/>"; 
+0

Нет, это не работает. Я уже пытаюсь это сделать. Но я получаю эту ошибку: '(!) Примечание: попытка получить свойство не-объекта в C: \ xampp \ htdocs \ php \ oop \ book \ Person.php в строке 48 '. Я просто хочу передать массив объектов в моей функции. – fanjavaid

+0

Пробовал что? Я дал вам три разных подхода. Использование 'setData (Person $ persons)' означает, что вы не можете передать массив. Так измените это, тогда вы можете передать массив. –

+0

Да, я уже пробовал ваши 3 решения, прежде чем спрашивать. И я получаю эту ошибку. 'Попытка получить свойство no-object ...' – fanjavaid

Смежные вопросы