簡體   English   中英

使用名稱空間實例化類

[英]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() ,但結果始終相同... autoload函數如下所示:

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的信息,並使用此實現而不是您的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM