PHP Передача объекта в качестве параметра через конструктор - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь передать объект другому через конструктор. У меня есть класс, который собирает учетные данные базы данных и присваивает их свойствам класса. Затем другой класс, который выполняет фактический запрос и возвращает массив строк. Вот код:

// 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::, и если да, то почему? Кто-нибудь может привести меня в порядок? Заранее спасибо.

1 Ответ

1 голос
/ 28 февраля 2020

Во-первых, я бы изменил метод readCreds в классе GetCredentials и удостоверился, что он присваивает учетные данные в личных переменных класса:

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 я бы изменил конструктор, чтобы правильно присвоить эти учетные данные частным переменным. И я бы добавил ключевое слово $this при использовании этих переменных для создания экземпляра теста PDO object:

// 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;
    }           
}

, если это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...