我需要包括我的PHP类在每个文件


Do I need to include my PHP class in every file

我有一个管理数据库的类。在本课程中,我定义了连接,并为不同类型的数据获取/检索提供了各种函数。

我通常有一个用于ajax操作的php文件,通过这个文件,我包含了我需要的函数,并将我的类的实例作为变量传递给这些函数。

然后我在函数中使用该实例进行查询并从数据库中获取数据。

我的问题是:我需要在函数文件中包含类声明吗?其结构如下…或多或少。我是否需要在functioncollection。php

中包含databaseclass。php
databaseClass.php
<?php
class MyDBManager
{
    private $database   = 'db';
    private $host       = 'host'; 
    private $username   = 'siteguest';
    private $password   = 'psw';
    private $options    = array();
    ...
    function __construct(){}
    function runQuery($statement){}
    function fetchRow(){}
    ...
}
?>
livesearch.php
<?php
    include_once("databaseClass.php");
    include_once("something.php");
    $var1 = $_POST['id'];
    $var2 = $_POST['date'];
    $var3 = $_POST['time'];
    $database = new MyDBManager();
    somefunction($database, $var1, $var2, $var3);
    ...
?>
functionCollection.php
<?php
    include_once("databaseClass.php");
    include_once("misc.php");
    function nameExists($database, $var1, $var2, $var2){}
    ...
?>

不,包含类定义的文件必须只加载一次,无论在哪里。一旦加载了文件并解析了类定义,就可以从任何地方使用它。

PHP自动加载就是为了防止这个问题而设计的。当你尝试实例化一个类时,PHP会在抛出异常之前尝试自动加载这个类。

在自动加载之前,我们必须包含所有的类文件。来自PHP文档:
在PHP 5中,不再需要这样做。你可以定义一个__autolload ()函数,当您尝试使用尚未定义的类/接口。通过调用这个函数给脚本引擎最后一次加载类的机会

然而,有一个更好的选择spl_autoload_register允许您注册多个自动加载器,这些自动加载器将一个接一个地执行,直到找不到类,然后抛出异常。

现在PHP中有一个叫做PSR-0 Standard的标准,它伴随着PHP对命名空间的支持而来。

你应该读读这篇文章,它给出了一个简短的历史,并解释了如何实现你自己的自动加载器。http://phpmaster.com/autoloading-and-the-psr-0-standard/

如果你有时间,看看一些真实世界的自动加载器来学习更多,例如Yii或Symfony的框架自动加载器