Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2011, 19:37   #1
Benderbej
Пользователь
 
Аватар для Benderbej
 
Регистрация: 23.08.2010
Сообщений: 42
По умолчанию Объект одного класса в конструкторе другого

Здравствуйте! начинаю программить классами.
Решил сделать два класса - первый класс для коннекта с базой , второй - класс формирующий запросы. Хочу в конструкторе второго класса вызвать объект первого - то бишь соединение с базой... и какие то нелады... Не видит во втором классе переменных и во втором классе приходится все прописывать заново
PHP код:
class Base_link {
    public  
$link;
    public  
$database;
    public  
$host;
    public  
$user;
    public  
$db_pass;

public function 
__construct($host$user$db_pass$database){
 
$this->host =  $host;
 
$this->user =  $user;
 
$this->db_pass $db_pass;
 
$this->database =  $database;

$this->link mysql_connect("$this->host",  "$this->user""$this->db_pass");//соединение с базой
mysql_query ("SET NAMES utf8");//кодировка выводимых из базы данных
mysql_query ("set character_set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");
mysql_select_db($this->database,$this->link) or die("Не могу подключиться к базе.");
return 
$this->link;
}
}

//=================================
//второй класс
//=================================


class Base_query {

public function 
__construct(){

 
$this->linkx = new Base_link();//с пустой скобкой( без параметров не вызывается)

}
    
#other methods
}
//==================================
//==================================

//Все работает только так.... 

//==================================
//==================================

class Base_link {
    public  
$link;
    public  
$database;
    public  
$host;
    public  
$user;
    public  
$db_pass;

public function 
__construct($host$user$db_pass$database){
 
$this->host =  $host;
 
$this->user =  $user;
 
$this->db_pass $db_pass;
 
$this->database =  $database;

$this->link mysql_connect("$this->host",  "$this->user""$this->db_pass");//соединение с базой
mysql_query ("SET NAMES utf8");//кодировка выводимых из базы данных
mysql_query ("set character_set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8_general_ci'");
mysql_select_db($this->database,$this->link) or die("Не могу подключиться к базе.");
return 
$this->link;
}
}

//=================================
//второй класс
//=================================


class Base_query {

public function 
__construct($host$user$db_pass$database){
//приходится и во втором классе прописывать все те же параметры
 
$this->host =  $host;
 
$this->user =  $user;
 
$this->db_pass $db_pass;
 
$this->database =  $database;
//инициализировать их внутри

 
$this->linkx = new Base_link("$this->host",  "$this->user""$this->db_pass""$this->database");
//и кроме того - писать еще все параметры в скобке при вызове объекта внутри конструктора!!!

}
    
#other methods

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

Последний раз редактировалось Benderbej; 13.02.2011 в 19:46.
Benderbej вне форума Ответить с цитированием
Старый 13.02.2011, 20:32   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Benderbej Посмотреть сообщение
вопрос, где смысл???
Актуальный вопрос - какой смысл разделять соединение с БД и выполнение запросов к БД...?

У вас в приложении бывает необходимость просто выполнить подключение к БД - но не выполнять при этом запросов к ней?
Для чего тогда выполнять подключение?

Не морочте себе голову - сделайте один класс для работы с БД.

Собственно по сабжу - это обычно делается наследованием.
Andkorol вне форума Ответить с цитированием
Старый 13.02.2011, 20:46   #3
Benderbej
Пользователь
 
Аватар для Benderbej
 
Регистрация: 23.08.2010
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Актуальный вопрос - какой смысл разделять соединение с БД и выполнение запросов к БД...?

У вас в приложении бывает необходимость просто выполнить подключение к БД - но не выполнять при этом запросов к ней?
Для чего тогда выполнять подключение?

Не морочте себе голову - сделайте один класс для работы с БД.

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

2)прочел, что при вызове производного класса - конструктор родительского не запускается...

подключение тогда лучше реализовать как один из методов класса БД?(не конструктор)
Benderbej вне форума Ответить с цитированием
Старый 13.02.2011, 22:20   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Benderbej Посмотреть сообщение
1)хочется на одно подключение к базе навесить несколько запросов, чтобы не создавать много подключений
Непонимание не только ООП - но и просто принципов работы с БД.

Процедурная работа с БД:
Цитата:
1.Создали подключение к БД( mysql_connect() и прочие действия... )
2.Выполняем запросы к БД:
mysql_query('запрос 1');
mysql_query('запрос 2');
.....
mysql_query('запрос 100500');
3.Соединение с БД будет закрыто автоматически после завершения работы скрипта - или же mysql_close()
ООП работа с БД:
Цитата:
1.Создали объект для работы с БД( подключились к БД конструктором или методом)
$db = new DataBase();
2.Выполняем запросы к БД:
$db->query('запрос 1');
$db->query('запрос 2');
.....
$db->query('запрос 100500');
3.Соединение с БД будет закрыто автоматически после завершения работы скрипта - или же $db->close();(метод,содержащий mysql_close())
Вывод: Да сколько угодно запросов можно выполнить на одном подключении...

Теории у вас маловато - отсюда и непонимание:
MySQL
ООП
Andkorol вне форума Ответить с цитированием
Старый 13.02.2011, 22:41   #5
Benderbej
Пользователь
 
Аватар для Benderbej
 
Регистрация: 23.08.2010
Сообщений: 42
По умолчанию

Спасибо!
Я собственно это и имел ввиду)))
просто не сразу догадался до этого)))
для решения конкретно этой задачи-самый элегантный и простой способ

все же вопроса с созданием нового объекта в конструкторе другого это не решает.
пока на практике не сделаю, - не пойму, сколько бы мануалов и книг не читал)
Benderbej вне форума Ответить с цитированием
Старый 13.02.2011, 22:48   #6
Benderbej
Пользователь
 
Аватар для Benderbej
 
Регистрация: 23.08.2010
Сообщений: 42
По умолчанию

Спасибо!
Я собственно это и имел ввиду)))
просто не сразу догадался до этого)))
для решения конкретно этой задачи-самый элегантный и простой способ

все же вопроса с созданием нового объекта в конструкторе другого это не решает.
пока на практике не сделаю, - не пойму, сколько бы мануалов и книг не читал)

а конкретно меня беспокоит такой исходник
PHP код:
 class Control
{
 public 
$mod;
 public 
$view;

 function 
__construct()
 {
                  
$this->mod = new ModClass;
                  
$this->view = new ViewClass;
         }

где от такой фишки бонусы)))
Benderbej вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37
Изменять приватные свойства одного класса внутри другого TwiX Общие вопросы Delphi 15 10.11.2010 20:40
Параметр конструктора класса = объект этого класса nazavrik Общие вопросы C/C++ 6 14.02.2010 13:48
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54
Вызов одного приложения из другого zalum Общие вопросы Delphi 8 24.04.2009 10:05