假设我有两个 PHP 类:User
和 Connection
。
从他们的名字中可以明显看出他们所做的事情。
现在假设我有这个代码:
User.php
<?php
class User {
static function get_email( $user_id ) {
$conn_object = new Connection();
$connection = $conn_object->connection;
// do stuff with the connection object
}
}
?>
Connection.php
<?php
class Connection {
public $connection;
public function __construct() {
$this->connection = // connect to the database here
}
}
?>
main.php
<?php
require "Connection.php";
require "User.php";
$email = User::get_email( 4 ); // this doesn't work
?>
当我在 main.php
中执行类似操作时,我收到了一堆错误。当我在 User.php
文件中 var_dump( $conn_object );
时,我总是得到一个 null
,就像该文件甚至没有“查看”Connection
对象,或者知道它存在。
但是,当我直接使用 main.php
中的 Connection
类时,我没有收到任何错误,并且一切运行顺利。这意味着我的 Connection
对象没有任何语法错误或其他错误。
PHP中不允许做这种事吗?该语言不允许在类中使用类吗?
最佳答案
仅供引用:我会尝试回答一个问题,就好像我第一次问这个问题一样,并尝试包含那些知识不如您或我的人所需的尽可能多的信息。这会让问题变得更容易对于那些刚刚学习寻找答案的人来说。
需要“Connection.php”;
需要“User.php”;
$email = User::get_email( 4 );//这不起作用
“::”引用父方法,因此如果您没有使用 User 类扩展 Connection 类,它将不起作用。即使你有,也不能保证它能工作,这更有可能意味着我在尝试时做错了什么。
要使用外部连接对象,您需要将连接对象传递给用户对象,以便用户对象可以使用连接对象,如下所示。
$thisConnection = new Connection();
$thisUser = new User();
$thisUser = new User($thisConnection);
或者
$thisUser->setConnection($thisConnection);
然后,在您的用户类中,您将需要一个方法或一组方法来复制连接类中的方法。
但是,正如 Joaquin Javi 所提到的,面向对象编程使用继承,子对象继承并可以访问父对象的方法。
此外,通过使用用户类扩展连接类,您可以节省大量编码。
另一方面,如果您出于特定原因不想使用扩展和继承快捷方式,则需要将 Connection 对象传递到 User 对象中。
需要明确的是,当您使用用户类扩展Connection类时,用户类将继承连接类的方法和变量,只要将它们设置为public或protected,您就可以能够访问任何变量或方法,例如 get_email 方法,如下所示:
$thisUser->get_email( 4 );
希望这有帮助。 斯科特
关于php - 在类声明中使用外部对象 - PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32832208/