如何在多个文件中扩展 PHP class 并在命名空间中标记每个扩展?

How to extend PHP class in mulitple files and mark every extend in namespace?

我有以下代码:

文件:class.engine.php(网站的主引擎)

<?php
namespace Core;

class Engine {

}

文件class.errors.php(错误触发,自定义错误)

<?php
namespace Core\Errors;

class Errors {
    public function TrigerError($e)
    {
        die($e);
    }
}

文件class.mysqli.php(数据库连接器)

<?php
namespace Core\MySQLiDrv;

class MySQLiDrv {
    public $db = null;

    public function __construct($database) {
        $connector = mysqli_connect($database[0], $database[1], $database[2], $database[3]);
        if(!$connector)
        {
            return new TrigerError("1");
        }
    }
}

文件index.php(一切运行的地方)

<?php
include("engine/class.engine.php");
include("engine/class.errors.php");
include("engine/class.mysqli.php");

$engine = new Engine();
$db = new MySQLiDrv(array("localhost", "user", "pass", "db"));

我想用多个文件扩展引擎 class,我希望它们位于命名空间中,我该如何正确地做到这一点,因为在这种情况下我无法触发代码错误。

在这种代码情况下,使用定义为易于使用的命名空间是否重要?

我认为您的主要问题是缺少 USE 语句以及 TrigerError 是一种方法而不是 class。

要解决这些问题:

namespace Core\MySQLiDrv;

use Core\Errors\Errors;

class MySQLiDrv {
    public $db = null;

    public function __construct($database) {
        $connector = mysqli_connect($database[0], $database[1], $database[2], $database[3]);
        if(!$connector)
        {
            return (new Errors)->TrigerError("1");
        }
    }
}

完整的工作代码:

namespace Core{
    class Engine {
    }
}

namespace Core\Errors{
    class Errors {
        public function TrigerError($e)
        {
            die($e);
        }
    }
}

namespace Core\MySQLiDrv{

    use Core\Errors\Errors;

    class MySQLiDrv {
        public $db = null;

        public function __construct($database) {
            //$connector = mysqli_connect($database[0], $database[1], $database[2], $database[3]);
            //if(!$connector)
            //{
                return (new Errors)->TrigerError("1");
           //}
        }
    }
}

//default global namesapce
namespace {
    use Core\Engine;
    use Core\MySQLiDrv\MySQLiDrv;

    $engine = new Engine();
    $db = new MySQLiDrv(array("localhost", "user", "pass", "db"));

}

输出

1

Sandbox

这里唯一真正的区别是,当您在单个文件(沙箱)中使用多个命名空间时,您必须用 {} 将代码括起来。如果这些是单独的文件,您可以删除它们。好吧,我不能在沙箱中使用数据库函数,但这在这个例子中是无关紧要的,因为我们想要触发错误。

但是正如评论中所说,我会研究 AutoloadingExceptions 两者都会对您有所帮助。

我在 github 上有一个自动加载器,你可以随意使用,它类似于 Composer uses/does。 Composer只是更加标准化。

Autoloadig 基本上使用命名空间和 class 的组合在 运行 时间查找文件(当 class 被实例化时)。所以有一些命名约定需要注意,比如拿你的 class Core\Errors\Errors this should be located in Core/Errors/Errors.php 命名空间和文件路径应该是一样的。这样做的目的是您可以消除所有 include 语句,并且仅在需要时才加载文件 auto-magically.