我有以下代码:
文件: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类,并且希望它们在命名空间中,我该如何正确地执行此操作,因为在这种情况下我无法触发错误。
在这种情况下,使用定义为易于使用的名称空间的代码是否重要?
答案 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
这里唯一的真正区别是,当您在单个文件(沙盒)中使用多个名称空间时,必须用{}
将代码括起来。如果这些是单独的文件,则可以将其删除。好了,我不能在沙箱中使用数据库函数,但是在此示例中这是无关紧要的,因为我们要触发错误。
不过,正如评论中所说,我将研究Autoloading
和Exceptions
,这两个都将在这里为您提供帮助。
github上有一个自动装带器,您可以根据需要使用它,类似于Composer的使用/用途。 Composer更加标准化。
Autoloadig基本上使用命名空间和类的组合在运行时(实例化该类时)查找文件。因此,需要注意一些命名约定,例如,将您的类Core\Errors\Errors
放置在Core/Errors/Errors.php
中,命名空间和文件路径应该相同。这样可以消除所有的include语句,仅在需要时自动加载文件。