gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:55:40 25 4
gpt4 key购买 nike

我有以下代码:

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

在这种代码情况下,使用定义为易于使用的 namespace 很重要吗?

最佳答案

我认为您的主要问题是缺少 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

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

然而,正如评论中所说,我会调查 AutoloadingExceptions这两者都会帮助你。

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

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

关于php - 如何在多个文件中扩展 PHP 类并在命名空间中标记每个扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56719116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com