php的声明(滴答)如何真正起作用?

Joh*_*Doe 6 php declare

我使用pcntl_signal创建了一个信号处理类,现在我想用于sigalrm

我的问题是我的phpunit测试信号类的测试工作(其中我只使用信号类中的声明滴答),但是用于测试警报类的测试类,如果我添加声明,则反过来使用信号类(ticks = 1) )在我的闹钟测试中,它也有效

我认为声明滴答只需要在信号处理代码中,在我的情况下是在信号类中?但据我所知,调用信号处理代码的代码也需要它甚至不能在我的报警类中工作,我必须把它放在我的报警测试类中!

尽管使用strace信号是独立于滴答声传递的

所以任何人都明白为什么我必须在我的测试中使用declare()(有时候)?或者为什么我还需要在使用它的代码中声明(ticks = 1)?这意味着用户需要知道如何使用声明

Pet*_*ist 6

要在全局范围内使用tick,您必须在调用脚本的开头使用它.这可能是您必须重新声明它的原因.在不知道你的代码的情况下,我无法肯定地说.以下是一些与单元测试有关的示例.

您可以通过以下构造在IIRC中声明您的代码

function tick_function() {
    // Do something
}

register_tick_function('tick_function');

declare (ticks=1) {
    // Your code here
}
Run Code Online (Sandbox Code Playgroud)

或者作为一个工作的例子

function profile_memory()
{
     echo '<!--' . memory_get_usage() . '-->';
}

register_tick_function('profile_memory');
declare (ticks=1)
{
     $pass = md5('qwerty'); /* Tick executed */
     $pass = strrev($pass);  /* Tick executed */
     echo $pass;  /* Tick executed */
}
Run Code Online (Sandbox Code Playgroud)

这是一个在单元测试中工作的自包含tick函数的工作示例

class TickTest {
    private function profile_memory() {
        static $i;
        ++$i;
        echo "Tick $i\n";
    }
    public function  __construct() {
    }
    public function doTicks() {
        $register_tick_function = register_tick_function(
                array($this,'profile_memory')
            );
        declare (ticks=1) {
            $pass = md5('qwerty'); /* Tick executed */
            $pass = strrev($pass);  /* Tick executed */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是单元测试(是的,我知道这不是一个真正的测试)

require_once 'PHPUnit/Framework.php';
require_once dirname(__FILE__).'/../ticks.php';
class TickTestTest extends PHPUnit_Framework_TestCase {
    protected $object;
    protected function setUp() {
        $this->object = new TickTest;
    }
    protected function tearDown() {
    }
    public function testDoTicks() {
        $this->object->doTicks();
    }
}
Run Code Online (Sandbox Code Playgroud)

查看输出,在执行单元测试时调用tick函数.

一些参考