Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявить класс, использовать, переобъявить - как? 
:(
    Опции темы
Win MK 32
Дата 2.3.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



У меня есть класс обработки ошибок, статические методы которые могут выводить ошибку в удобном для разработчика виде на страницу или на почту. Далее в коде я объявляю класс для работы с почтой. 

И тут появляется делемма. Мне надо в первом классе (логирования) использовать возможности работы с почтой из другого класса. А в классе по работе с почтой - выводить ошибку через класс обработки ошибок.

Решил, что было бы здорово переобъявить первый класс. Упрощенно говоря так:
Код

class loging{
    function write($text){
        echo $text;
    }
}

class email {
    function me($message=0, $subject=0) {
        if(!$USER){ loging::write("Нету авторизации!");}
        self::send($message, "NOREPLY_MAIL", $USER->email, $subject);
    }
    function send($message=0, $from, $to, $subject=0) {
        if(!$subject) $subject = "DEFAULT_SUBJECT"; 
        if((isset($message)) && (isset($from)) && (isset($to))){
            $headers = 'From: '.$from."\r\n".
                                 'Reply-To: '.$from."\r\n".
                                 'X-Mailer: PHP/'.phpversion();
            mail($to, $subject, $message, $headers);
        }
    }
}

class loging{
    function write($text){
        echo $text;
    }
    function email($text){
        email::send($text, $LANG['NOREPLY_MAIL'], $email, $subject);
    }
}

Но вот беда, так не выходит. Расскажите пожалуйста, как мне "пересоздать" класс?

Добавлено через 12 минут и 33 секунды
Нашел способ. Но может есть что-то более логичное?
Код
<?php
class Foo {
    function example() {
        return "foo!\n";
    }
}

class Bar {
    // изначально без методов
}

// копируется метод example() из класса Foo в класс Bar, с новым именем baz()
classkit_method_copy('Bar', 'baz', 'Foo', 'example');

// вывод скопированной функции
echo Bar::baz();
?>

http://ru.php.net/manual/ru/function.class...method-copy.php
PM   Вверх
gta4kv
Дата 2.3.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



вы убили весь смысл ооп :(
PM MAIL   Вверх
krundetz
Дата 2.3.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Win MK 32 @  2.3.2009,  18:36 Найти цитируемый пост)
Нашел способ. Но может есть что-то более логичное?

угу более логичным будет наследование одного класса от другого или инкапсулирования одного класса в другом
Цитата(gta4kv @  2.3.2009,  19:08 Найти цитируемый пост)
вы убили весь смысл ооп :( 

+1


Win MK 32, прежде чем использовать ООП хорошо бы сначало почитать что нибудь толковое, про то как это работает вообще


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Win MK 32
Дата 2.3.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



Читал. Все понятно, но не понятко в каких случаях как поступать. Что делать?

Добавлено через 13 минут и 30 секунд
Цитата(krundetz @  2.3.2009,  17:43 Найти цитируемый пост)
инкапсулирования одного класса в другом

Привидите пожалуйста пример, как в этом случае можно поступить?

С наследованием вроде бы понятно. Жаль я о нем забыл напрочь.
PM   Вверх
gta4kv
Дата 2.3.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Код

class one 
{
    public function myCoolFunction()
    {
         echo 'Я — родитель!';
    }
}
class two extends one
{
    public function call()
    {
          parent::myCoolFunction();
    }
}


Но вообще забудьте ООП еще на годик, вы его не используете. Класс — просто оболочка для функций у вас.

Добавлено @ 22:11
Цитата

Читал. Все понятно, 

крайне сомневаюсь.

Это сообщение отредактировал(а) gta4kv - 2.3.2009, 22:15
PM MAIL   Вверх
bars80080
Дата 3.3.2009, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



да нет, то что читал и понял - это нормальное явление. однако понимания смысла (прочувствовать магию ООП) ещё не получилось
а раз так, то всё же лучше им не пользоваться
PM MAIL WWW   Вверх
krundetz
Дата 3.3.2009, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(bars80080 @  3.3.2009,  00:38 Найти цитируемый пост)
однако понимания смысла (прочувствовать магию ООП) ещё не получилось
а раз так, то всё же лучше им не пользоваться 

а как ее можно понять не используя?


Цитата(Win MK 32 @  2.3.2009,  19:58 Найти цитируемый пост)
С наследованием вроде бы понятно. Жаль я о нем забыл напрочь. 

создаешь метод внутри которого создаешь клас с нужной тебе функцией и вызываешь ее


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bars80080
Дата 3.3.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(krundetz @  3.3.2009,  14:07 Найти цитируемый пост)

а как ее можно понять не используя?

имеется ввиду не сочиняя самому. пользоваться чужими конечно надо. а то наделаешь трёхэтажный экскаватор, там где нужна сапёрная лопатка
PM MAIL WWW   Вверх
Win MK 32
Дата 5.3.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



Цитата(gta4kv @  2.3.2009,  20:10 Найти цитируемый пост)
Класс — просто оболочка для функций у вас.

Вы правы. Но я не знаю как быть. Я в общем-то уже год занимаюсь PHP. Свою первую CMS стал писать где-то месяца два назад. И вот только только начал ООП добавлсять. Но ничего не могу с собой поделать, пока это как "подсластитель для функций". А что мне делать? Год еще тянуть - не вижу смысл. Надо двигаться. Фраза "ООП не всем дано" меня пугает. Чтож мне теперь закопать себя в землю, что я пока не понял? Я упорный и научусь если буду знать как...! =)
PM   Вверх
gta4kv
Дата 5.3.2009, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Win MK 32, если ты считаешь что уже достаточно знаешь PHP наивный раб, то почитай книгу чисто про ООП в PHP5. (именно в PHP, ибо язык умеет гораздо меньше в плане ООП чем, например, Java)


Код

class email {
    function me($message=0, $subject=0) {
        if(!$USER){ loging::write("Нету авторизации!");}

А откуда у тебя тут $USER берётся? ;-)

Примерно вот так:

Код

class email
{
    public function send($message='', $from, $to, $subject='')
    {
        $subject = ( ! $subject ) ? DEFAULT_SUBJECT : $subject; // предполагаю что здесь наверное должна быть константа, а не тупо тест дефаульт_сабджект

        if( $messages and $from and $to )
        {
            $headers = "From: {$from} \r\n" .
                             "Reply-To: {$from} \r\n";
            mail( $to, $subject, $message, $headers );
        }
    }
}

class loging extends email
{
    public function write ( $text )
    {
        echo $text; // так уж и быть, закрою здесь глаза, будем считать что еще что-то добавится
    }

    public function mailit ( $text )
    {
        // здесь мы вызываем класс-родитель (т.к extends email, то класс-родитель будет «email»)
        parent::send( $text, $LANG['NOREPLY_MAIL'], $email, $subject' ); // кстати, тут опять не понятно откуда переменные берутся
    }
}


Это сообщение отредактировал(а) gta4kv - 5.3.2009, 10:07
PM MAIL   Вверх
Win MK 32
Дата 6.3.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



Цитата(gta4kv @  5.3.2009,  07:01 Найти цитируемый пост)
если ты считаешь что уже достаточно знаешь PHP

Понятия не имею. Вроде читал две книги по PHP. Я могу про себя сказать, как иногда говорят про англоучащихся: "На PHP пишу, пользуясь словарем(мануалами)". То есть открываю для себя время от время новое (время идет, в PHP куча нового появляется). Запросто может быть такое, что я какие-то модные вещи не знаю gzip например не умею юзать или кэш. Но тут уж всего не упомнишь.

Цитата
А откуда у тебя тут $USER берётся? ;-)

Классы почты и логирования ошибок я инклюжу уонс в индекс пхп аж после проверки авторизации. Поэтому $ЮЗЕР - это массив юзера. Он не существует, если не существует авторизации.

Цитата
предполагаю что здесь наверное должна быть константа, а не тупо тест дефаульт_сабджект

Да, у меня есть массив $LANG, он инклюдится тоже в начале.

Цитата(gta4kv @  5.3.2009,  07:01 Найти цитируемый пост)
так уж и быть, закрою здесь глаза, будем считать что еще что-то добавится

Да, тут будет функционал обрамления тегами <pre>, умирания скрипта после вывода etc. А также запрета вывода вывода элементов массива с заданными ключами (дабы исключить случай вывода конфиденциальной информации.

Боюсь привиденная вами архитектура не совсем то, что я имел в виду. (тем не мене спасибо что написали ее, может быть у меня не верные цели). Мой замысел таков: в любом месте кода я должен мочь включить любой метод любого класса:

1) email::admin 
Отправить почту админу (в случае ошибки происходит логирование действия (класс loging::[$LANG['DEFAULT_METHOD']]) - типа того - это я уже на ходу придумал про дефолт метод.

2) email::user 
Отправить почту главному герою (юзеру, который загружает страницу и имеет авторизацию) (ошибка? значит логирование!)

3) email::id
Отправить почту юзеру с id (тоже...)

4) email::mail
ну а это базовая функция (тоже...)

