Здравствуйте. Решил научиться стилю ООП. Возникла проблема. Notice: Undefined variable: db_... in ... Как исправить? Как делать правильно? Код (PHP): class MyClass { private $db_host; private $db_user; private $db_password; private $db_name; /** * */ public function __construct() { $this->db_host = $db_host; $this->db_user = $db_user; $this->db_password = $db_password; $this->db_name = $db_name; return true; } /** * */ public function db_connect() { $conenction = mysqli_connect($db_host, $db_user, $db_password, $db_name); if (!$connection) { echo "Error!"; } } } $object = new MyClass; $object->db_connect("localhost", "root", "root", "admin");
Вообще уведомление гласит что переменная не определена. И берите за правило выкладывал полный текст ошибок(предупреждений). Обычно ошибка указывает на строку в коде, где была допущена ошибка.
Вот полный список предупреждений: 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!
Код (Text): $this->db_host = $db_host; откуда у тебя берется $db_host ? Добавлено спустя 9 минут 40 секунд: это только начало.
хорошо, а что у тебя тогда $this->db_host ? Добавлено спустя 17 минут 19 секунд: mahmuzar, автару, вот ему memberlist.php?mode=viewprofile&u=42726 и еще некоторым надо объединится в команду, переучится на другой язык ну или если на каком-нибудь юнити можно делать игры на РНР тогда не надо переучиваться, и начать делать игры, там бы у них получались шедевры.
Как мне передать Код (Text): private $db_host; private $db_user; private $db_password; private $db_name; в __construct()?
слух, вот ты начал учить ООП, до этого должен был учить просто функции, как ты там передавал параметры в функцию?
Я сделал вот так : Код (PHP): 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
ну и молодец, вроде как у тебя теперь конструктор принимает параметры, а не берет их с неба, где в строке 31 ты передаешь то эти параметры?
ну и где в ней передача параметров? Добавлено спустя 3 минуты 4 секунды: Код (Text): $object = new MyClass("localhost", "root", "root", "admin"); может как то так?
Исправил. Получилось вот так: Код (PHP): class MyClass { private $db_host; private $db_user; private $db_password; private $db_name; /** * */ function MyClass() { $this->db_host = $idb_host = ""; $this->db_user = $idb_user = ""; $this->db_password = $idb_password = ""; $this->db_name = $idb_name = ""; return true; } /** * */ function Connection() { $connection = mysqli_connect($idb_host = "", $idb_user = "", $idb_password = "", $idb_name = ""); if (!$connection) { echo "Error!"; } } } $object = new MyClass("localhost", "root", "GEvilNemovok00", "admin"); $object->Connection(); Все ли в коде хорошо?
Nemovok, . Не рано ли ты взялся за ООП? Код (PHP): function MyClass() { $this->db_host = $idb_host = ""; $this->db_user = $idb_user = ""; $this->db_password = $idb_password = ""; $this->db_name = $idb_name = ""; return true; } ты взял что-то из php что-то из другого языка, и похоже ты не собираешься учиться, а просто копипастишь. читай: http://php.net/manual/ru/language.oop5.decon 1. Когда ты пытаешься внутри метода (конструктор тоже является методом) используешь переменную, ты должен как то ее туда передать. пример: Код (PHP): function test($test1, $test2){ //тут мы делаем с ними что хотим. }
Код (PHP): <?php class Database { private $db_host; private $db_user; private $db_password; private $db_name; private $connection; public function __construct($db_host, $db_user, $db_password, $db_name) { $this->db_host = $db_host; $this->db_user = $db_user; $this->db_password = $db_password; $this->db_name = $db_name; $this->connnect(); } private function connect() { $this->conenction = @mysqli_connect($this->db_host, $this->db_user, $this->db_password, $this->db_name); if (mysqli_connect_errno()) { throw new DatabaseException(mysqli_connect_error(), mysqli_connect_errno()); } } public function getConnection() { return $this->connection; } } class DatabaseException extends Exception { } try { $database = new Database("localhost", "root", "root", "admin"); } catch (DatabaseException $e) { die($e->getMesage()); } $link = $database->getConnection(); Но ООП - это не синтаксис. Ваш класс для работы с базой данных должен не просто взять параметры и вернуть ссылку на соединение, он должен скрыть внутри себя все потроха предоставив интерфейс для доступа к базе, желательно более удобный и заточенный под ваши нужды, чем оригинал. Потому как класс MySQLi уже существует и делает чуть больше чем ваш. Сейчас же вы просто плаваете в синтаксисе, областях видимости и тому подобных вещах. 1. Изучите как работают функции, передача параметров, возвращение ответа 2. Области видимости переменных, свойств и методов. 3. Магические методы, до тех пор пока не поймете, почему в __construct() не нужно ничего возвращать ) 4. Исключения и работа с ними. 5. Namespace и autoload А потом уже можно будет изучать методологии, паттерны и все остальное из чего состоит ООП.
mahmuzar, почему ты решил, что я не пытаюсь учиться? Ведь я этим сейчас только и занимаюсь. И php, это мой первый (после html и css) язык, так что я не понимаю, что ты имел ввиду, когда говорил, что "ты взял что-то из php что-то из другого языка". romach, пойду перечитывать документацию. Спасибо всем за ответы.