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

时间:2019-06-22 20:54:06

标签: php class namespaces extend

我有以下代码:

文件: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"));

我想用许多文件扩展Engine类,并且希望它们在命名空间中,我该如何正确地执行此操作,因为在这种情况下我无法触发错误。

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

1 个答案:

答案 0 :(得分:2)

您看到的主要问题是缺少USE语句以及TrigerError是方法而不是类的事实。

要解决这些问题:

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的使用/用途。 Composer更加标准化。

Autoloadig基本上使用命名空间和类的组合在运行时(实例化该类时)查找文件。因此,需要注意一些命名约定,例如,将您的类Core\Errors\Errors放置在Core/Errors/Errors.php中,命名空间和文件路径应该相同。这样可以消除所有的include语句,仅在需要时自动加载文件。