Программирование на PHP довольно ново для меня, поэтому я надеюсь, что не буду спрашивать что-то глупое. Однако я не смог найти ответа на мою проблему :-(
Я сохранил соединение с базой данных в отдельном файле .php. Допустим, "connection.inc.php"
Connection.inc.php выглядит следующим образом:
$host = "name.server.com";
$dbname = "foo";
$user = "bar";
$pass = "PaSW0rd";
try
{
$DBH = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch(PDOException $e)
{
...
}
В моем index.php я бы включил connection.inc.php с include_once «connection.inc.php»
Кроме того, у меня есть класс house.class.php, в котором у меня есть метод с SQL-запросом к моей базе данных. Я вызываю метод через getColor ($ id, $ DBH) из моего index.php
Есть ли способ использовать метод, не всегда помещая $ DBH в вызов?
Спасибо за вашу помощь!
3 ответа
Допустим, у вас есть класс с именем House
с методом getColor()
и в вашем index.php
. Вы можете использовать ключевое слово global
внутри своей функции / метода, но я категорически против этого. Пример:
public function getColor(int $id)
{
global $dbh;
//and use it as $dbh
$dbh->prepare(....
}
Или вы можете добавить его в конструктор. Пример того, как будет выглядеть ваш класс
class House
{
private $dbh;
function __construct($dbh)
{
$this->dbh = $dbh;
}
public function getColor($id)
{
//$this refers to current object context
$this->dbh->prepare.....
}
}
И когда вы создаете экземпляр объекта House, вы передаете $DBH
в конструктор. Пример для вашего index.php
:
include_once "connection.inc.php";
$house = new House($DBH);
$house->getColor($id);
Тем не менее, я предлагаю вам ознакомиться с управляемым доменом дизайном, шаблоном фабрики и репозитория и ORM, например Doctrine или Eloquent, чтобы лучше понять, как отделить логику приложения / домена от базы данных.
class Database
{
private $host = "localhost";
private $dbname = "codeignitor";
private $username = "root";
private $password = "";
public $conn;
public function getConnection()
{
$this->conn = null;
try {
$this->conn = new PDO ("mysql:host=" . $this->host . ";dbname=" . $this->dbname, $this->username, $this->password);
$this->conn->exec("set names utf8");
// echo "MySqlConnected";
} catch(PDOException $exception){
echo "Connection error: " . $exception->getMessage();
}
return $this->conn;
}
}
Вы должны получить $DBH
из самого класса, а не из индексного файла. Затем вы можете иметь доступ к этому экземпляру соединения с базой данных, чтобы использовать весь класс вместе с другими методами в этом классе, без необходимости повторного соединения для каждой функции или предоставления каждой функции соединения в качестве аргумента.
Пример этого будет выглядеть примерно так:
House.class.php
<?php
class House{
private $DBH;
function __construct(){
include_once "connection.inc.php";
$this->DBH = $DBH;
}
function getColor($id){
$this->DBH // <---- use it like this instead of your $DBH old variable.
}
}
?>
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.