我有一个函数文件,其中放入了一个__autodload()函数。对于我的类,我想使用名称空间,因为我正在学习它们。在文件夹lib/
中,我有一个DB类和一个Test User类。这些代码如下:
DB.class.php
<?php
namespace App'Lib;
class DB
{
public $db;
function __construct($host, $username, $password, $database)
{
$this->db = new MySQLi($host, $username, $password, $database);
if (mysqli_connect_error()) {
die('Connect error');
}
}
}
User.class.php
<?php
namespace App'Lib;
class User
{
private $_db;
function __construct($db)
{
$this->_db = $db;
}
public function test()
{
echo '<pre>';
print_r($this->_db);
echo '</pre>';
}
}
此时,我的索引文件如下所示:
<?php
include 'functions.inc.php';
$db = new DB('localhost', 'root', '', 'test');
$user = new User($db);
$user->test();
我得到错误Fatal error: Class 'DB' not found in C:'xampp'htdocs'tplsys'index.php on line 5
我也试过$db = new 'App'Lib'DB()
和$db = new App'Lib'DB()
,但结果总是一样的。。。自动加载功能如下所示:
function __autoload($className)
{
if (!file_exists('lib/' . $className . '.class.php')) {
return FALSE;
} else {
require_once 'lib/' . $className . '.class.php';
}
}
编辑
我是在sectus提供的帮助和链接下完成的。代码现在看起来是这样的:
index.php
<?php
include 'functions.inc.php';
spl_autoload_register('autoload');
$db = new 'Lib'DB('localhost', 'root', '', 'test');
$user = new 'Lib'User($db);
$user->test();
自动加载功能:
function autoload($className)
{
$className = ltrim($className, '''');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '''')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('''', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.class.php';
require $fileName;
}
类别:
<?php
namespace Lib;
class DB
{
public $db;
function __construct($host, $username, $password, $database)
{
$this->db = new 'MySQLi($host, $username, $password, $database);
if (mysqli_connect_error()) {
die('Connect Error (' . mysql_connect_errno() . ') ' . mysqli_connect_error());
}
}
}
我不得不将名称空间重命名为Lib'',因为它会查找app/Lib/class.php,否则。。。我只需要玩一下。谢谢你们的帮助,伙计们!
必须将类与带有命名空间或别名的命名空间一起使用。
<?php
include 'functions.inc.php';
$db = new DB('localhost', 'root', '', 'test');// your DB class has no namespace
$user = new 'App'Lib'User($db); // <--- namespace added
$user->test();
函数__autoload($className)
接收完整的类名(带名称空间)。因此,当您的__autoload
函数执行时,它将接收字符串:'DB'
、'App'Lib'User'
。
您应该阅读有关PSR-0的内容,并使用此实现而不是您的实现。