在PHP中初始化另一个类的对象

时间:2012-02-22 12:43:39

标签: php oop

我有4个文件index.php, Database.php, Zoo.php, Animal.php

// Zoo.php

class Zoo {
    private $db;
    private $animals = array();

    public function __constructor(Database $db) {
        $this->db = $db;
        $this->getAllAnimals();
    }

    private function getAllAnimals() {
        //Database stuff, returns an array with all animals
        $p=0;
        foreach($dbresult as $an){
            $animals[$p++] = new Animal($an['name'], $an['age'], $an['weight']);
        }
    }

    public function listAnimals() {
        foreach ($this->animals as $a){
            echo $a->name;
            //and so on
        }
    }
}

// Animal.php

class Animal {
    // variables for the animals
}

// index.php

<?php
    include 'Database.php';
    include 'Zoo.php';

    $db = new Database();
    $zoo = new Zoo($db);
    $zoo->listAnimals();
?>  

这是我的头脑,所以如果有一些错误,只需将其视为伪代码:)

我的问题:
我得到Fatal Error Class Animal not found。 如果我在include 'Animal.php';的第一行添加Zoo.php,就在它class Zoo {之前。

我仍然在用PHP学习OOP,并且include-line让我感到奇怪,所以我请求有人帮我解决这个问题。
是否有另一种方法可以在“Zoo”类中使用“Animal”对象,没有包含或者使用include是否正常,或者可能需要/ require_once?

3 个答案:

答案 0 :(得分:1)

我相信现在大多数OOP开发人员都利用__autoload或(甚至更好)SPL autoloader,即使只是在他们使用的库和框架中。

答案 1 :(得分:1)

如果您需要Zoo.php中的“Animal”类,则在Zoo.php顶部需要require_once("Animal.php");。如果您在其他文件中需要它,请在那里执行相同操作。

答案 2 :(得分:0)

  

包含线让我觉得奇怪

那是为什么呢?要使用Animal,您必须包含其定义。对我来说似乎总是很理性。

requirerequire_once这样的替代方案可以做同样的事情(但有一些额外的限制),以及一些更奇特的替代方案,例如自动加载。但对于简单的任务,include会很好。