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;
}
}
测试这是否能解决您的问题。
我正在尝试通过构造函数将一个对象传递给另一个对象。我有一个 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;
}
}
测试这是否能解决您的问题。