Смысл классов в php

1 2345 6
A
На сайте с 29.12.2007
Offline
68
#31
qList:
К примеру, если у вас есть задача написать высоконагруженный проект, где основное требование - быстродействие, выбирали бы ли вы фреймворки с написанными кем-то классами (наверняка не совсем отимальными) или писали бы свои функции/классы.

Фреймворки удобны разработчикам, а вот с точки зрения продуктивности приложения какая ситуация.

Выбрал бы фреймворк, что кстати уже не однократно делал. Тормоза чаще всего не в коде, а во взаимодействии кода и базы. И фреймворк тут помогает не тратить время на то, что можно сделать быстро и качественно (код, кеширование и пр.), а потратить время с умом на проектирование хранения данных.

Ayavryk
На сайте с 11.10.2003
Offline
209
#32

> Вообще лезть в фреймворк не зная классов - имхо не правильно.

Топикстартер пишет про классы: "Для каких целей они нужны я не понял даже прочитав книгу для чайников".

Нормальный учебный процесс - сначала теория, потом практика. Лучшая практика - реальная задача. Лучший инструмент для учебной практики - простой и без излишеств, про который написано много-много доков, факов, разжеванных примеров и есть у кого спросить. Для этой цели лучше всего подходит CodeIgniter.

Разберется - пойдет дальше, может когда в "лучших" традициях PHP свой фреймворк изобретет или перескочит на Zend,Symphony, Cake, YII, Kochana...

Мне вот это чудо очень нравится http://complexml.org/ru/docs Жаль что слишком много своих наработок. А так бы обязательно к нему привязался бы.

> вы можете испугаться и тут же выскочить на привычный вам берег процедурного программирования.

И тогда лучше думать о смене профессии. Оно все-таки 21 век. PHP/ FI 2.0 остался в прошлом веке.

Тынгыр, мынгыр, комсомол (http://erum.ru). Ехари, ехари, (жалобно) аяврик. /народная тунгусская песня/
J
На сайте с 28.06.2011
Offline
83
#33

Иллюстрировать преимущества ООП лучше всего на примерах.

Например задача: получить информацию о всех файлах в директории, и узнать их дату модификации.

Как это делалось бы в функциональном программировании:

$dir_path = dirname(__FILE__);

$dir_handler = diropen();

while ($item = readdir($dir_handler))
{
if ($item == '.' || $item == '..') continue;
if (is_file($dir_path . DIRECTORY_SEPARATOR . $item))
{
echo $item . ' дата модификации: ' . filemtime($dir_path . DIRECTORY_SEPARATOR . $item) . '<br />';
}
}

Вполне злободневная задачка. Как это можно решить с помощью ООП, используя DirectoryIterator?

$dir_files = new DirectoryIterator(dirname(__FILE__));

while ($dir_files as $file)
{
if ($file->isDot() || $file->isDir()) continue;
echo $file->getFilename() . ' дата модификации: ' . $file->getMTime();
}

Наверное вторая запись выглядит понятнее?

И в тему о фреймверках. Разбирал CI, работал с Коханой, тыкался в Zend Framework. Для новичка очень трудно понять обилие классов, и то какой класс важнее, какой нужно использовать и так далее. То есть к разбору кода довольно сложных фреймверков, которых вы насоветовали, лучше приступать с прочтения книжки или документации, или хотя бы c основ работы с ними. Да и вообще не с фреймверков начинать нужно.

Я начал и до сих пор использую примитивный MVC фреймверк, в котором кроме классов Dispatcher, Controller, Record и View больше ничего нет. И новичку, в принципе, для старта больше ничего и не нужно.

S
На сайте с 23.05.2004
Offline
315
#34

Второй пример - это как раз тот случай, когда ООП используется ради "ООП ведь как это круто, а на процедурах лохи программируют!". В результате чего, каждую функцию php оборачивают в объект ... и используют снова как функцию, только уже вызывая объект.

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

"$file->isDot()" вообще убивает, нафига вне класса проверять на мусор, класс сам это не в состоянии сделать ? :)

Это просто подпись.
Ayavryk
На сайте с 11.10.2003
Offline
209
#35
jmas:
Разбирал CI, работал с Коханой, тыкался в Zend Framework. Для новичка очень трудно понять обилие классов, сложных фреймверков, которых вы насоветовали

Вообще-то я не советовал Zend, а CI крайне примитивен. Проще то уж нельзя придумать.

jmas:
Да и вообще не с фреймверков начинать нужно.

м.б. но тогда с 90% вероятностью получится тюря где в функциональной водке плавают хлебные корочки ООП, типа того что вы продемонстрировали в своем примере.

