我有一个管理数据库的类。在本课程中,我定义了连接,并为不同类型的数据获取/检索提供了各种函数。
我通常有一个用于ajax操作的php文件,通过这个文件,我包含了我需要的函数,并将我的类的实例作为变量传递给这些函数。
然后我在函数中使用该实例进行查询并从数据库中获取数据。
我的问题是:我需要在函数文件中包含类声明吗?其结构如下…或多或少。我是否需要在functioncollection。php
中包含databaseclass。phpdatabaseClass.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的框架自动加载器