PHP OOP - 正确包含所需文件

时间:2011-10-06 06:10:37

标签: php oop

来自ActionScript 3的强大背景,需要/导入将在另一个类中引用/使用/扩展的类的过程如下:

import package.inner.ClassName;

这需要在每个使用ClassName的外部类文件的顶部,这意味着如果我执行以下任何操作,则需要它,例如:

  • public class NewClass extends ClassName
  • var someVar:ClassName = new ClassName();
  • function someMethod():ClassName{ .. }

我对PHP有一定的了解,即我知道如何使用它来处理MySQL,输出文本,编写函数,设置一些基本类等等。

我总是只有一个小型网站的主要课程,我在网页顶部创建了一个实例,并从那里开始工作,例如:

<?php
    class Website
    {
        public function __construct()
        {
            // connect to mysql, etc
        }

        public function example()
        {
            echo "example text";
        }
    }
?>

然后:

<?php
    require "whatever/class.website.php";
    $website = new Website();
?>
<!doctype html>
<html>
    <head>
        <title>Example</title>
    </head>
    <body>
        <?php
            $website->example();
        ?>
    </body>
</html>

这很好,但现在我想开始转向一些有多个类的大型项目。起初我没事,但在尝试为多个类设置基类之后,我遇到了一个问题:

举个例子,我设置了以下基类:

class Base
{
    public function test($input)
    {
        echo $input;
    }
}

从那里我设置了一个扩展它的类:

require "class.base.php";

class ExampleOne extends Base
{
    public function __construct()
    {
        $this->test("example one");
    }
}

然后检查是否所有工作都按预期工作,它做了:

<!DOCTYPE HTML>
<html>
    <head>
        <meta charset="utf-8">
        <title>Untitled Document</title>
    </head>

    <body>
        <?php
            require "class.exampleone.php";

            $one = new ExampleOne();
        ?>
    </body>
</html>

然后我继续创建了一个扩展Base的附加类,这是我遇到问题的地方..

require "class.base.php";

class ExampleTwo extends Base
{
    public function __construct()
    {
        $this->test("example two");
    }
}

当我尝试创建此类的实例,或者甚至只是使用require来访问该类时,我收到错误:

  

致命错误:无法重新声明类Base   第3行的C:\ xampp \ htdocs \ testing \ class.base.php

所以可以肯定的是,这个错误是非常自我解释的,因为我在每个类的顶部使用了require "class.base.php"; - 这是你在ActionScript 3中所做的,因为我正在使用基类(扩展它。)

我想我发现很难理解我应该怎么做。我应该将require放在Base的哪个位置?在我扩展的后一类中省略它似乎很奇怪,因为如果我不创建我的第一个类的实例,那么基类就不会被包含在内。

任何建议都很棒!

6 个答案:

答案 0 :(得分:6)

您可以使用require_once()声明。它的功能与require语句类似,但会检查以确保尚未包含基类,并在需要时加载它。

http://php.net/manual/en/function.require-once.php

您可能还希望根据网站的大小调查Web框架,但这不在问题范围内:)

答案 1 :(得分:2)

您应该了解spl_autoload_register的工作原理。它会以更可重复的方式解决您的问题。

此外,您应该停止在__construct方法中“工作”。仅用于分配。如果您的Website类需要数据库连接,那么您应该创建一个PDO(或mysqli?)对象,并将其传递给构造函数中的实例。

P.S。观看"Clean Code Talks - Unit Testing",实际上强烈建议其他系列讲座。

答案 2 :(得分:1)

您需要使用require_once代替require。这样,PHP只会包含该文件,如果还没有这样做的话。

答案 3 :(得分:1)

您应该使用require_once

答案 4 :(得分:1)

如果您只想破解上述问题,请使用require_once

但就像egis所说的那样,自动加载器要好得多,因为它根据需要包含你的类。使您免于手动包括很多地方的课程。如果你的班级依赖于其他许多课程怎么办?

这是a tutorial on how to do that

答案 5 :(得分:1)

如果你甚至不想关心,你应该使用__autoload并让php为你做所有繁重的工作。