Я новичок в 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>"); } }