我使用 pcntl_signal 创建了一个信号处理类,现在我想使用它 对于信号
我遇到的问题是我用于测试信号类的 phpunit 测试有效(我只在信号类中使用 declare ticks),但是 用于测试警报类的测试类,而警报类又不使用信号类 如果我在我的警报测试中添加 declare(ticks=1) 它也有效
我认为只有在信号处理代码中才需要声明滴答声,在我的例子中是在信号类中? 但据我所知,调用信号处理代码的代码也需要它 它甚至在我的 alarmclass 中都不起作用,我必须把它放在我的 alarmtest 类中!?
虽然使用 strace 信号是独立于 ticks 传递的
所以有人明白为什么我必须在我的测试中使用 declare() (有时)吗? 或者为什么我还需要在使用它的代码中声明(ticks=1)? 这意味着用户需要知道如何使用 declare
最佳答案
要在全局范围内使用 ticks,您必须将它放在调用脚本的开头。这可能就是您必须重新声明它的原因。在不知道您的代码的情况下,我不能肯定地说。以下是一些适用于单元测试的示例。
您可以通过以下结构在您的代码中通过 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 函数。
一些引用
关于php - php 的 declare(ticks) 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1944505/