php declare 的语法详解

declare


(PHP 4, PHP 5, PHP 7)
declare构造用于为代码块设置执行指令。 declare的语法类似于其他流控制结构的语法:

declare (directive)
   statement

directive 部分允许设定 declare 代码段的行为。目前只认识三个指令:ticks(更多信息见 ticks 指令), encoding(更多信息见 encoding 指令)以及 strict_types(更多信息见 strict 指令)


一、ticks指令

语法:

<?php
declare (ticks=N);
# ...

// 或下面写法作用于代码块

declare (ticks=N){
    # ...
}

Zend 引擎每执行 1 条低级语句就去执行一次 register_tick_function () 注册的函数。可以粗略的理解为每执行一句 php 代码(例如:$num=1;)就去执行下已经注册的 tick 函数。一个用途就是控制某段代码执行时间,例如下面的代码虽然最后有个死循环,但是执行时间不会超过 5 秒。

该指令需要配合register_tick_function()使用

// 下面是一个示例
declare(ticks=1);

class Counter {
    private $counter = 0;

    public function increase($a)
    {
        $this->counter+=$a;
    }
    
    public function print()
    {
        return $this->counter;    
    }
}

$obj = new Counter;
register_tick_function([&$obj, 'increase'],1);

for ($i = 0; $i < 100; $i++)
{
    $a = 3;
}

// unregister_tick_function([&$obj, 'increase']);
// Not sure how to de-register, you can use static methods and members in the Counter instead.

var_dump("Number of basic low level operations: " . $obj->print());

其他示例点CSDN > PHP declare (ticks=N); 的作用

二、encoding指令

语法:

declare(encoding='ISO-8859-1');
# ...

可以使用encoding指令为每个脚本指定脚本的编码。

Caution

当和命名空间结合起来时 declare 的唯一合法语法是 declare(encoding=’…’);,其中 … 是编码的值。而 declare(encoding=’…’) {} 将在与命名空间结合时产生解析错误。

在 PHP 5.3 中除非在编译时指定了 --enable-zend-multibyte,否则 declare 中的 encoding 值会被忽略。
注意除非用 phpinfo(),否则 PHP 不会显示出是否在编译时指定了 --enable-zend-multibyte。
参见 zend.script_encoding。

三、strict_types指令

语法:

declare(strict_types=1);
# ...

默认情况下,所有的 PHP 文件都处于弱类型校验模式。新的 declare 指令,通过指定 strict_types 的值(1 或者 0),1 表示严格类型校验模式,作用于函数调用和返回语句;0 表示弱类型校验模式。
declare (strict_types=1) 必须是文件的第一个语句。如果这个语句出现在文件的其他地方,将会产生一个编译错误,块模式是被明确禁止的。
类似于 encoding 指令,但不同于 ticks 指令,strict_types 指令只影响指定使用的文件,不会影响被它包含(通过 include 等方式)进来的其他文件。该指令在运行时编译,不能修改。它的运作方式,是在 opcode 中设置一个标志位,让函数调用和返回类型检查符合类型约束。

示例一:
declare(strict_types=1);
 
function func(int $num): int {
    return $num;
}
var_dump(func(2)); // returned value:int(2)
示例二:
//declare(strict_types=1);
 
function func(int $num):int{
    return $num;
}
var_dump(func(2.5)); // returned value:int(2)
示例三:
declare(strict_types=1);
 
function func($num):int{
    return $num;
}
var_dump(func(2.5)); // returned value:Return value of func() must be of the type integer, float returned
发布了41 篇原创文章 · 获赞 21 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/u010324331/article/details/88316692