За последние 24 часа нас посетили 59715 программистов и 1852 робота. Сейчас ищут 1168 программистов ...

Пару непростых вопросов о declare и register_tick_function

Тема в разделе "PHP для новичков", создана пользователем mrsol, 13 фев 2008.

  1. mrsol

    mrsol Активный пользователь

    С нами с:
    26 мар 2007
    Сообщения:
    17
    Симпатии:
    0
    Сразу скажу искала и на этом форуме и на других и на php.net ничего не нашёл.

    имеем файл test6_cl.php
    PHP:
    1.  
    2. <?php
    3.   class main_class{
    4.    
    5.     var $test_tics;
    6.     var $this_value;
    7.    
    8.     function main_class($value){
    9.        
    10.         $this->this_value = $value;
    11.        
    12.     }
    13.    
    14.     function start(){
    15.         $this->test_tics = new test_ticks_cl($this->this_value);
    16.         declare(ticks=1);
    17.     }
    18.    
    19.     function some_calculate(){
    20.         for($x=1; $x<=3; $x++){
    21.             echo "val='".$this->this_value."' x='".$x."' \n";
    22.         }
    23.     }
    24.   }
    25.  
    26.   class test_ticks_cl{
    27.    
    28.     var $the_value;
    29.    
    30.     function test_ticks_cl($value){
    31.        
    32.         $this->the_value = $value;
    33.         register_tick_function(array(&$this, 'show_value'));
    34.        
    35.     }
    36.    
    37.     function show_value(){
    38.        
    39.         echo "value_is='".$this->the_value."' \n";
    40.         /*for($y=1; $y<=2; $y++){
    41.             echo "val='".$this->the_value."' y='".$y."' \n";
    42.         }*/
    43.     }
    44.   }
    45.  
    46.  
    47. ?>
    48.  
    второй файл test6.php
    PHP:
    1.  
    2. <?php
    3.   require_once('test6_cl.php');
    4.  
    5.   echo "init first class\n";
    6.   $m1 = new main_class(1);
    7.   $m1->start();
    8.   echo "init second class\n";
    9.   $m2 = new main_class(2);
    10.   $m2->start();
    11.  
    12.   echo "start main test \n";
    13.   echo "start first class test\n";
    14.   $m1->some_calculate();
    15.   echo "start second class test\n";
    16.   $m2->some_calculate();
    17.   echo "test calculate no in class\n";
    18.  
    19.   for($x=1; $x<=3; $x++){
    20.     echo "x_no_in_class='".$x."' \n";
    21.   }
    22.  
    23. ?>
    24.  

    ------------------------------------------------------------
    Первый вопрос
    при исполнении файла php -q test6.php
    Когда доходит до блока
    PHP:
    1.  
    2. for($x=1; $x<=3; $x++){
    3.   echo "x_no_in_class='".$x."' \n";
    4. }
    5.  
    Тики не отрабатываются, то есть вывод происходит следующий, привожу не весь вывод, а только последнюю часть.
    value_is='2'
    value_is='1'
    val='2' x='3'
    value_is='1'
    value_is='2'
    value_is='2'
    value_is='1'
    value_is='1'
    value_is='2'
    value_is='2'
    value_is='1'
    value_is='1'
    value_is='2'
    value_is='2'
    value_is='1'
    test calculate no in class
    x_no_in_class='1'
    x_no_in_class='2'
    x_no_in_class='3'
    При этом не изменяя кода, кроме удаления строчки require_once('test6_cl.php'); соединяем всё в один файл и тики начинают работать и тут.
    value_is='2'
    value_is='1'
    x_no_in_class='3'
    value_is='1'
    value_is='2'
    value_is='2'
    Из-за чего такое разное поведение в одном и том же коде??? Это был нулевой вопрос, и он не является глобальным. :) Вопрос конечно чисто философский, но привёл он меня к следующим уже не философским вопросам.


    Вот эти вопросы.
    Первый вопрос.
    Как можно реализовать тики для данного пример, чтобы отрабатывалась только те тики которые принадлежать классу который сейчас производит действия? В данный момент тики выполняются независимо какой из классов работает в данный момент.
    То есть когда выполняется функция some_calculate из объекта $m1, чтобы не выполнялась функция show_value из объекта $m2->test_tics
    Предложение создать несколько файлов с копиями скрипта и с разными названиями классов не подходит.


    Второй вопрос, в принципе взаимозаменяемый с первым.
    Сейчас происходит следующая ситуация. Когда отрабатывается одна из зарегистрированных функций, то она тоже создаёт тики и начинается вызов функций друг друга, то есть чем больше зарегистрированных функций в тиках и чем больше в них кода, тем больше происходит циклов вызова друг друга.
    На пример это видно если разкомментировать следующий код в функции show_value
    PHP:
    1.  
    2. function show_value(){
    3.        
    4.         echo "value_is='".$this->the_value."' \n";
    5.         for($y=1; $y<=2; $y++){
    6.             echo "val='".$this->the_value."' y='".$y."' \n";
    7.         }
    8.     }
    9.  
    Происходит примено следующее. Часть вывода.
    value_is='1'
    val='1' y='1'
    val='1' y='2'
    val='2' y='1'
    value_is='1'
    val='1' y='1'
    val='1' y='2'
    value_is='1'
    val='1' y='1'
    val='1' y='2'
    val='2' y='2'
    value_is='1'
    val='1' y='1'
    val='1' y='2'
    value_is='1'
    val='1' y='1'
    val='1' y='2'
    value_is='1'
    val='1' y='1'
    val='1' y='2'
    -------------- val='2' x='2'
    value_is='1'
    value_is='2'
    val='2' y='1'
    val='2' y='2'
    val='1' y='1'
    value_is='2'
    val='2' y='1'
    val='2' y='2'
    value_is='2'
    val='2' y='1'
    val='2' y='2'
    val='1' y='2'
    value_is='2'
    val='2' y='1'
    val='2' y='2'
    value_is='2'
    val='2' y='1'
    val='2' y='2'
    value_is='2'
    val='2' y='1'
    То есть при работе одной из зарегистрированных функций, сколько бы не было в ней кода, нужно чтобы другие не выполнялись. А функций может быть очень много и могут быть разные.
    Когда есть одна зарегистрированная функция, и она вызывает в себе другие функции из её класса или вообще какие либо, то она не создаёт тиков, которые её бы опять вызвали.

    Вот такие вопросы.

    Оперционка linux, php версия PHP 5.2.1 (cli)
     
  2. Professor

    Professor Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    121
    Симпатии:
    0
    Адрес:
    г. Одесса, Украина
    Повергло в аут, как говорят форумчане :)
     
  3. mrsol

    mrsol Активный пользователь

    С нами с:
    26 мар 2007
    Сообщения:
    17
    Симпатии:
    0
    Это всё что могли ответить? :)
    Как будто нельзя очепятатся.
    И кстати вроде решение уже найдено.
     
  4. mrsol

    mrsol Активный пользователь

    С нами с:
    26 мар 2007
    Сообщения:
    17
    Симпатии:
    0
    И кстати а почему тема была перенесена в раздел для новичков? Вроде я создавал её в разделе Программирование на PHP!