如何在 PHP OOP 函数中传递对象数组

Posted

技术标签:

【中文标题】如何在 PHP OOP 函数中传递对象数组【英文标题】:How to passing array of objects in PHP OOP function 【发布时间】:2014-03-05 20:21:59 【问题描述】:

您好,我有一个班级作为孩子,一个班级作为父母。 再次作为作家信息的一类。

在编写器类函数中传递两个对象(来自两个类子对象的对象)的数组时出现错误。我明白了:

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

我的问题是:

    我有一个子类,它是父类的直接后代。我使用父类类型创建方法。为什么不工作? 如何解决这个问题?

这是我的代码:

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

答案:

    在下面检查为答案的示例代码中。 哦,好吧,我明白了。我知道了解我的功能 setData(Person $persons) 因为在我的书中没有讲出解释。

现在我将 person 对象添加到数组中:

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

现在可以使用了。

【问题讨论】:

阅读错误信息。您在方法中暗示了一个 Person 实例,但想要传递一个数组。 是的,我理解该错误消息,并且我想在函数中传递对象数组。该怎么做? 通过传递一个数组。而不是暗示Person 的实例。 【参考方案1】:

这需要Person 而不是数组;

$writer->setData($persons);

这会起作用的;

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

这是因为setData 函数需要Person 对象;

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

如果你想让它接受一个数组,那么做;

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

或者你可以通过删除提示让它接受你想要的任何东西;

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

编辑

我假设这不是您的代码,因为如果是这样,那么在传入数组时它为什么会中断是非常明显的。请先了解 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/>";

【讨论】:

不,它不起作用。我已经尝试过了。但我收到此错误:( ! ) Notice: Trying to get property of non-object in C:\xampp\htdocs\php\oop\book\Person.php on line 48 。我只想在我的函数中传递对象数组。 试过什么?我给了你三种不同的方法。使用setData(Person $persons) 意味着您不能传递数组。所以改变它,然后你可以传递一个数组。 是的,我在询问之前已经尝试过您的 3 个解决方案。我得到了那个错误。 Trying to get property of no-object...

以上是关于如何在 PHP OOP 函数中传递对象数组的主要内容,如果未能解决你的问题,请参考以下文章

Java 对象数组 Foreach 方法访问

postman如何传递对象数组

使用构造函数将数组传递给对象后,值已更改(在 c++ 中)。我想不通为啥

如何在调用WebService方法时,传递对象数组参数

java数组作为参数传入函数怎么让他不变化

如何在数组对象中传递参数?在 C++ 中