За последние 24 часа нас посетили 56784 программиста и 1750 роботов. Сейчас ищет 871 программист ...

ООП. Начало.

Тема в разделе "Прочие вопросы по PHP", создана пользователем Nemovok, 4 ноя 2015.

Статус темы:
Закрыта.
  1. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    Здравствуйте. Решил научиться стилю ООП. Возникла проблема. Notice: Undefined variable: db_... in ...
    Как исправить? Как делать правильно?
    Код (PHP):
    1. class MyClass
    2.     {
    3.         private $db_host;
    4.         private $db_user;
    5.         private $db_password;
    6.         private $db_name;
    7.         /**
    8.          *
    9.          */
    10.         public function __construct() {
    11.             $this->db_host        = $db_host;
    12.             $this->db_user        = $db_user;
    13.             $this->db_password     = $db_password;
    14.             $this->db_name         = $db_name;
    15.  
    16.             return true;
    17.         }
    18.         /**
    19.          *
    20.          */
    21.         public function db_connect() {
    22.             $conenction = mysqli_connect($db_host, $db_user, $db_password, $db_name);
    23.             
    24.             if (!$connection) {
    25.                 echo "Error!";
    26.             }
    27.         }
    28.     }
    29.  
    30.     $object = new MyClass;
    31.     $object->db_connect("localhost", "root", "root", "admin");
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Вообще уведомление гласит что переменная не определена.

    И берите за правило выкладывал полный текст ошибок(предупреждений). Обычно ошибка указывает на строку в коде, где была допущена ошибка.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    видимо ты хотел эти параметры передавать в конструктор
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    передача параметров это для слабаков!
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    сарказм?)
     
  6. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    Вот полный список предупреждений:
    Notice: Undefined variable: db_host in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 12

    Notice: Undefined variable: db_user in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 13

    Notice: Undefined variable: db_password in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 14

    Notice: Undefined variable: db_name in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 15

    Notice: Undefined variable: db_host in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 23

    Notice: Undefined variable: db_user in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 23

    Notice: Undefined variable: db_password in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 23

    Notice: Undefined variable: db_name in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 23

    Warning: mysqli_connect(): (28000/1045): Access denied for user 'www-data'@'localhost' (using password: NO) in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 23

    Notice: Undefined variable: connection in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 24
    Error!
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Тебе подсказали. В конструкторе ты используешь переменные которые не объявлены.
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Код (Text):
    1. $this->db_host        = $db_host;
    откуда у тебя берется $db_host ?

    Добавлено спустя 9 минут 40 секунд:
    это только начало.
     
  9. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    Код (PHP):
    1.  private $db_host;
    2.  private $db_user;
    3.  private $db_password;
    4.  private $db_name;
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    хорошо, а что у тебя тогда $this->db_host ?

    Добавлено спустя 17 минут 19 секунд:
    mahmuzar, автару, вот ему memberlist.php?mode=viewprofile&u=42726 и еще некоторым надо объединится в команду, переучится на другой язык ну или если на каком-нибудь юнити можно делать игры на РНР тогда не надо переучиваться, и начать делать игры, там бы у них получались шедевры.
     
  11. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    VLK, предлагаешь с ними команду замутить?
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    не, это разбавит их сгусток производственного потенциала.
     
  13. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    Как мне передать
    Код (Text):
    1.  
    2.         private $db_host;
    3.         private $db_user;
    4.         private $db_password;
    5.         private $db_name;
    в __construct()?
     
  14. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    слух, вот ты начал учить ООП, до этого должен был учить просто функции, как ты там передавал параметры в функцию?
     
  15. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    Я сделал вот так :
    Код (PHP):
    1. public function __construct($db_host, $db_user, $db_password, $db_name) {}
    Но получил ошибки:
    Warning: Missing argument 1 for MyClass::__construct(), called in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 31 and defined in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 11

    Warning: Missing argument 2 for MyClass::__construct(), called in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 31 and defined in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 11

    Warning: Missing argument 3 for MyClass::__construct(), called in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 31 and defined in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 11

    Warning: Missing argument 4 for MyClass::__construct(), called in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 31 and defined in /var/www/html/php/gate/scripts/s_gate_1.0.php on line 11
     
  16. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну и молодец, вроде как у тебя теперь конструктор принимает параметры, а не берет их с неба, где в строке 31 ты передаешь то эти параметры?
     
  17. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    Но строка 31 у меня:
    Код (PHP):
    1. $object = new MyClass;
     
  18. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну и где в ней передача параметров?

    Добавлено спустя 3 минуты 4 секунды:
    Код (Text):
    1. $object = new MyClass("localhost", "root", "root", "admin");
    может как то так?
     
  19. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    Спасибо, понял теперь. Но предупреждения остались, что делать с ними?
     
  20. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну можно смериться, а можно перевести, подумать что это значит и устранить причину их появления.
     
  21. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    Исправил. Получилось вот так:
    Код (PHP):
    1. class MyClass
    2.     {
    3.         private $db_host;
    4.         private $db_user;
    5.         private $db_password;
    6.         private $db_name;
    7.         /**
    8.          *
    9.          */
    10.         function MyClass() {
    11.             $this->db_host        = $idb_host = "";
    12.             $this->db_user        = $idb_user = "";
    13.             $this->db_password     = $idb_password = "";
    14.             $this->db_name         = $idb_name = "";
    15.  
    16.             return true;
    17.         }
    18.         /**
    19.          *
    20.          */
    21.         function Connection() {
    22.             $connection = mysqli_connect($idb_host = "", $idb_user = "", $idb_password = "", $idb_name = "");
    23.  
    24.             if (!$connection) {
    25.                 echo "Error!";
    26.             }
    27.         }
    28.     }
    29.  
    30.     $object = new MyClass("localhost", "root", "GEvilNemovok00", "admin");
    31.     $object->Connection();
    Все ли в коде хорошо?
     
  22. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Nemovok, o_O.
    Не рано ли ты взялся за ООП?
    Код (PHP):
    1. function MyClass() {
    2.             $this->db_host        = $idb_host = "";
    3.             $this->db_user        = $idb_user = "";
    4.             $this->db_password     = $idb_password = "";
    5.             $this->db_name         = $idb_name = "";
    6.  
    7.             return true;
    8.         }
    ты взял что-то из php что-то из другого языка, и похоже ты не собираешься учиться, а просто копипастишь.
    читай: http://php.net/manual/ru/language.oop5.decon

    1. Когда ты пытаешься внутри метода (конструктор тоже является методом) используешь переменную, ты должен как то ее туда передать.

    пример:
    Код (PHP):
    1. function test($test1, $test2){
    2. //тут мы делаем с ними что хотим.
    3. }
     
  23. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Код (PHP):
    1. <?php
    2.  
    3. class Database
    4. {
    5.     private $db_host;
    6.     private $db_user;
    7.     private $db_password;
    8.     private $db_name;
    9.     private $connection;
    10.  
    11.     public function __construct($db_host, $db_user, $db_password, $db_name) {
    12.         $this->db_host = $db_host;
    13.         $this->db_user = $db_user;
    14.         $this->db_password = $db_password;
    15.         $this->db_name = $db_name;
    16.         $this->connnect();
    17.     }
    18.  
    19.     private function connect() {
    20.         $this->conenction = @mysqli_connect($this->db_host, $this->db_user, $this->db_password, $this->db_name);
    21.         if (mysqli_connect_errno()) {
    22.             throw new DatabaseException(mysqli_connect_error(), mysqli_connect_errno());
    23.         }
    24.     }
    25.  
    26.     public function getConnection() {
    27.         return $this->connection;
    28.     }
    29. }
    30.  
    31. class DatabaseException extends Exception {
    32.     
    33. }
    34.  
    35. try {
    36.     $database = new Database("localhost", "root", "root", "admin");
    37. } catch (DatabaseException $e) {
    38.     die($e->getMesage());
    39. }
    40.  
    41. $link = $database->getConnection();
    Но ООП - это не синтаксис. Ваш класс для работы с базой данных должен не просто взять параметры и вернуть ссылку на соединение, он должен скрыть внутри себя все потроха предоставив интерфейс для доступа к базе, желательно более удобный и заточенный под ваши нужды, чем оригинал. Потому как класс MySQLi уже существует и делает чуть больше чем ваш.

    Сейчас же вы просто плаваете в синтаксисе, областях видимости и тому подобных вещах.

    1. Изучите как работают функции, передача параметров, возвращение ответа
    2. Области видимости переменных, свойств и методов.
    3. Магические методы, до тех пор пока не поймете, почему в __construct() не нужно ничего возвращать )
    4. Исключения и работа с ними.
    5. Namespace и autoload

    А потом уже можно будет изучать методологии, паттерны и все остальное из чего состоит ООП.
     
  24. Nemovok

    Nemovok Новичок

    С нами с:
    30 окт 2015
    Сообщения:
    23
    Симпатии:
    0
    mahmuzar, почему ты решил, что я не пытаюсь учиться? Ведь я этим сейчас только и занимаюсь. И php, это мой первый (после html и css) язык, так что я не понимаю, что ты имел ввиду, когда говорил, что "ты взял что-то из php что-то из другого языка".
    romach, пойду перечитывать документацию.
    Спасибо всем за ответы.
     
  25. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Nemovok, извини, возможно я был не прав.
     
Статус темы:
Закрыта.