5) email::htmlmail
это базовая функция для отправки почты в формате HTML (тоже...)

6) loging::write
логирование в виде вывода на страницу - проще говоря

7) loging::email
логирование в виде отправки на мыло админу-вебмастеру

Как видно 1-5 использует 6и7; 7 использует 4и5.

Нормльный замысел?  smile  smile

Добавлено через 3 минуты и 32 секунды
Рекурсия?  smile 
PM   Вверх
gta4kv
Дата 6.3.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Ну, начнем с того что $LANG не будет доступен в классе. (см. область видимости)

т.е будет разумнее 
1) отказаться от статики
2) сделать singleton (хотя если у вас не большой скрипт, то лучше просто добавить метод getInstance в нужный класс (см. класс singleton ))
3) сделать типа init(), и передавать ему $LANG:
Код

class email
{
    private $lang;

    public function init( $lang = '' )
    {
        $this->lang = $lang;
    }
    
     public function send( ... )
     {
          ... $this->lang[ 'default_method' ];
          ... 
     }

     ...
}


class loging
{
    private $email_instance = null;

    public function __consturct( $lang )
    {
         $this->email_instance = singleton::getInstance( 'email' );
         $this->email_instance->init( $lang );
    }
    public function email( ... )
    {
         ...
         $this->email_instance->send( ... );
         ...
    }
}

/* взято с php.net / 
       class singleton
    {
        /**
         * Single instance of the class
         *
         * @var Singleton
         */
        protected static $_instance = NULL;
        /**
         * A flag to know if we are in getInstance method or not.
         *
         * @var bool
         */
        protected static $_withinGetInstance = false;
       
        /**
         * Public singleton class constructor
         *
         * @param mixed $foo
         */
        public function __construct($foo)
        {
            if (! self :: $_withinGetInstance)
                throw new Exception('You cannot make a new instance of this class by using constructor, use getInstance() instead...');

            /*
                Any other operations constructor should do...
            */
        }
       
        /**
         * Regular getInstance method
         *
         * @param mixed $foo
         * @return Singleton
         */
        public static function getInstance($foo)
        {
            self :: $_withinGetInstance = true;
            if (! self :: $_instance)
                self :: $_instance = new singleton($foo);
            self :: $_withinGetInstance = false;
            return self :: $_instance;
        }
    }

require_once( 'your_lang_file.inc' );
$loging = new loging( $lang );


Это сообщение отредактировал(а) gta4kv - 7.3.2009, 07:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0679 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.