2014-01-29 5 views
0

У меня есть следующий код, который состоит из класса DB, который устанавливает соединение с базой данных SQL с помощью mysqli.Использование соединения mysqli PHP как объекта для других классов

<?php 
class DB 
{ 
    private $mysqlilink; 
    private $errors; 
    function __construct($errors = array()) 
    { 
     $this -> errors = $errors; 
     $this -> connect(); 
    } 

    function connect() 
    { 
     $server = "127.0.0.1"; 
     $user_name = "un"; 
     $password = "pw"; 
     $database = "db"; 

     if ($this -> mysqlilink == null) 
     { 
      $this -> mysqlilink = new mysqli($server, $user_name, $password, $database); 
      if (mysqli_connect_errno()) 
      { 
       printf("Connect failed: %s\n", mysqli_connect_error()); 
       exit(); 
      } 
     } 
     return $this -> mysqlilink; 
    } 

    function __destruct() 
    { 
     $stmt -> close(); 
    } 
} 
?> 

У меня есть планы использовать по крайней мере один класс (в отдельном файле сценарий) с выделенными функциями PHP, которые имеют доступ к базе данных для различных частей сайта. После импорта этого сценария выше, как мне связать его и сделать вызов в базу данных через соединение объекта? Я использую следующий код:

<?php 
include_once("connect.php"); 
class PageFunctions 
{ 

    function printText() 
    { 
     if ($stmt = $this -> mysqlilink -> prepare("SELECT Text, MoreText FROM mytext WHERE id = 1")) 
     { 
      $stmt -> execute(); $stmt -> store_result(); 
      $rows = $stmt -> num_rows; 
      if ($rows == 0) { return 'Database Not Found'; } 
      else 
      { 
       $stmt -> bind_result($returnedText, $moreReturnedText); // Output variable(s) 
       while ($stmt -> fetch()) // Return results 
       { 
        return 'First text: ' . $returnedText . ' Second text: ' . $moreReturnedText; 
       } 
      } 
      $stmt -> free_result(); 
      return; 
     } 
     else { printf("Prepared Statement Error: %s\n", $this -> mysqlilink -> error); } 
    } 
} 
?> 

Повторюсь, мне нужно использовать первый пример кода, как класс, который формирует объект в нескольких других классов/файлов кода как второй образец кода. Поскольку я новичок в ориентации объектов PHP, я не смог успешно выполнить это, поэтому я подумал, что попрошу совета экспертов, прежде чем придумать плохое решение.

ответ

3

Похоже, вы ищете инъекцию зависимостей. Есть и другие способы, но это лучшая практика.

//create an object of the DB class 
$DB = new DB(); 

//create a PageFunctions object and pass the DB object into it as a dependency 
$PF = new PageFunctions($DB); 

//call your function from PageFunctions 
$PF->myFunction(); 

//follow these concepts and do whatever you want! 

Вы можете сделать эту работу, установив конструктор PageFunctions:

class PageFunctions() { 

    //we don't want to accidentally change DB, so lets make it private; 
    private $DB; 

    //this is the class constructor 
    //the constructor is called when instantiating the class - new PageFunctions() 
    public function __construct(DB $DB) { 
    //now the DB object is available anywhere in this class! 
    $this->DB = $DB; 
    } 
    //sample function 
    public function myFunction() { 
    $this->DB->connect(); 
    } 
} 

Таким образом, в любое время вы должны использовать класс внутри другого класса, сделать экземпляр (объект) его (или использование существующий) и передать его в новый класс, который нуждается в нем при создании экземпляра его.

Возможно, это поведение выполняется с использованием контейнера для впрыскивания зависимостей, но это все та же концепция, система и результат. Это немного более абстрактно. Как вы могли заметить из моего объяснения там, если у вас есть много классов, которые зависят от других классов, которые зависят от других классов и т. Д., Он может получить подавляющее ручное создание экземпляров и их передачу. Контейнер инъекции зависимостей хорошо, потому что он позволяет вам рассказать, как сделать каждый класс, и тогда он позаботится о том, чтобы положить их в целом.

+0

Я реализовал наше решение, но получаю две ошибки. Я неправильно понял ваши инструкции? Извините за несколько отличающиеся имена переменных и функций от образцов исходного вопроса. Все 3 файла кода и ошибки находятся здесь http://pastebin.com/QCva7hDK Спасибо – Keavon

+0

@Keavon похоже, что вы пытались использовать что-то вроде 'this this> mysqlilink' из класса PageIndex. Это свойство DB, в которое вы вошли. PageIndex не впитывает БД, он получает БД как свою собственную БД, поэтому вам нужно получить доступ к этому свойству, например '$ this-> DB -> $ mysqlilink'. Не забудьте принять мой ответ, если вы его оцените :) – m59

+0

Спасибо. Я обязательно отвечу и приму ответ, когда я заставлю его работать. Я добавил «DB ->», который избавился от первого «уведомления», которое он создавал, но я получаю эту ошибку: «Неустранимая ошибка: не удается получить доступ к частному свойству DB :: $ mysqlilink в D: \ XAMPP \ htdocs \ includes \ page_index .php on line 19' – Keavon

Смежные вопросы