mrsol
Новичок
Пару непростых вопросов о declare и register_tick_function
Сразу скажу искала и на этом форуме и на других и на php.net ничего не нашёл.
имеем файл test6_cl.php
второй файл test6.php
------------------------------------------------------------
Первый вопрос
при исполнении файла php -q test6.php
Когда доходит до блока
Тики не отрабатываются, то есть вывод происходит следующий, привожу не весь вывод, а только последнюю часть.
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
Происходит примено следующее. Часть вывода.
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)
Сразу скажу искала и на этом форуме и на других и на php.net ничего не нашёл.
имеем файл test6_cl.php
PHP:
<?php
class main_class{
var $test_tics;
var $this_value;
function main_class($value){
$this->this_value = $value;
}
function start(){
$this->test_tics = new test_ticks_cl($this->this_value);
declare(ticks=1);
}
function some_calculate(){
for($x=1; $x<=3; $x++){
echo "val='".$this->this_value."' x='".$x."' \n";
}
}
}
class test_ticks_cl{
var $the_value;
function test_ticks_cl($value){
$this->the_value = $value;
register_tick_function(array(&$this, 'show_value'));
}
function show_value(){
echo "value_is='".$this->the_value."' \n";
/*for($y=1; $y<=2; $y++){
echo "val='".$this->the_value."' y='".$y."' \n";
}*/
}
}
?>
PHP:
<?php
require_once('test6_cl.php');
echo "init first class\n";
$m1 = new main_class(1);
$m1->start();
echo "init second class\n";
$m2 = new main_class(2);
$m2->start();
echo "start main test \n";
echo "start first class test\n";
$m1->some_calculate();
echo "start second class test\n";
$m2->some_calculate();
echo "test calculate no in class\n";
for($x=1; $x<=3; $x++){
echo "x_no_in_class='".$x."' \n";
}
?>
------------------------------------------------------------
Первый вопрос
при исполнении файла php -q test6.php
Когда доходит до блока
PHP:
for($x=1; $x<=3; $x++){
echo "x_no_in_class='".$x."' \n";
}
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:
function show_value(){
echo "value_is='".$this->the_value."' \n";
for($y=1; $y<=2; $y++){
echo "val='".$this->the_value."' y='".$y."' \n";
}
}
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)