#php #oop
#php #ооп
Вопрос:
Я создаю небольшую CMS для конкретного использования на моей текущей работе, и я хочу сделать это правильно … отсюда и ООП.
Для этого я хочу создать класс подключения к базе данных, который я могу использовать в других своих классах, когда мне нужно выполнять запросы к базе данных. Однако по какой-то причине я продолжаю останавливаться в одной и той же точке, потому что, похоже, я не могу получить строку подключения в свои классы.
Какие бы изменения я ни вносил, каждый раз я получаю что-то вроде «undefined …».
Файл — databaseManagement.class.php:
class database {
private $user;
private $pass;
private $db;
private $serv;
private $type;
private $dsn;
private $sqlsrvString;
private $charset;
private $dbIni;
private $options;
public $connectionInfo;
public $dbConn;
public function __construct() {
$this->dbIni = parse_ini_file('settings/database.ini.php');
// ... assign values to individual variables based on values in the database.ini.php file.
$this->user = $this->dbIni['user'];
$this->pass = $this->dbIni['pass'];
$this->db = $this->dbIni['db'];
$this->serv = $this->dbIni['serv'];
$this->type = $this->dbIni['type'];
$this->charset = $this->dbIni['charset'];
$this->connectionInfo = array(
"Database"=>$this->db,
"UID"=>$this->user,
"PWD"=>$this->pass
);
}
public function dbConnect() {
$this->dbConn = sqlsrv_connect($this->serv, $this->connectionInfo);
}
Файл — smallInfo.class.php
class smallInfo {
function __construct() {
$initDB = new database();
$initDB->dbConnect();
var_dump($initDB);
}
function showDkProgress(){
echo "<hr />";
print_r($initDB->dbConn);
echo "<hr />";
}
Теперь var_dump() в конструкторе smallInfo возвращает все ожидаемые значения, включая значения $ DBConn, однако, похоже, я не могу получить доступ к $ DBConn в showDkProgress() для использования в запросах.
Комментарии:
1. Что показывает ваш
print_r($initDB->dbConn)
вызов?2. PHP Notice: Неопределенная переменная: initDB в asfomodulessmallInfosmallInfo.class.php в строке 12 PHP Обратите внимание: попытка получить свойство ‘DBConn’ не-объекта в asfomodulessmallInfosmallInfo.class.php в строке 12
3. Просто в сторону — возможно, стоит прочитать php-fig.org/psr/psr-12 для некоторых стандартов кодирования. Это хорошее руководство по некоторым базовым вещам, которые помогают удобочитаемости кода.
4. сначала объявите
$initDB
как свойство, затем получите к нему доступ как$this->initDB
, вы уже получили его в первом классе, просто следуйте тому же примеру5. определите свойство
$dbConn
в классе SmallInfo. используйте$this->dbConn = $initDB->dbConnect();
в своем конструкторе — теперь вы можете получить доступ к своему DBConn из других методов вашего класса, используя$this->dbConn
Ответ №1:
Две проблемы:
-
Конструкторы не устанавливают переменные (например
$variableName
) в качестве атрибутов объекта. Вы должны явно назначить его с помощью$this->variableName
присваивания. -
В отличие от Java, реализация ООП в PHP не создает автоматически псевдонимы атрибутов. Переменная
$variableName
в методе автоматически не равна$this->variableName
.
Итак:
class smallInfo {
function __construct() {
$this->initDB = new database();
$this->initDB->dbConnect();
var_dump($this->initDB);
}
function showDkProgress(){
echo "<hr />";
print_r($this->initDB->dbConn);
echo "<hr />";
}
}
Комментарии:
1. Вау… Это так глупо (для меня)… Я уже пробовал решение «print_r ($this-> initDB-> DBConn);», но ни разу не подумал, что $ this-> также требуется для конструктора… Так очевидно, но все же пропустил это… Спасибо.
2. Для начинающих легко перепутать атрибуты и локальные переменные. Также разные языки имеют разную реализацию одной и той же концепции. Ваш способ кода (не точный синтаксис), вероятно, может работать плавно на Java. PHP требует, чтобы вы были немного более ясными.
Ответ №2:
В вашем smallinfo
классе initDB
есть локальная переменная внутри конструктора. Он не существует вне конструктора.
Таким образом, доступ к неопределенной переменной с именем initDB
в showDkProgress
выдает ошибку.
Вам нужно создать initDB
поле.
class smallInfo {
private $initDB;
function __construct() {
$this->initDB = new database();
$this->initDB->dbConnect();
var_dump($this->initDB);
}
function showDkProgress(){
echo "<hr />";
print_r($this->initDB->dbConn);
echo "<hr />";
}
}
Ответ №3:
Функция showDkProgress() не может получить его, поскольку это всего лишь локальная переменная в конструкторе. Если вы вставляете $initDB в класс, вы должны добавить для него поле.
так что попробуйте, например:
class smallInfo {
public $initDB;
function __construct() {
$this->initDB = new database();
$this->initDB->dbConnect();
function showDkProgress(){
$si = new smallInfo();
echo "<hr />";
print_r($this->initDB->dbConn);
echo "<hr />";
}