declare

declare

ticks=1

Example #1

<?php
    // 例子1
    function doTicks ()
    {
        echo 'Ticks';
    }
    register_tick_function('doTicks');
    declare(ticks = 1) {
        for ($x = 1; $x < 10; ++ $x) {
            echo $x .'<br />';
        }
    }
    // opout 
    // 1
    // Ticks2
    // Ticks3
    // Ticks4
    // Ticks5
    // Ticks6
    // Ticks7
    // Ticks8
    // Ticks9
    // TicksTicks
?>

Example #2
先定义declare 会先执行declare 当执行了语句的时候 还会执行一次declare (declare(ticks=1) 之前的代码不会生效)

 <?php   
    declare(ticks=1);
    // A function called on each tick event
    function tick_handler()
    {
        echo "tick_handler() called<br/>";
    }
    register_tick_function('tick_handler');
    $a = 1;
    if ($a > 0) {
        $a += 2;
        print($a);
    }
    // opout 
    // tick_handler() called
    // tick_handler() called
    // tick_handler() called
    // 3tick_handler() called
    // tick_handler() called
?>

EXample #3 模仿declare

<?php
    function bar_handler()
    {
      echo "bar_handler() called<br/>";
    }

    $a = 1;
    bar_handler();

    if ($a > 0) {
        $a += 2;
        bar_handler();
        print($a);
        bar_handler();
    }
    bar_handler();
    // opout 
    // bar_handler() called
    // bar_handler() called
    // 3bar_handler() called
    // bar_handler() called
?>

Example #4 后调用 declare

<?php
    function handler(){
        print "hello <br />";
    }
    register_tick_function("handler");
    declare(ticks=1){
        $b = 2;
    }
    // opout 
    // hello 
?>
总结
01、通过上面的例子可以知道。几乎就是执行一条语句、php就会自动调用 register_tick_function 的方法
02、如果以declare(ticks=1)定义的、register_tick_function 则会先运行一次方法、结束的时候还会再调用一次 该方法
03、以 declare(ticks=1){ $b = 2;}定义的、结束的时候会调用一次(与02不同的地方就是定义的时候不会调用)
04declare 前面的语句都不会调用 register_tick_function 的方法
declare(ricks = n) 的作用
01、控制某段代码执行时间
02、检查该进程是否有未处理过的信号


01、控制某段代码的时间
<?php
    declare(ticks=1);
    // 开始时间
    $time_start = time();
    // 检查是否已经超时
    function check_timeout(){
        // 开始时间
        global $time_start;
        // 5秒超时
        $timeout = 5;
        if(time()-$time_start > $timeout){
            exit("超时{$timeout}秒\n");
        }
    }
    // Zend引擎每执行一次低级语句就执行一下check_timeout
    register_tick_function('check_timeout');
    // 模拟一段耗时的业务逻辑
    while(1){
       $num = 1;
    }
    // 模拟一段耗时的业务逻辑,虽然是死循环,但是执行时间不会超过$timeout=5秒
    while(1){
       $num = 1;
    }
?>

02、检查该进程是否有未处理过的信号
<?php
    declare(ticks=1);
    pcntl_signal(SIGINT, function(){
       exit("Get signal SIGINT and exit\n");
    });

    echo "Ctl + c or run cmd : kill -SIGINT " . posix_getpid(). "\n" ;

    while(1){
      $num = 1;
    }
?>

php7的新特性 declare(strict_types=1);

强类型strict_types是从PHP7开始才引入的东西,默认不开启

strict_types=1无非就是约束了参数和返回值的类型

<?php
    declare(strict_types=1);
    function foo(int $num): int {
        return $num/2;
    }
    foo(1); //返回值类型错误
    foo(1.5); //参数类型错误
    foo(2); //正常

?>

猜你喜欢

转载自blog.csdn.net/qq_16142851/article/details/80439900