Re: давайте, тема крайне полезная
Автор оригинала: fisher
давайте, тема интересная. собственно, я вижу 2 основных вопроса:
1. насколько криво реализовано ООП в PHP.
понятно, что по сравнению с Java не говоря уж о C++ всё скучно, но, может, и то, что есть - уже неплохо?
Так вот, может в плане проектирования ООП-подобного кода на PHP тоже есть золотая середина? когда пусть "не по-взрослому" но просто, элегантно, масштабируемо и работает?
Насколько криво?
1) Сами разработчики из Zend говорят, что каждое обращение к методу или свойству класса схоже с использованием eval();
2)Нет таких понятий как public,protected, private... будет в PHP5
3)Нет множественного наследования, а кому оно нужно?
4)Конструкторы есть, но они своебразны, а вот деструкторов(в PHP5 будет) вообще нет, порой это надо, хотя сейчас PHP здорово справляется сам с очисткой памяти
5)Нет классовых констант(в PHP5 будет), тоже иногда не хватает
6)Нужно быть крайне внимательным с ссылками(хотя к классам напрямую это и не относится, но их часто юзаешь именно с разными объектами), так называемыми aliases, где нибудь & забыл поставить - проблемы обеспечены, жаль это они так и собираются оставить
Э..э. там еще есть минусы, которые я не помню, может кто напишет. НО! Инкапсуляция, наследование и полиморфизм
работают! А чего еще не хватает?
Реально по скорости раза в полтора все будет тормозней, тут деваться некуда и это на самом деле не смертельно. Зато гимору впоследствие меньше.
2. насколько быстро PHP умеет работать со своими классами?
его можно перевести в практическую плоскость: покрывается ли в среднем проигрыш в анализе ООП-кода временами доступа к СУБД, ereg, preg и т.д.?
к сожалению, до тестов руки у меня не дошли, но что-то мне подсказывает, что неколько килобайт кода с классами покроются ~10 запросами к базе (если считать, что мы находимся на участке, когда время доступа к базе слабо зависит от плотности запросов).
то есть я не понял PHP-классы - использовались или нет? реализация - хрен с ней - интересен подход к разработке.
Ну попробуй потестить какую-ньть ADODB с прямым обращением к MySQL через mysql_query - разница не будет ну очень дикой. Да и сам забьешь на эту разницу, учитывая то, что умеет ADODB.
А про ~10 запросов, ты загнул
Мы использовали(и используем) классы по полной программе. На стенке висит A1 с иерархией классов, только CMS

Однажды это детище должно родиться, сами знаете, что программировать на будущее, только на собственном интересе сложно.
Но вот в кратце расскажу(кому интересно, могу подробнее), что родилось помимо во время реализации CMS:
Универсальная обработка форм - это проблема №1 для каждого php разработчика. Знаем, знаем есть уже готовые классы - обработчики форм, только ни хрена не гибко они написаны.
Написали свой класс для работы с формами, причем расширять его можно бесконечно: каждый элемент формы - отдельный объект. Захотелось, чтобы данное поле было только для int значений - переопределяй базовый класс и подрубай при инициализации формы. Или скажем, "данное поле только для дат, имеет кнопку выбора дат через javascript" - пожалуйста!
Вот, к примеру часть конечного кода:
PHP:
$pay_form_fields=
array(
'doc_type' => array(
'module'=>'droplist',
'title'=>Тип документа:',
'options'=>array('rko'=>'РКО','pko'=>'ПКО'),
'sel_option'=>'pko',
'req'=>1,
'cookied'=>1),
'payer' => array(
'module'=>'droplist',
'title'=>'Житель:',
'sel_option'=>-1,
'cookie'=>1),
'date' => array(
'module'=>'date',
'title'=>'Дата:',
'form_name'=>'payment_form',
'req'=>1),
'category' => array(
'module'=>'droplist',
'title'=>'<A href="/add_category.php?'.$PHP_SELF.'">Категория:</A>',
'sel_option'=>-1,
'cookie'=>1),
'descr' => array(
'module'=>'inputbox',
'title'=>'Описание:',
'size'=>50,
'max_len'=>50),
'summ' => array(
'module'=>'inputbox',
'type'=>'numeric',
'title'=>'Сумма:',
'req'=>1,
'size'=>7,
'max_len'=>7));
$form = new verify_formex($pay_form_fields, 'cash_document');
...
$form->field_attribute('payer','options',$option_hash);
....
if(is_pressed('ok') && $form->validate())
{
...
}
echo $form->parse();
Или еще:
Нас долго досаживала проблема автоматической навигации на сайте. Причем, чтобы это было все гибко и расширяемо, в плане того, что скажем на одном сайте кнопочки с rollover, на другом просто текстовые ссылки, где bold'ом выделяется текущая.
Т.е. некоторая общая фунциональность кочует от сайта к сайта, а вот новыми переопределяются только декораторы ссылок. Или скажем, для данного проекта дерево сайта хранится в xml, а для другого в MySQL - и это тоже все настраивается, в плане того что за это отвечает определенный базовый класс, который можно унаследовать и определить необходимую функциональность для данного проекта.
Немного конечного кода:
PHP:
<?
require_once( $DOCUMENT_ROOT.'/php.setup' );
require_once( PHP_NAVIGATION_DIR_C.'nav_facade.class.php' );
$parser = new nav_xml_parser( 'nav.xml' );
$nav_facade = new nav_facade($parser, $PHP_SELF);
$nav_facade->set_decorator(0, 'main');
echo $nav_facade->parse_level(0, 1);
$levels_count = $nav_facade->get_levels_count();
if ($levels_count >1){
$nav_facade->set_decorator($levels_count-1, 'text');
echo $nav_facade->parse_level($levels_count-1,1);
}
?>
Или вот:
Любой ISP поклонется в ножки, если весь сайт на статике

Мы так подумали, а ведь и впрямь глупо постоянно держать динамические файлы на серваке, конечно, если это не mod_rewrite. Подумали, нарисовали и реализовали систему обхода сайта с преобразованием динамики в статику, так и назвали dynastatic

, которая помимо своей основной обязанности еще применяет так называемые фильтры к статичному html, типа комментарии порезать, пробелы убить и проч., тоже все расширяемо.
Что-то наподобие вот этого:
PHP:
<?
require_once($DOCUMENT_ROOT.'/php.setup');
require_once(PHP_DYNASTATIC_DIR_C.'ds_facade.class.php');
require_once(PHP_DYNASTATIC_DIR_C.'ds_xml_parser.class.php');
$xml_parser = & new ds_xml_parser(BASE_DIR.'nav.xml');
$ds = new ds_facade($xml_parser);
$ds->add_filter('trimmer');
$ds->add_filter('commenter');
$ds->add_filter('links');
$ds->convert();
?>
....................
После такого PHP не подходит для ООП - киньте в меня камень!