Как использовать $ db из другого .php для другого класса .php с помощью OOP?

Я новичок в OOP PHP, и я работал с процедурным API с тех пор, как начал веб-разработку, поэтому мне трудно переноситься в ООП.

поэтому, допустим, у меня есть четыре файла .php и структуры ниже.

connection.db.php

 <?php define("DB_HOST", "127.0.0.1"); define("DB_USER", "root"); define("DB_PASS", ""); define("DB_NAME", "sample_db"); $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); echo (!$db->connect_error) ? NULL : die("<pre>Unable to connect to the MySQL Server -> $db->connect_error</pre>"); ?> 

sampleclass.class.php

 <?php public $db; class MySQLqueries { public function samplefunction($queryString) { $sqlQry = mysqli->query($queryString); return ($sqlQry) ? "<pre>Query Executed Successfully</pre>" : die("<pre>An error occured -> $db->error</pre>"); } } ?> 

includes.inc.php

 <?php error_reporting(0); date_default_timezone_set("Asia/Manila"); require 'connection.db.php'; require 'sampleclass.class.php'; ?> 

index.php

 <?php require 'includes.inc.php'; $todo = new MySQLqueries; echo $todo->samplefunction("SELECT `sample_column` FROM `sample_table` WHERE `sample_column` = 'sample_value';"); ?> 

Как вы можете или не заметили, моя проблема заключается в том, как использовать $db из connection.db.php в samplefunction sampleclass.class.php

Вы можете спросить меня, почему бы не создать __construct() в sampleclass.class.php и просто переместить «$ db = new mysqli (DB_HOST, DB_USER, DB_PASS, DB_NAME)»; там ?. ну, если я это сделаю, все остальные классы должны иметь собственный constructor и $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); заявили, что правильно?

С $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); на connection.db.php Я предполагаю, что могу многократно использовать его.

Вы видите, что я объявил public $db; в sampleclass.class.php но я не знаю, что будет дальше. Если кто-то может мне помочь, я буду очень благодарен.

PS: Я уже консультировался с доктором Google Ph.D. по этому поводу, и я получил только тонны статей или видеоуроков, показывающих, как использовать и выполнять OOP PHP-MySQLi Programming, но без использования классов и методов.

Лучше всего создать класс DB или использовать уже созданный, чтобы достичь того, что вы пытаетесь сделать.

Обычный поток для таких вещей – это вызов Lazy Loading / Dependency Injection . Где вы передаете требуемые объекты в класс.

Если вы выберете этот путь, я предлагаю вам ознакомиться с Injection Dependency Injection, как это многие делают, имеет плюсы и минусы, но имеет важное значение в ООП.

Как сказал Бен в комментариях :

Инъекционная инъекция является ключевым принципом в ООП. Я хотел бы добавить, что если вы серьезно относитесь к ООП, вы также должны изучить автозагрузчики в целом , PSR-4 и Composer .

Сторона, не указанная выше, вам лучше всего взглянуть на PHPTheRightWay , они перечисляют много вещей, включая Injection Dependency .

Вы создадите что-то вроде этого. Было бы лучше, если бы вы последовали этому примеру, чтобы понять, как это работает:

 Class DB { function __construct($host, $user, $pass, $db) { return $this->connect($host, $user, $pass, $db); } function connect($host, $user, $pass, $db) { //..connect and all. } //...the rest of your functions/class... } 

Вы можете построить это в любом случае. Или просто сделайте объект mysqli доступным, позволяя вам его вызвать.

Теперь мы получаем удовольствие. Фактически вводите его в свой класс;

 Class Foo { $private $db; // your construct method here will ONLY except a `DB` class instance/object as $db. // Try it with anything else and learn from the errors to understand what I mean. function __construct(DB $db){ $this->db = $db; } } $db = new DB($host, $user, $pass, $db); // you can error check it here $foo = new Foo($db);// inject the $db object. 

Если вы просто хотите поделиться ресурсом, вы можете использовать global , но он сильно обескуражен .

 include('connection.db.php'); class MySQLqueries { public function samplefunction($queryString) { global $db; $sqlQry = mysqli->query($queryString); return ($sqlQry) ? "<pre>Query Executed Successfully</pre>" : die("<pre>An error occured -> $db->error</pre>"); } } в include('connection.db.php'); class MySQLqueries { public function samplefunction($queryString) { global $db; $sqlQry = mysqli->query($queryString); return ($sqlQry) ? "<pre>Query Executed Successfully</pre>" : die("<pre>An error occured -> $db->error</pre>"); } } 

Если вы выбрали этот путь, вам лучше всего назначить global экземпляр $db внутренней переменной класса, например $this->db .

По мере того, как вы пытаетесь использовать объекты, вы, вероятно, также должны перейти к реализации ООП (объектно-ориентированное программирование).

Таким образом, вы можете поместить переменную $db в качестве статической переменной в файле sampleclass.class.php , как в:

 class MysqlConn { public static $db; } 

Подобно этому вы создаете экземпляр объекта mysqli, используя этот код:

 MysqlConn::$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); 

Еще лучше, вы могли бы создать метод для создания соединения $ db, инициализировать переменные в этом классе:

 <?php class MysqlConn { protected static $DB_HOST = "127.0.0.1", static $DB_USER = "root", static $DB_PASS = "", static $DB_NAME = "sample_db"; protected static $db; public static function getDB() { if (!isset(self::$db) { self::$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); if ($db->connect_error) { die("<pre>Unable to connect to the MySQL Server -> $db->connect_error</pre>"); } } return self::$db; } } MysqlConn::getDB(); 

В index.php вы можете получить экземпляр db со следующим кодом, а не повторно подключаться каждый раз:

 $db = MysqlConn::getDB(); 

моя проблема заключается в том, как использовать $ db из connection.db.php в samplefunction sampleclass.class.php

Вы можете использовать глобальный в вашем случае просто incluce или require connection.db.php затем использовать global в php.

Что-то вроде этого может помочь вам

  require_once 'connection.db.php'; class MySQLqueries { public function samplefunction($queryString) { global $db; //You can now use $db variable as you want print_r($db); $sqlQry = mysqli->query($queryString); return ($sqlQry) ? "<pre>Query Executed Successfully</pre>" : die("<pre>An error occured -> $db->error</pre>"); } }