Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Функции всеместного применения


Автор: CyClon 27.11.2007, 18:35
Собственно, медленно, очень медленно, но верно продвигается написание собственной CMS smile Меня заинтересовал вопрос хранения и использование функций повсеместного назначения (например: функция конвертирования велечин (B - KB - MB - GB), фунция проверки e-mail на валидность, функция проверки еще чего-то и т.п.) - то есть функций, которые могут использоваться очень часто (точнее  - в нескольких модулях, например функция конвертирования может использоваться в файловом архиве (показывать размер загруженного файла) и личном аккаунте (показывать размер загруженной аватары)). Вот и возникает вопрос, где их хранить и как использовать. Раньше придерживался мнения, что неплохим решением было бы сделать файл functions.php и запихнуть туда все функции или же создать папочку functions, а в ней файлы в форме 1 файл = 1 функция и подключать потом. Но на дворе-то эра ООП smile И в каком-то топике меня подтолкнули на мысль о хранении функций в классах. То есть, как я понял, создаем класс Convert, а в нем методы - конвертирование градусов в фаренгейты, мегабайтов в байты, паролей в специальные самописные хеши), класс Check с методами проверки мыл, доступности хостов, имен пользователей и т.д. Хотя и с виду это все красиво (ООП), но я не вижу в этом приемуществ перед функциями (Разве что __autoload).

Собственно, хочу подискуссировать на эту тему %) Может кто-то уже на этом, как говориться, "собаку съел" и поделится советами?

Автор: mishaSL 27.11.2007, 19:03
CyClon, если у тебя множество функций и их можно разделить по смысловому или какому-то еще понятному и удобному для тебя принципу, то тогда можно и удобнее будет раскидать все функции по классам и объявить методы статическими. Если же твой набор функций никак не разделить по какому-либо критерию, то смысла все их объединять в класс нет.

Пример:
Код

<?php

class Validate
{
    public static function email($email)
    {
        //Проверка e-mail
    }
    
    public static function string($string)
    {
        //Проверка строки
    }

    public static function numeric($numeric)
    {
        //Проверка числа
    }

}

class Convert
{
    public static function B2Kb($varible)
    {
        //Реализация
    }    

    public static function Kb2B($varible)
    {
        //Реализация
    }    

}


if (Validate::email('[email protected]')) {
    //...
}

?>


Автор: WolfON 27.11.2007, 19:39
Не надо пихать ооп просто из-за идеи, если это не удобно.
Самый очевидный, простой и удобный способ - сделать класс, библиотеку функций, со статическими методами - нужными функциями, а его подгружать автолоадом.

Автор: CyClon 27.11.2007, 19:58
Ммм... Насколько я помню, __autoload срабатывает только при объявлении ($obj = new class) класса? Или при обращении к статическим методам тоже?

Автор: Anarki 27.11.2007, 22:16
Цитата(CyClon @  27.11.2007,  22:58 Найти цитируемый пост)
Ммм... Насколько я помню, __autoload срабатывает только при объявлении ($obj = new class) класса? Или при обращении к статическим методам тоже?

При вызове статических методов/получении статических свойств класса(без создания объекта) - тоже срабатывает в PHP5

Автор: FractalizeR 27.12.2007, 20:09
Я у себя такой автолоадер написал:
Код
<?php

/**
 * Autoloading classes
 *
 * @param string $className Class name to load
 */
function __autoload($className) {
    $classNameParts = explode('_', $className);
    unset($classNameParts [0]);
    $pathToClassFile = implode(DIRECTORY_SEPARATOR, $classNameParts);
    
    require_once dirname(__FILE__) . '/' . $pathToClassFile . '.php';
}

?>


Имена классов в проекте такие: Fractal_MySQLDb_Connection. Файл, содержащий этот класс лежит в папке MySQLDb и называется Connection.class.php

Автор: CyClon 24.2.2008, 11:02
Хм, интересная идея smile Нужно будет тоже так сделать smile

Если имя класса не содержит "_" - делать include('kernel/classes/' . $className . '.class.php'), если содержит - входить в подкаталоги и инклюдить уже оттуда.

Добавлено через 1 минуту и 23 секунды
Ну, а по сабжу что посоветуете, кто как делает? Разбить функции по группам и загнать в классы?

Автор: GeneralElectric 24.2.2008, 12:16
Цитата(CyClon @  27.11.2007,  18:35 Найти цитируемый пост)
создаем класс Convert, а в нем методы - конвертирование градусов в фаренгейты, 

Тебя обманули. Это не имеет никакого отношения к ООП.

Автор: flashaa 24.2.2008, 12:51
Цитата(FractalizeR @  27.12.2007,  20:09 Найти цитируемый пост)
Я у себя такой автолоадер написал:

У Котерова примерно такая же идея. Вообще, если не ошибаюсь, такая идея хранения классов и их подгрузки взята из PEAR. Ведь там тоже классы называются HTML_Template, HTML_ .. к примеру.

Не кажется ли слишком сложным? Думаю одна папка с классами будет удовлетворять всем требованиям.

Автор: CyClon 24.2.2008, 13:29
flashaa, как раз-таки одна папка не есть гуд, я об этом уже как-то думал. Подумай - есть класс DB и классы MySQL, MSSQL и еще куча подобных. Сбрасывать это все в одну папку (где будут храниться классы Convert, Agent, Log и т.п. неразумно). Будет разумнее так (опять же мое ИМХО):

Код
/
++++/kernel/
++++/classes/
++++++++/DB/
++++++++++++MySQL.class.php
++++++++++++MSSQL.class.php
++++++++++++Oracle.class.php
++++++++Agent.class.php
++++++++DB.class.php
++++/modules/
++++index.php


Соотстветвенно, будет класс DB и будет класс DB_MySQL extends DB.

Или у кого-то есть более рациональные предложения по именованию/размещения файлов классов в файловой системе? smile

Автор: flashaa 27.2.2008, 18:28
CyClon, сколько всего будет классов? У меня до 20 доходит и не чувствуется неудобство.

Автор: FractalizeR 8.3.2008, 13:05
Цитата(flashaa @ 24.2.2008,  12:51)
Цитата(FractalizeR @  27.12.2007,  20:09 Найти цитируемый пост)
Я у себя такой автолоадер написал:

Не кажется ли слишком сложным? Думаю одна папка с классами будет удовлетворять всем требованиям.

Думаю, аоборот, будет очень просто, красиво и логично. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)