所以假设我有两个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
中做类似的事情时,我会遇到一堆错误。当我在var_dump( $conn_object );
文件中User.php
时,我总是得到一个null
,就像文件甚至没有“看到”Connection
对象一样,或者知道它存在。< / p>
但是,当我直接在Connection
中使用main.php
类时,我没有收到任何错误,一切都顺利进行。这意味着我的Connection
对象没有任何语法错误或其他。
这种事情不允许在PHP中完成吗?该语言是否允许在类中使用类?
答案 0 :(得分:0)
记住类通过继承或依赖注入共享方法或属性。
<?php
class Connection {
protected $connection;
//we changed protected because only direct inherit can acces
public function __construct() {
$this->connection = // connect to the database here
}
}
<?php
include connection.php...
class User extends Connection{
function __construct(){
parent::contruct();
}
static function get_email( $user_id ) {
$this->connection->yourDbstuff ;
// do stuff with the connection object
}
}
?>
答案 1 :(得分:0)
仅供参考:我试着回答一个问题,就好像我是第一次问这个问题一样,尽量包含那些没有你或我那么多知识的人所需要的信息。这样可以更容易对于那些只是学习寻找答案的人。
require "Connection.php";
require "User.php";
$email = User::get_email( 4 ); // this doesn't work
'::'引用父方法,因此如果您没有使用User类扩展Connection类,它将无法工作。即使你有,也不能保证工作,这更可能意味着我在尝试时做错了。
要使用外部连接对象,您需要将连接对象传递给用户对象,以便用户对象可以使用连接对象,如下所示。
$thisConnection = new Connection();
$thisUser = new User();
$thisUser = new User($thisConnection);
要么
$thisUser->setConnection($thisConnection);
然后在您的用户类中,您需要一个方法或一组方法来复制连接类中的方法。
然而,正如Joaquin Javi所提到的,面向对象编程使用继承和子对象继承并且可以访问父对象方法。
此外,通过使用用户类扩展连接类,可以节省大量编码。
另一方面,如果您有特殊原因不想使用extends和继承快捷方式,则需要将Connection对象传递给User对象。
为了清楚起见,当您使用用户类扩展Connection类时,只要将它们设置为public或protected,用户类将继承方法以及连接类的变量,并且您将成为能够访问任何变量或方法,如get_email方法,如下所示:
$thisUser->get_email( 4 );
希望这会有所帮助。 斯科特