【问题标题】:How to extend PHP class in mulitple files and mark every extend in namespace?如何在多个文件中扩展 PHP 类并标记命名空间中的每个扩展?
【发布时间】:2023-03-14 02:15:01
【问题描述】:

我有以下代码:

文件: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 类,并且我希望它们位于命名空间中,我该如何正确地做到这一点,因为在这种代码情况下我无法触发错误。

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

【问题讨论】:

  • 我敦促您先切换到作曲家和自动加载:getcomposer.org/doc/01-basic-usage.md#autoloading。这将需要一些时间,但它会消除您在第一步中会遇到的许多问题......如果该特定文档对您来说不容易阅读,请尝试通过关键字“composer”找到更好的东西,“自动加载”、“教程”。
  • 您还应该查看异常而不是错误。然后你可以尝试捕捉你的错误等。

标签: php class namespaces extend


【解决方案1】:

在我看来,您的主要问题是缺少 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

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

不过,正如 cmets 中所说,我会研究 AutoloadingExceptions,这两者都会对您有所帮助。

我在github 上有一个自动加载器,您可以根据需要随意使用它,它类似于 Composer 使用/执行的操作。 Composer 只是更加标准化。

Autoloadig 基本上使用命名空间和类的组合在运行时(当类被实例化时)查找文件。所以有一些命名约定需要注意,例如你的类Core\Errors\Errors 这应该位于Core/Errors/Errors.php 命名空间和文件路径应该是相同的。这样做的目的是您可以消除所有包含语句,并且仅在需要时自动加载文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2017-01-25
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2012-08-17
    相关资源
    最近更新 更多