PHP 构造函数调用自身 - 不是递归
PHP Constructor Calling itself - Not Recurrsion
我正在向 PHP 框架添加一些模块,该框架已经到位并且运行良好。它支持多个数据库驱动程序。我在看主要的系统逻辑。
我注意到在一个主要的数据库驱动程序 class 构造函数中,它 calls/instantiates 本身。我不打算更改此代码,但我很困惑为什么这不会导致无限递归循环。
我查看了新的 PHP 命名空间和构造函数文档,但它并没有消除我的任何困惑。
框架的主要 MySQLi 驱动程序代码如下所示:
<?php
namespace SimFr\System\Library\DB;
class MySQLi {
private $connection;
public function __construct($hostname, $username, $password, $database, $port = '3306') {
$mysqli = @new \MySQLi($hostname, $username, $password, $database, $port);
if (!$mysqli->connect_error) {
$this->connection = $mysqli;
$this->connection->report_mode = MYSQLI_REPORT_ERROR;
} else {
throw new \Exception('MySQLi DB Failure');
}
}
... rest of class logic ...
我想知道在构造函数中,当它向变量 ($mysqli
) 分配自身的对象时,它不会陷入递归循环。
我对命名空间的理解不准确吗?感谢您的理解。
Is my understanding of namespaces inaccurate?
是的,但由于命名问题,这有点棘手。这个:
namespace SimFr\System\Library\DB;
class MySQLi { ... }
创建一个名为 \SimFr\System\Library\DB\MySQLi
的 class,而这个:
$mysqli = @new \MySQLi(...)
指的是一个叫\MySQLi
的class。
第一个 class 引用(定义)没有前导黑斜杠,因此它被放入当前名称空间的任何位置。第二个 class 引用(实例化)有一个前导反斜杠,明确地将它放在根命名空间中。所以,你有两个同名的 classes,但它们在不同的命名空间中,因此是不同的 classes.
我正在向 PHP 框架添加一些模块,该框架已经到位并且运行良好。它支持多个数据库驱动程序。我在看主要的系统逻辑。
我注意到在一个主要的数据库驱动程序 class 构造函数中,它 calls/instantiates 本身。我不打算更改此代码,但我很困惑为什么这不会导致无限递归循环。
我查看了新的 PHP 命名空间和构造函数文档,但它并没有消除我的任何困惑。
框架的主要 MySQLi 驱动程序代码如下所示:
<?php
namespace SimFr\System\Library\DB;
class MySQLi {
private $connection;
public function __construct($hostname, $username, $password, $database, $port = '3306') {
$mysqli = @new \MySQLi($hostname, $username, $password, $database, $port);
if (!$mysqli->connect_error) {
$this->connection = $mysqli;
$this->connection->report_mode = MYSQLI_REPORT_ERROR;
} else {
throw new \Exception('MySQLi DB Failure');
}
}
... rest of class logic ...
我想知道在构造函数中,当它向变量 ($mysqli
) 分配自身的对象时,它不会陷入递归循环。
我对命名空间的理解不准确吗?感谢您的理解。
Is my understanding of namespaces inaccurate?
是的,但由于命名问题,这有点棘手。这个:
namespace SimFr\System\Library\DB;
class MySQLi { ... }
创建一个名为 \SimFr\System\Library\DB\MySQLi
的 class,而这个:
$mysqli = @new \MySQLi(...)
指的是一个叫\MySQLi
的class。
第一个 class 引用(定义)没有前导黑斜杠,因此它被放入当前名称空间的任何位置。第二个 class 引用(实例化)有一个前导反斜杠,明确地将它放在根命名空间中。所以,你有两个同名的 classes,但它们在不同的命名空间中,因此是不同的 classes.