Несколько вопросов знатокам OOП

Статус
В этой теме нельзя размещать новые ответы.

Timur

Новичок
Есть работающая cms. Хотелось бы перевести ее на ООП. Пока только front-end
Классы разумеется используются, но $GLOBALS достал изрядно. Да и 21 век все таки.
Юзать монстров типа ZF, YII, codeigniter и т.д. не предлагать.

Некоторые классы и хелперы оттуда юзаются и так, по мере надобности.

Пожалуйста не кидайте камни т.к. код упростил донельзя чтобы не городить тут огород и это только примеры.

Вопрос первый

Активно юзается класс ezsql
как лучше сделать
PHP:
include_once "lib/ezsql/ez_sql_core.php";
include_once "lib/ezsql/ez_sql_mysql.php";
1 вариант
PHP:
$dbh = new ezSQL_mysql(DB_USER, DB_PASS, DB_NAME, DB_HOST);
class MyMainClass($dbh){
...код класса
}
2 вариант
PHP:
class MyMainClass{
function __construct(){
  $this->dbh = new ezSQL_mysql(DB_USER, DB_PASS, DB_NAME, DB_HOST);
 }

}
3 вариант
PHP:
class MyMainClass extends ezSQL_mysql{
 function __construct ($dbuser='', $dbpassword='', $dbname='', $dbhost='localhost')
	{
		parent::ezSQL_mysql( DB_USER, DB_PASS, DB_NAME, DB_HOST);

}
}
Вопрос второй по магическому методу __call
PHP:
class MyMainClass{

function __call($functionName, $args) {
    include $functionName.'.php';
    }	
}
при вызове MyMainClass->test();
включится и выполнится файл просто как тело функции

как в этом файле избежать обращения к переменным $this->var, $this->var2 и.т.д;
ну как то по другому что ли vars::$var vars::$var1
MyMainClass->var, MyMainClass->var1
Уж очень эта $this глаза мозолит в отдельных файлах
zf_registry прикручивать
 

флоппик

promotor fidei
Команда форума
Партнер клуба
- Доктор, когда я кончиком языка дотрагиваюсь до комочка фольги, в котором до этого пекли картошку, у меня покалывает за ухом. Что это значит?
- Что у Вас слишком много свободного времени!
 

Вурдалак

Продвинутый новичок
Во-первых, первый вариант от второго отличается принципиально: меняется область видимости соединения. Если ты хочешь при создании каждого объекта делать новое соединение, то ты дурак. Во-вторых, третий вариант предполагает, что класс ХренЗнаетЧто является разновидностью ezSQL_mysql — это так? Например, ты протираешь дисплей монитора (class Monitor) какой-то тряпкой (class Rag). И ты говоришь: хочу, чтобы монитор сам был тряпкой (class Monitor extends Rag) и протирал себя сам. Так что ли?
 

AmdY

Пью пиво
Команда форума
про 3-й вариант тебе Вурдалак объяснил, во втором явная зависимость, а первый архитектурно правильный, но написан с ошибками.

codeigniter - монстр :) нужно запомнить.


вот классическая статья http://wiki.agiledev.ru/doku.php?id=ooad:manage_dependencies_in_php_code хотя при вашем подходе заморачиваться не стоит.
 

Redjik

Джедай-мастер
AmdY
Да и yii то с натяжкой можно монстром назвать...
 

Вурдалак

Продвинутый новичок
По-моему, у некоторых людей на Yii какой-то триггер срабатывает и они считают своим долгом что-то запостить.
 

Timur

Новичок
AmdY, Спасибо за ссылку
Вурдалак, спасибо за ответ. (я и сам так думал. На дурака не обижаюсь хотя было и не обязательно)

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

Timur

Новичок
Никак. Здесь она ни к чему. В смысле в данном конкретном случае.
 

Здыхлик

Kohaner
Команда форума
Если ООП, то второй правильный.
А устанавливает ezSQL_mysql новое соединение при создании объекта или нет, для ООП не имеет значения.
А кто мешает передавать в объект как ezSQL_mysql, так и строку с именем конфига (или массив данных для подключения)? Т.е. скомбинировать оба варианта.
 

Timur

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

Timur

Новичок
Первый вариант предпочел бы в случае если объек5т класса ezsql использовался бы отдельно от MyMainClass, вне этого класса, в другом классе, если бы создавалось несколько объектов класса MyMainClass с одинаковыми параметрами соединения с БД.
Во всех остальных случаях - второй вариант.
 

AmdY

Пью пиво
Команда форума
Timur, Chushkin в моём комментарии была ссылка на статью которую вам следует прочитать, прежде чем давать советы.
 

Духовность™

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

Если ООП, то второй правильный.
чем правильный? что класс исчпользует хрен знает откуда взявшиеся константы - параметры подключеня у субд? И где тут ООП? Это говнокод.

Вопрос второй по магическому методу __call
при вызове MyMainClass->test();
включится и выполнится файл просто как тело функции
бред сивой кобылы. не надо использовать __call для подключения каких-то стремных файлов. он не для этого создан. не надо изначально строить кривую донельзя архитектуру.

Хотелось бы перевести ее на ООП
надо писать так: у меня есть работающая CMS и я хочу написать новую на ООП, использовав некоторые идеи из старой. А свой старый говнокод выкинуть в помойку.

Никак. Здесь она ни к чему. В смысле в данном конкретном случае.
автозагрузка нужна всегда.
 

Вурдалак

Продвинутый новичок
Если ООП, то второй правильный.
А устанавливает ezSQL_mysql новое соединение при создании объекта или нет, для ООП не имеет значения.
Слушай, иди картошку копай, больше пользы будет.
 

Redjik

Джедай-мастер
Слушай, иди картошку копай, больше пользы будет.
Дак рано еще, вон неделю назад только окучивал у тещи на даче.

По-моему, у некоторых людей на Yii какой-то триггер срабатывает и они считают своим долгом что-то запостить.
еще триггер на картошку ... :D
 

Adelf

Administrator
Команда форума
Chushkin
Если б ты еще доброму-светлому учил. А ты только на темную сторону Силы тянешь. Стремясь увеличить ряды говнокодеров.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху