Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вопрос о наследовании

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Начал недавно изучать php и столкнулся с проблемой
Agation
Отправлено: 22 Апреля, 2012 - 08:51:46
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Здравствуйте, Господа! Не так давно приступил к изучению php. Почитал немного литературы и статьей, скачал видео курс "Объектно-ориентированный подход в PHP". При воспроизведении кода из видео уроков столкнулся с проблемой.
Есть класс Config(в файле config.php) с полями для работы с DB. Его наследник класс db( в файле bd.php) осуществляет коннект к DB и выполнение запросов. Создаю файл mmenu.php который использует db.php, затем создаю cmenu.php который, в свою очередь, использует mmenu.php.
Листинги:
config.php
PHP:
скопировать код в буфер обмена
  1.  
  2.     class Config {
  3.            
  4.        var $BASE_URL = "localhost/test";
  5.        
  6.        var $DB_HOST = 'localhost';
  7.        var $DB_USER = 'root';
  8.        var $DB_PASS = '';
  9.        var $DB_NAME = 'test';
  10.     }
  11.  




db.php
PHP:
скопировать код в буфер обмена
  1.  
  2. require 'config.php';
  3.    
  4.     class Db extends Config {
  5.        
  6.         private $connection;
  7.         var $DB_NM = "text";   //моя переменная. Если её использовать в mysql_select_db то выбор БД проходит
  8.                  
  9.         function __construct(){
  10.            
  11.             $this->open_connection();
  12.             echo "Object is Db created! *** ";
  13.         }
  14.        
  15.          private function open_connection() {
  16.  
  17.             $this->connection = mysql_connect($this->DB_HOST,$this->DB_USER,$this->DB_PASS);
  18.             if(!$this->connection) {
  19.                 die ("Database connecton failed: ".mysql_error());
  20.             }      
  21.             $db_select = mysql_select_db($this->DB_NAME);
  22.             if(!$db_select) {
  23.             die ("Database seletion failed: ".mysql_error());
  24.             }
  25.             mysql_query("set names utf8") or die ("set names utf8 failed") ;
  26.             echo "Set connection! *** ";
  27.             }            
  28.                
  29.        
  30.         public function sql($query) {
  31.            
  32.             if(!$this->connection){
  33.                 $this->open_connection() ;
  34.             }
  35.            
  36.             $result = mysql_query($query);
  37.             if(!$result){
  38.                 die("Database query failed: ".mysql_error());
  39.             }
  40.             return $result;
  41.         }
  42.     }
  43.     $db = new Db();
  44.  



mmenu.php
PHP:
скопировать код в буфер обмена
  1.  
  2.     require_once "../config2/db.php";
  3.    
  4.     class Mmenu extends Db{
  5.         function return_menu() {
  6.             $sql = "select menu_name from page" ;
  7.             $res = $this->sql($sql) ;
  8.             return $res;
  9.         }
  10.     }
  11.  



cmenu.php
PHP:
скопировать код в буфер обмена
  1.  
  2.    require_once '../models/mmenu.php' ;
  3.    
  4.    
  5.     class Cmenu extends Mmenu {
  6.        
  7.         function print_menu() {
  8.             $res = $this->return_menu() ;
  9.             while($row = mysql_fetch_array($res,MYSQL_ASSOC)) {
  10.                 $mname[$row['id']] = $row['menu_name'] ;
  11.             }
  12.             return $mname;
  13.         }
  14.     }
  15.    
  16.     $var = new Cmenu;
  17.     $var2 = array();
  18.     $var2 = $var->print_menu() ;
  19.    
  20.     echo "<pre>";
  21.     print_r($var2);
  22.     echo "</pre>";
  23.     echo $var->var12;
  24.  



Проблема в том что на странице db.php все проходит без проблем, осуществляется конект и выбор БД.
А вот в cmenu.php выбор БД не проходит! Пробовал вывести значение $DB_NAME в db.php. Если открыть db.php то значение выводиться. Если открыть cmenu.php то $DB_NAME пустое!
Пытался сам найти в чем проблема, но не смог! Вроде всё правильно написано... работаю в eclipse + plugin Aptana. php среда XAMPP 2.5. версия php 5.3.8
Подскажите, пожалуйста, в чем может быть дело?!

(Отредактировано автором: 22 Апреля, 2012 - 09:19:18)

 
 Top
ams
Отправлено: 22 Апреля, 2012 - 10:06:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 351
Дата рег-ции: Нояб. 2010  


Помог: 13 раз(а)




В классе Mmenu нужно сделать:
public function __construct() {

parent::__construct();
}
 
 Top
caballero
Отправлено: 22 Апреля, 2012 - 10:17:54
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Вроде всё правильно написано...


Даже близко неправильно.

Глупо наследовать DB от Config - это разные сущности.
Еще глупее наследовать объекты от DB с конектом - теперь в каждом из екземпляров класса будет свой конект к серверу БД .


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Agation
Отправлено: 22 Апреля, 2012 - 10:37:28
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




