【问题标题】:how do php's declare(ticks) really work?php 的 declare(ticks) 是如何工作的?
【发布时间】:2010-12-29 00:09:43
【问题描述】:

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

我遇到的问题是我的用于测试信号类的 phpunit 测试有效(我只在信号类中使用声明刻度),但是 用于测试警报类的测试类,而警报类又不使用信号类 如果我在我的警报测试中添加 declare(ticks=1) 它也可以工作

我认为仅在信号处理代码中需要声明滴答声,在我的情况下是在信号类中? 但据我所知,调用信号处理代码的代码也需要它 它甚至在我的alarmclass 中都不起作用,我必须把它放在我的alarmtest 类中!?

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

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

【问题讨论】:

  • @Gordon 看看我下面的例子

标签: php declare


【解决方案1】:

要在全局范围内使用刻度,您必须在调用脚本的开头使用它。这可能就是您必须重新声明它的原因。如果不知道您的代码,我不能肯定地说。下面是一些适用于单元测试的示例。

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

function tick_function() {
    // Do something
}

register_tick_function('tick_function');

declare (ticks=1) {
    // Your code here
}

或者作为一个工作示例

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 */
}

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

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 */
        }
    }
}

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

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();
    }
}

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

一些参考

【讨论】:

  • 添加 declare(ticks=1); 似乎是正确的如我所见,在 testunit 类的顶部可以正常工作,如果您尝试在类/函数中使用滴答声功能(pcntl 扩展),则必须在调用此类函数之前全局定义滴答声!如果我调用 declare(ticks=1); 它甚至都不起作用在一个函数中,该函数又调用了我的信号类,所以要么你有一个非常具体的滴答用例,所以你可以使用 {} 作为一个滴答块,或者在脚本顶部声明它,使用它来获得帮助
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2011-05-12
  • 1970-01-01
  • 2015-01-10
相关资源
最近更新 更多