我有一个函数文件,我在其中放置了一个 __autodload() 函数。对于我的课程,我想使用命名空间,因为我正在学习它们。在文件夹lib/
中,我有一个 DB 类和一个 Test-User 类。这些代码如下:
数据库类.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');
}
}
}
用户类.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()
and $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 提供的帮助和链接下得到了它。代码现在如下所示:
索引.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 否则......我只需要稍微玩一下。谢谢你们的帮助,伙计们!