ams пишет:
В классе Mmenu нужно сделать:
public function __construct() {

parent::__construct();
}


не помогло. в cmenu.php так же не проходит выбор БД(((

caballero пишет:
Глупо наследовать DB от Config - это разные сущности.
Еще глупее наследовать объекты от DB с конектом - теперь в каждом из екземпляров класса будет свой конект к серверу БД .


ни разу не спорю о правильности данной конструкции как о коде боевого проекта. Но речь не об этом. Вопрос почему из файла cmenu.php не осуществляется выбор БД? А если точнее почему наследник не получает значение поля родителя? Ведь если попробовать вывести в db.php переменную $DB_MANE, при открытии db.php она выводиться. При открытии cmenu.php не выводиться.... в чем тут собака зарыта?
 
 Top
dadli
Отправлено: 22 Апреля, 2012 - 11:06:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Май 2011  
Откуда: тифилис


Помог: 5 раз(а)




Agation
прастите за офтоп но в етом видеоуроке так обявлени своиства:
PHP:
скопировать код в буфер обмена
  1. var $BASE_URL = "localhost/test";

?
var - ето же в пхп 4 исползовали ?

(Отредактировано автором: 22 Апреля, 2012 - 11:16:29)

 
 Top
Agation
Отправлено: 22 Апреля, 2012 - 11:31:27
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




dadli, да, именно так, в классах через var. А как сей час нужно, прописывать модификатор public или private?
 
 Top
dadli
Отправлено: 22 Апреля, 2012 - 12:08:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Май 2011  
Откуда: тифилис


Помог: 5 раз(а)




Agation
Цитата:
прописывать модификатор public или private?

да, или protected
http://www.php.net/manual/ru/lan...5.properties.php
 
 Top
Panoptik
Отправлено: 22 Апреля, 2012 - 12:11:08
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




public - аналог var. но так как существует обратная совместимость то var успешно будет работать. просто лучше писать public


-----
Just do it
 
 Top
Agation
Отправлено: 22 Апреля, 2012 - 12:39:10
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




dadli,Panoptik, хорошо. С модификатором public ситуация та же. Не может из cmemu.php отобразиться значение $DB_NAME.... Может дело в настройках php сервера?
 
 Top
Panoptik
Отправлено: 22 Апреля, 2012 - 12:49:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




нет, сервер тут не причем. покажите лучше как вы пытаетесь прочитать переменные


-----
Just do it
 
 Top
caballero
Отправлено: 22 Апреля, 2012 - 13:08:22
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
ни разу не спорю о правильности данной конструкции как о коде боевого проекта

Не надо вырабатывать привычку говнокодить. Иначе и в боевом будет то же самое.
В данном случае нужно использовать агрегацию а еще лучше синглктон.

Но раз ты уж плодишь отдельные конекты на кажлый объект то надо писать
$db_select = mysql_select_db($this->DB_NAME,$this->connection);

и распечатай сам объект
$var = new Cmenu;
var_dump($var);
чтобы посмотреть что там внутри.

(Отредактировано автором: 22 Апреля, 2012 - 13:09:07)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Agation
Отправлено: 22 Апреля, 2012 - 13:50:00
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Panoptik пишет:
нет, сервер тут не причем. покажите лучше как вы пытаетесь прочитать переменные


в cmenu.php
PHP:
скопировать код в буфер обмена
  1. $var = new Cmenu;
  2. echo $var->DB_NAME;


или же в db.php



если открываем cmenu.php то ничего не выводиться ни из db.php ни из cmenu.php

caballero пишет:
Не надо вырабатывать привычку говнокодить.


а я и не кодил вообщем, просто воспроизводил, о чем и упомянул в первом посте. Улыбка
ноль реакции на var_dump прописанный в cmenu.php
в db.php var_dump($db) выдаёт инфу об объекте и значение полей унаследованных от Config
 
 Top
caballero
Отправлено: 22 Апреля, 2012 - 13:52:42
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




сложи все классы в один отдельный файл и пробуй в одном месте
а вообще в таких случаях неплохо бы дебаггер юзать


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Agation
Отправлено: 22 Апреля, 2012 - 13:58:50
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




caballero пишет:
а вообще в таких случаях неплохо бы дебаггер юзать


не спорю. но пока не брался за эту тему. попробовал тем что аптана предложила - получил в браузере что-то типа var_dump'а. точки останова не срабатывают, значение переменных в ходе выполнения скрипта проследить не могу.

насчет всё в один файл - уверен на 100% что будет работать. Но в данном случае хочется разобратся с подключением файлов. Очень печально будет потом где-то встретиться с данной проблемой не имея опыта её решения...
 
 Top
Panoptik
Отправлено: 22 Апреля, 2012 - 13:59:07
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




ничего не выводится может в случае ошибки в коде. напишите в начале файла


-----
Just do it
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB