Forum Webscript.Ru
Программирование => PHP => Тема начата: Алексей от 04 Мая 2005, 13:46:23
-
У меня имеется класс DB, для работы с БД.
Есть другой класс, который в данный момент является extends по отношению к DB:
class DB{
...
}
class OUTPUT extends DB{
...
}
Вот. Почему extends? потому, что в классе OUTPUT (это форматирование информаци перед разного рода выводом) имеется 1 метод из класса DB.
Получается, что в своих сценариях я запускаю либо DB, либо OUTPUT, в зависимости от того, нужно ли будет данные перед отправкой клиенту форматировать или нет.
Вот я и не уверен, правильно ли я делаю.. Может какие-нибудь другие способы есть вызвать метод класса DB из класса OUTPUT? Хотя с другой стороны, удобно инициализировать лишь OUTPUT
$myDB = new OUTPUT();
а не вызывать сначала класс DB, а потом и OUTPUT... Вобщем не знаю...
-
Алексей
extends - ключевое слово. Наследование. Т.е. класс OUTPUT должен расширять класс DB, а не использовать.
Наследование может быть необходимо, если DB - это некий абстрактный класс для работы с базами данных вообще, а класс OUTPUT реализует, к примеру, работу с отдельно взятой СУБД (aka MySQL).
Если класс OUTPUT только использует методы класса DB, а не дополняет класс своими методами, то лучше использовать не наследование, а просто добавить в класс OUTPUT ссылку на класс DB. Например так:
class DB {
}
$dbh = new DB;
class OUTPUT {
var $dbh;
function OUTPIT($dbh) {
$this->dbh = $dbh;
}
}
$out = new OUTPUT(&$dbh);
-
Croaker
понял, спасибо. Ща попробую разобраться..
-
Алексей
ты случайно не по статьям курепина учился ?
Croaker:
class DB {
}
$dbh = new DB;
class OUTPUT {
var $dbh;
function OUTPIT($dbh) {$this->dbh = $dbh; }
}
$out = new OUTPUT(&$dbh);
ИМХО правильнее :
class OUTPUT {
var $dbh;
function OUTPIT(&$dbh) {
$this->dbh = &$dbh;
}
}
$out = new OUTPUT($dbh);
твой код выдает warning при allow_call_time_pass_reference = Off в пхп4. В остальном все верно.
-
Макс
Не знал. По логике вещей код
function OUTPIT(&$dbh) {
$this->dbh = &$dbh;
}
Объявляет $this->dbh ссылкой на ссылку на объект. Не? Я не сильно в этом вопросе шарю. =\\
-
Croaker
все верно.
Ведь нам в скрипте не надо 2 экземпляра объекта соединения с БД
-
Макс
Не надо. Но откуда два экземпляра, если мы ссылку передаем изначально? По логике вещей в классе OUTPUT пользуем ссылку на единственный объект. Откуда второй берется?
-
1. Почему код $a = call_some_func(&$var)
считается некачественным ?
Потому что внутри функции call_some_func() нельзя определить, имеем ли мы дело с переменной или с ссылкой на нее.
2. если писать function call_some_func(&$var) {
$b = &$var;
}
то мы точно будем иметь дело именно со ссылкой, а не со значением
3. В обсуждаемом случае второй объект (копия объекта) появится если не писать & в конструкторе :function OUTPIT(&$dbh) {
$this->dbh = &$dbh;
}
-
Макс
Спасибо :)
Макс:
утри функции call_some_func() нельзя определить, имеем ли мы дело с переменной или с ссылкой на нее
вот этого не знал.
-
Макс
нет, я его не читал.
так как правильно?
-
Алексей:
так как правильно?
так как написал Croaker с моими поправками.
Мои правки носят чисто технический характер. С точки зрения идеологии ООП Croaker все верно написал
-
Опять я возвращаюсь к этой теме.
Вообщем, я понял что и как и куда, зачем ссылки нужны тут, вот что получается:
class DB {
//........
}
class OUTPUT {
var $dbh;
function OUTPUT(&$dbh) {
$this->dbh = &$dbh;
}
}
// вызываю
$dbh = new DB; //сначала главный класс
$out = new OUTPUT($dbh); //потом класс обработки информации
Теперь я не понимаю, как мне со всем этим работать. раньше был экземпляр лишь одного класса. Теперь я инициализирую 2 класса, и для каждого действия приходится работать с определённым классом.
Т.е. раньше было:
$myDB= new DB;
// работаем с функцией класса DB - делаем SQL запрос
$data = $myDB->get_rezar("SELECT .........");
// работает с функцией класса OUTPUT, которая использует в своём теле функции из класса DB
$data = $myDB->replace_template($data);
а теперь как?
воот что получается (неудобно!)
$mainDB = new DB;
$myDB = new OUTPUT($mainDB);
// работаем с классом DB - делаем SQL запрос
$data = $mainDB->get_rezar("SELECT .........");
// работаем с классом OUTPUT
$data = $myDB->replace_template($data);
это правильно? но это чертовски нудобно. инициазизация 2 классов + работа с разными классами.... или я что-то не так сделал?
-
Алексей
Так в этом идеология ООП и заключается. Класс MainDB ничего не знает о том, что будет происходить с данными, которые он возвращает. Он только знает, что взять и как вернуть. Класс MyDb вообще не интересует, откуда взялись данные. Он единственное что умеет - сделать обработку получаемых данных. У тебя (пока) не совсем праильная архитектура классов. Если я правильно поинмаю то что тебе надо, то написать надо так:
$mainDb = new Db();
$result = new MyDb();
$data = $result->replace_template($mainDB->getRezar());
-
sarutobi
понятно, спасибо.
-
Люди! Я решил всё на PHP 5 писать.
Насколько я понял, мне теперь просто нужно знаки амперсанд убрать, т.к. в 5 версии мы работаем не с копией, а с сылкой, т.е.:
class DB {
//........
}
class OUTPUT {
var $dbh;
function OUTPUT($dbh) {
$this->dbh = $dbh;
}
}
// вызываю
$dbh = new DB; //сначала главный класс
$out = new OUTPUT($dbh); //потом класс обработки информации
да?
-
Алексей
1. а ты хочешь работать с ссылкой или копией ?
2. Может правильнее будет спросить как научиться определять, когда работаешь с ссылкой а когда с копией ?
-
Макс
мне нужно просто работать с методом класса DB в классе OUTPUT.
для этого, мы передавали в OUTPUT ссылку(&) на DB, т.к. явно передавать переменную объекта в 4 версии нельзя было - передавалась лишь копия.
А с 5 версией вроде бы можно ссылку не ставить - будет сразу передаваться тот же объект. Это описано в одном из номеров PHPinside, о новшевствах 5 версии.
Поэтому я и спрашиваю.
1. Да мне в принципе всё равно в данном случае. Хотя нет.. наверно имено с ссылкой.
2. В 5 версии ты всегда будешь работать со ссылкой. Или я не прав?
Т.е. было у нас раньше:
class OUTPUT {
var $dbh;
function OUTPIT(&$dbh) {
$this->dbh = &$dbh;
}
}
$dbh = new DB;
$out = new OUTPUT($dbh);
теперь, с выходом пятерки. насколько я понимаю, это можно переписать так:
(эффект будет один и тот же)
class OUTPUT {
private $dbh;
function __construct($dbh) {
$this->dbh = $dbh;
}
}
$dbh = new DB;
$out = new OUTPUT($dbh);
-
По-моему ты совсем не понимаешь разницы между ссылками и копиями
-
Алексей:
2. В 5 версии ты всегда будешь работать со ссылкой. Или я не прав?
неправ. В пятерке можно работать с копией, но для этого надо делать определенные действия
-
Макс
ну как? ссылка - работаем с тем же объектом.
копия - это копия.
В пятерке можно работать с копией, но для этого надо делать определенные действия
clone??
-
да, все верно.