使用命名空间实例化类


Instantiate Class using namespaces

我有一个函数文件,其中放入了一个__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的内容,并使用此实现而不是您的实现。