【问题标题】:PHP Pass an Object as a Parameter via the ConstructorPHP 通过构造函数将对象作为参数传递
【发布时间】:2020-02-28 04:41:30
【问题描述】:

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

// 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 类,填充了值,然后传递给 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:: 更好吗?如果是,为什么?谁能让我直截了当?提前致谢。

【问题讨论】:

    标签: php class database-connection


    【解决方案1】:

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

    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 类中,我将更改构造函数以将这些凭据正确分配给私有变量。我会在使用这些变量实例化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;
        }           
    }
    

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

    【讨论】:

    • 好的,做到了。所以我的问题实际上是指属性并正确分配值。感谢您的帮助,TOH19。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2020-10-25
    • 1970-01-01
    • 2013-11-29
    • 2018-08-17
    • 2017-04-19
    • 2012-11-14
    相关资源
    最近更新 更多