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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться со скриптом 
:(
    Опции темы
anthonyBoard
Дата 10.11.2008, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

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



Здравствуйте, товарищи!

Все верчусь вокруг тем с include вне класса и динамическим добавлением функций в классы. Думаю вы уже читали эти темы в форуме. Вопросы эти очень заинтересовали, и постепенно я начал понимать, что слишком много чего недопонимаю, т.к. ранее не приходилось с этим работать, но желание все это осознать берет вверх, поэтому я прошу вашей помощи!

Нашел в сети некоторый скрипт (искал по запросу динамическое добавление функций в классы)

Код

 <?php
  
 Object::$prototype= new Object( array() );
 class Object {
     static $prototype;
     var $delegates= array();
     var $context= null;
     var $class= '';
     function Object( $delegates= null ){
         $this->context= $this;
         $this->class= get_class( $this );
         if( func_num_args() ):
             if( is_array( $delegates ) ):
                 $this->delegates= $delegates;
             else:
                 $this->delegates= func_get_args();
             endif;
         else:
             $this->delegates[]= eval( 'return ' . $this->class . '::$prototype;' );
         endif;
         $this->constructor();
     }
     function constructor( ){
     }
     function take( $arr ){
         foreach( $arr as $key => $val ) $this->$key= $val;
     }
     function haveDelegate( $object ){
         return $this->_findByObj( $object );
     }
     function _findByMethod( $method ){
         if( method_exists( $this, $method ) ) return $this;
         foreach( $this->delegates as $ex ):
             if( $obj= $ex->_findByMethod( $method ) ) return $obj;
         endforeach;
         return null;
     }
     function _findByProp( $prop ){
         if( isset( $this->$prop ) ) return $this;
         foreach( $this->delegates as $ex )
             if( $obj= $ex->_findByProp( $prop ) ) return $obj;
         return null;
     }
     function _findByObj( $object ){
         if( $this === $object ) return $this;
         foreach( $this->delegates as $ex )
             if( $obj= $ex->_findByObj( $object ) ) return $obj;
         return null;
     }
     function apply( $obj, $method, $args ){
         $context= $this->context;
         $this->context= $obj->context;
         $ret= call_user_func_array( array( $this, $method ), $args );
         $this->context= $context;
         return $ret;
     }
     function __call( $method, $args ){
         $obj= $this->_findByMethod( $method );
         if( $obj ) $obj->apply( $this, $method, $args );
         endif;
         $trace= debug_backtrace();
         $file= $trace[1]['file'];
         $line= $trace[1]['line'];
         $class= $trace[1]['class'];
         trigger_error( "[ unknown method {$class}->{$method}() in {$file} on {$line} line ]" );
     }
     function __get( $prop ){
         $obj= $this->_findByProp( $prop);
         if( $obj ) return $obj->$prop;
         $trace= debug_backtrace();
         $file= $trace[0]['file'];
         $line= $trace[0]['line'];
         $class= $trace[0]['class'];
         trigger_error( "[ unknown property {$class}->{$prop} in {$file} on {$line} line ]" );
     }
 }
  
  
 Rect::$prototype= new Rect( Object::$prototype );
 class Rect extends Object {
     static $prototype;
     var $width= 0;
     var $height= 0;
     function area( ){
         return $this->context->width * $this->context->height;
     }
 }
  
 Rhomb::$prototype= new Rhomb( Object::$prototype );
 class Rhomb extends Object {
     static $prototype;
     var $width= 0;
     var $height= 0;
     function area( ){
         return $this->context->width * $this->context->height / 2;
     }
 }
  
  
 Figure::$prototype= new Figure( Object::$prototype );
 class Figure extends Object {
     static $prototype;
 }


Код

<?php
  
 Deque::$prototype= new Deque( Object::$prototype );
 Deque::$prototype->data= array();
 class Deque extends Object {
     static $prototype;
     function push( ){
         $this->context->adds();
         foreach( func_get_args() as $val )
             array_push( $this->context->data, $val );
         return $this->context;
     }
     function unshift( ){
         $this->context->adds();
         foreach( func_get_args() as $val )
             array_unshift( $this->context->data, $val );
         return $this->context;
     }
     function pop( ){
         $this->context->adds();
         return array_pop( $this->context->data );
     }
     function shift( ){
         $this->context->adds();
         return array_shift( $this->context->data );
     }
     function adds( $arr= array() ){
         if( !isset( $this->context->data ) )
             $this->context->data= $this->context->data;
         foreach( $arr as $key => $val )
             $this->context->push( $val );
         return $this->context;
     }
     function contains( $value ){
         foreach( $this->context->data as $val ):
             if( $value === $val ) return $val;
         endforeach;
         return null;
     }
     function drop( $value ){
         $this->context->adds();
         foreach( $this->context->data as $key => $val ):
             if( $value === $val ) unset( $this->context->data[ $key ] );
         endforeach;
         return null;
     }
     function join( $del= '' ){
         $first= true;
         $str= '';
         $data= $this->context->data;
         foreach( $data as $val ):
             if( !$first ) $str.= $del;
             $str.= $val;
             $first= false;
         endforeach;
         return $str;
     }
     function __toString( ){
         return $this->context->class . '[ ' . $this->context->join( ', ' ) . ' ]';
     }
 }
  
  
 $arr1= new Deque;
 $arr2= new Deque;
 $arr1->adds( array( 'abc', 'def', 'ghi' ) )->drop( 'def' );
 $arr2->push( $arr1, 123 );
 $arr1->push( $arr1->contains( 'def' ) ? 1 : 0 );
 $arr1->unshift( $arr1->contains( 'abc' ) ? '' : '8-(' );
 echo $arr2->join( ' ' ) . '<br/>';
 echo '<br/>';
  
 $arr= new Deque;
 echo $arr . '<br/>';
 Deque::$prototype->data= array( 'default data' );
 echo $arr . '<br/>';
 echo '<br/>';
  
 $arr->adds( );
 Deque::$prototype->data= array( 'another default data' );
 echo $arr . '<br/>';
 echo ( new Deque ) . '<br/>';
 echo '<br/>';
  
 ?>


Всякие патерны и синглетоны для меня достаточно новые слова, которые я как раз встретил пытаясь найти ответы на свои вопросы.

Прошу вас помочь понять о чем этот скрипт и как что от чего в нем работает.
Например, в самом начале
Код

 Deque::$prototype= new Deque( Object::$prototype );
 Deque::$prototype->data= array();

честно скажу не понимаю что это дает, опять таки потому что не сталкивался с таким ранее.

Буду премного благодарен за ссылки на полезные статьи по теме, чтобы углубленно понять что к чему в этом скрипте, и за любую вашу помощь!

Спасибо!

Это сообщение отредактировал(а) anthonyBoard - 10.11.2008, 12:32
PM MAIL   Вверх
anthonyBoard
Дата 10.11.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

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



Ни у кого никаких мыслей?

Это сообщение отредактировал(а) anthonyBoard - 10.11.2008, 12:31
PM MAIL   Вверх
evilsoul
Дата 11.11.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Почитай про проектирование паттернов, если надо могу скинуть книжку по ним вроде была у меня, если надо напиши
PM MAIL   Вверх
destrd
Дата 11.11.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(anthonyBoard @  10.11.2008,  12:30 Найти цитируемый пост)
Ни у кого никаких мыслей?

А какие мысли могут быть. Не думаю, что те, кто знает эту тему будет тут писать трактаты, всё есть в книгах, гуглите.
P.S. За себя отвечу, мне не охота писать дажеsmile

Это сообщение отредактировал(а) destrd - 11.11.2008, 23:34
--------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems.        -- Jamie Zawinski in comp.lang.emacs
PM MAIL ICQ   Вверх
anthonyBoard
Дата 12.11.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

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



evilsoul, буду очень признателен за книжку. Мой e-mail: anthonyBoard(at)yandex.ru
PM MAIL   Вверх
evilsoul
Дата 12.11.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Лови, отправил
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.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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