PHP 通过构造函数将对象作为参数传递

PHP Pass an Object as a Parameter via the Constructor

我正在尝试通过构造函数将一个对象传递给另一个对象。我有一个 class 收集数据库凭据并将它们分配给 class 属性。然后是另一个执行实际查询的 class 和 returns 行数组。这是代码:

// GetCredentials
class GetCredentials
{
    public function __construct()
    {   
    }

    private $_db = "";
    private $_uname = "";
    private $_pwd = "";

    public function DB($value = NULL)
    {
        if( $value===NULL )
            return $this->_db;
        else
            $this->_db = $value;
    }
    public function Uname($value = NULL)
    {
        if( $value===NULL )
            return $this->_uname;
        else
            $this->_uname = $value;
    }
    public function Pwd($value = NULL)
    {
        if( $value===NULL )
            return $this->_pwd;
        else
            $this->_pwd = $value;
    }

    public function readCreds($filename)
    {
        $parray = array();
        $file = fopen($filename,"r");
        while(! feof($file))
          {
          array_push($parray,fgets($file));
          }
        fclose($file);
        $this->DB = $parray[0];
        $this->Uname = $parray[1];
        $this->Pwd = $parray[2];
    }   

}


// DBconnection
class DBconnection{
    public function __construct(GetCredentials $cr)
    {   
        $Uname = $cr->Uname;
        $DB = $cr->DB;
        $Pwd = $cr->Pwd;
        }

    private $conn;
    private $Uname;
    private $DB;
    private $Pwd;

    public function dbConnect($sql)
    {

    try {
    $conn = new PDO("mysql:host=localhost;dbname=" . $DB, $Uname, $Pwd);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $arr = $conn->prepare($sql);
    $arr->execute();
    $result = array();
    $result = $arr->fetchAll();
    return $result;
        }
    catch(PDOException $err) {
    return "ERROR: Unable to connect: " . $err->getMessage();
        }
    }
    function __destruct(){
        $conn = null;
    }           
}

为了测试,我实例化了 GetCredentials class,填充了值,然后传递给 DBConnection 对象值和所有值,并让它执行实际的数据检索。 我的测试脚本如下所示:

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', true);
ini_set('auto_detect_line_endings', true);


$sC = New GetCredentials();
$sC->readCreds('dbdata.txt');

$db = New DBConnection($sC);
$sql = 'SELECT `Member ID`, `Address 1`, City, State, Zip FROM `MemberDataAll` WHERE LENGTH(Zip) >= 5';

$rArr = $db->dbConnect($sql);
echo count($rArr);

我的脚本抛出一组错误,指出 DBConnection object 的属性为空。我想这可能是我的使用不正确,但我不确定。我还想知道在构造函数中使用 $this 是否是最好的主意,Self:: 更好吗?如果是这样,为什么?任何人都可以让我直截了当吗?提前致谢。

首先,我将更改 class GetCredentials 中的方法 readCreds 并确保它在 class 的私有变量中分配凭据:

public function readCreds($filename)
{
    $parray = [];
    $file = fopen($filename,"r");
    while(! feof($file)) {
        array_push($parray, fgets($file));
    }
    fclose($file);
    $this->DB($parray[0]);
    $this->Uname($parray[1]);
    $this->Pwd($parray[2]);
} 

在我这样测试之后:

$sC = New GetCredentials();
$sC->readCreds('dbdata.txt');
echo $sC->DB();    
echo $sC->Uname();
echo $sC->Pwd();

然后在 DBconnection class 中,我将更改构造函数以将这些凭据正确分配给私有变量。在使用这些变量实例化 PDO object:

时,我会添加 $this 关键字
// DBconnection
class DBconnection{

    private $conn;
    private $Uname;
    private $DB;
    private $Pwd;

    public function __construct(GetCredentials $cr)
    {   
        $this->Uname = $cr->Uname();
        $this->DB = $cr->DB();
        $this->Pwd = $cr->Pwd();
    }

    public function dbConnect($sql)
    {
        try {
            $this->conn = new PDO("mysql:host=localhost;dbname=" . $this->DB, $this->Uname, $this->Pwd);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $arr = $this->conn->prepare($sql);
            $arr->execute();
            $result = array();
            $result = $arr->fetchAll();
            return $result;
        }
        catch(PDOException $err) {
            return "ERROR: Unable to connect: " . $err->getMessage();
        }
    }

    function __destruct(){
        $conn = null;
    }           
}

测试这是否能解决您的问题。