如何在多个文件中扩展 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
这里唯一真正的区别是,当您在单个文件(沙箱)中使用多个命名空间时,您必须用 {}
将代码括起来。如果这些是单独的文件,您可以删除它们。好吧,我不能在沙箱中使用数据库函数,但这在这个例子中是无关紧要的,因为我们想要触发错误。
但是正如评论中所说,我会研究 Autoloading
和 Exceptions
两者都会对您有所帮助。
我在 github 上有一个自动加载器,你可以随意使用,它类似于 Composer uses/does。 Composer只是更加标准化。
Autoloadig 基本上使用命名空间和 class 的组合在 运行 时间查找文件(当 class 被实例化时)。所以有一些命名约定需要注意,比如拿你的 class Core\Errors\Errors
this should be located in Core/Errors/Errors.php
命名空间和文件路径应该是一样的。这样做的目的是您可以消除所有 include 语句,并且仅在需要时才加载文件 auto-magically.
我有以下代码:
文件: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
这里唯一真正的区别是,当您在单个文件(沙箱)中使用多个命名空间时,您必须用 {}
将代码括起来。如果这些是单独的文件,您可以删除它们。好吧,我不能在沙箱中使用数据库函数,但这在这个例子中是无关紧要的,因为我们想要触发错误。
但是正如评论中所说,我会研究 Autoloading
和 Exceptions
两者都会对您有所帮助。
我在 github 上有一个自动加载器,你可以随意使用,它类似于 Composer uses/does。 Composer只是更加标准化。
Autoloadig 基本上使用命名空间和 class 的组合在 运行 时间查找文件(当 class 被实例化时)。所以有一些命名约定需要注意,比如拿你的 class Core\Errors\Errors
this should be located in Core/Errors/Errors.php
命名空间和文件路径应该是一样的。这样做的目的是您可以消除所有 include 语句,并且仅在需要时才加载文件 auto-magically.