Кажется, не совсем понимаю, как использовать конструктор

#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:

Две проблемы:

  1. Конструкторы не устанавливают переменные (например $variableName ) в качестве атрибутов объекта. Вы должны явно назначить его с помощью $this->variableName присваивания.

  2. В отличие от 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 />";
}