A
На сайте с 29.12.2007
Offline
68
#36
Stek:
Второй пример - это как раз тот случай, когда ООП используется ради "ООП ведь как это круто, а на процедурах лохи программируют!". В результате чего, каждую функцию php оборачивают в объект ... и используют снова как функцию, только уже вызывая объект.

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

"$file->isDot()" вообще убивает, нафига вне класса проверять на мусор, класс сам это не в состоянии сделать ? :)

А если так:

class Filer extends DirectoryIterator {

...
}

...

$filer = new Filer();
foreach ($filer -> files() as $file) {
...
}

Так проще? =)

N
На сайте с 06.05.2007
Offline
419
#37
Ayavryk:
но тогда с 90% вероятностью получится тюря где в функциональной водке плавают хлебные корочки ООП, типа того что вы продемонстрировали в своем примере.

Отличный для некоторых проектов вариант, кстати. Именно так написан vbulletin 3.

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

Кнопка вызова админа ()
S
На сайте с 23.05.2004
Offline
315
#38

Так проще, но все равно, объясните мне вообще смысл делать отдельный класс на чтение директории ? Хотя возможно пример глупый с файлами, кроме вопроса "нафига так делать" он ничего не вызывает. Точно так же я могу сделать отдельную функцию readDirFiles(); и использовать ее с таким же успехом. Разницы ни какой.

Для меня прелесть классов в возможности создавать читаемые имена и иметь единое пространство данных внутри программы. А оборачивать элементарные функции в класс, ну его нафиг. Видел как люди с 100% OOP скриптом, даже print делали как $print->show('Hello world');

alexxx_b
На сайте с 10.02.2009
Offline
101
#39

ОПП не нужен, Кармак его не юзает! 😂

__________________

Мой сайтец

A
На сайте с 29.12.2007
Offline
68
#40
Stek:
Так проще, но все равно, объясните мне вообще смысл делать отдельный класс на чтение директории ? Хотя возможно пример глупый с файлами, кроме вопроса "нафига так делать" он ничего не вызывает. Точно так же я могу сделать отдельную функцию readDirFiles(); и использовать ее с таким же успехом. Разницы ни какой.

Да легко... Например, есть базовый класс, для основных действий (обход директорий, копирование, перемещение и пр.). И есть наследуемые, которые по расширению файла делают определенные действия (например, .rar|.zip|.7z - отправлять на ftp, .txt|.rtf|.doc|.xml - конвертировать и копировать в определенные папки и т.д.). На функциях получится примерно так: определяем расширение, вызываем нужную функцию:

$ext = ...;

if (in_array($ext, array('rar', 'zip', '7z')))
wrapper_archive($filename);

...

Дальше враппер делает определенные действия, заложенные алгоритмом. Все верно? На классах примерно так-же:

class wrapper_archive {

...
}

class wrapper_rar extends wrapper_archive {}
class wrapper_zip extends wrapper_archive {}
class wrapper_7z extends wrapper_archive {}

...

$ext = ...;
$class = 'wrapper_' . $ext;
$class::action();

Набросок на классах. А теперь самое интересное: что произойдет, когда надо будет 7z обрабатывать отдельно? Например, добавить новый файл в архив и описание, оставив его на месте?

На функциях - правим основной код, на классах - нужный класс, не трогая остальное (а значит, меньше риска что вообще поломаем код приложения).

Никто не спорит, что все, что можно сделать на классах можно сделать и на функциях. Но ООП сильно (ОЧЕНЬ СИЛЬНО) упрощает поддержку ;)

Кстати, советую поизучать кохану. За счет хорошей файловой структуры ООП там показывает всю свою силу. Не трогая сам фреймворк его-же (фреймворк, т.е.) можно изменять!! Попробуйте реализовать подобное на функциях. Как уже говорил - это возможно, но очень сложно, а уж поддерживать - лучше сразу застрелиться =)))

Stek:
Для меня прелесть классов в возможности создавать читаемые имена и иметь единое пространство данных внутри программы. А оборачивать элементарные функции в класс, ну его нафиг. Видел как люди с 100% OOP скриптом, даже print делали как $print->show('Hello world');

Ну это вы тоже очень зря. Еще раз предлагаю посмотреть ko3. Все хелперы - статичные классы с кучей методов. И каждый можно заменить на свое, не трогая другие.

Пример с тем-же print, а точнее var_dump... Можно сделать просто var_dump, а можно обернуть его в статичный метод класса. Для чего? Чтобы потом, через неделю-две, переписать: будет не просто выводиться результат, но еще и отправляться на мыло, например =)))

1 2345 6

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий