我有一个函数文件,我在其中放了一个__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,否则......我只需要稍微玩一下。谢谢你的帮助,伙计们!
答案 0 :(得分:1)
您必须使用带名称空间的类和aliases。
<?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并使用此实施代替您的实施。