1. 文章
  2. 文章详情

php7新特性总结(二)

一致性的foreach循环

//PHP5
$a =  array(1, 2, 3);foreach ($a as $v){var_dump(current($a));}
int(2)
int(2)
int(2)

$a =  array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a));}
int(2)
int(3)
bool(false)

$a =  array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a));}
int(1)
int(1)
int(1)

//PHP7:不再操作数据的内部指针了
$a =  array(1, 2, 3);foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

$a =  array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a))
int(1)
int(1)
int(1)

$a =  array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

上下问敏感的词法分析

//PHP5
class Collection {public function foreach($arr) {}}
#Parse error:  parse error, expecting `"identifier (T_STRING)”’...

//PHP7
class Collection {
    public function foreach($arr) {
        return $this;
    }
    public function in($arr){
        return $this;
    }
    public function sort($condition){
        return $this;
    }
    public function echo($condition){
        return 'ok';
    }
}
$collection = new Collection();
$collection->in()->foreach()->sort()->echo();

use方法 批量导入

// PHP 7 之前的代码
use somenamespaceClassA;
use somenamespaceClassB;
use somenamespaceClassC as C;

use function somenamespacefn_a;
use function somenamespacefn_b;
use function somenamespacefn_c;

use const somenamespaceConstA;
use const somenamespaceConstB;
use const somenamespaceConstC;

// PHP 7+ 及更高版本的代码
use somenamespace{ClassA, ClassB, ClassC as C};
use function somenamespace{fn_a, fn_b, fn_c};
use const somenamespace{ConstA, ConstB, ConstC}

use FooBar{
    Foo,
    Bar,
    Baz,
};

允许重写抽象方法

abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden - still maintaining contravariance for parameters and covariance for return
    abstract function test($s) : int;
}

多异常捕获处理

try {
    // some code
} catch (FirstException | SecondException $e) {  //用 | 来捕获FirstException异常,或者SecondException 异常
  
}

支持goto语句

goto a;    
echo '牛逼';    
a:    
echo 'pfinal';    
for($i=0,$j=50; $i<100; $i++) {    
  while($j--) {    
    if($j==17) goto end;    
  }     
}    
echo "i = $i";    
end:    
echo '社区';

Nowdoc语法

// Nowdoc 单引号 PHP 5.3之后支持    
$name = 'pfinal';    

echo <<<'EXO'
My name is "$name".   
EXO;
//上面代码输出 My name is "$name". ((其中变量不被解析) 

echo <<<FOOBAR
Hello pfinal社区
FOOBAR;

echo <<<"FOOBAR"
Hello pfinal社区
FOOBAR;

常量引用

//常量引用”意味着数组可以直接操作字符串和数组字面值。
function randomHexString($length) {    
    $str = '';    
    for ($i = 0; $i < $length; ++$i) {    
        $str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string    
    }    
}    
function randomBool() {    
    return [false, true][mt_rand(0, 1)]; // direct dereference of array    
}   

常量增强

//常量计算
const A = 2;  
const B = A + 1;  
class C  
{  
    const STR = "hello";  
    const STR2 = self::STR . ", world";  
}
var_dump(C::STR2);
var_dump(B);

//类常量可见性 
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

可变函数参数

function add(...$args)  
{  
    $result = 0;  
    foreach($args as $arg)  
        $result += $arg;  
    return $result;  
} 

Session options

//现在,session_start()函数可以接收一个数组作为参数,可以覆盖php.ini中session的配置项。 比如,把cache_limiter设置为私有的,同时在阅读完session后立即关闭。
session_start(['cache_limiter' => 'private',
               'read_and_close' => true,
]);

支持动态调用静态方法

class Test{    
    public static function testgo()    
    {    
         echo "pfinal社区牛逼!";    
    }    
}    
$class = 'Test';    
$action = 'testgo';    
$class::$action();  //输出 "pfinal社区牛逼!"

整除

var_dump(intdiv(10, 3));

随机函数

//random_bytes() -加密生存被保护的伪随机字符串.
//random_int() -加密生存被保护的伪随机整数.
$bytes = random_bytes(8); 
echo(bin2hex($bytes));//随机2073a110a2e3c497
echo '
'
; echo(random_int(1, 999));//随机786 echo '
'
; print(random_int(-999, -1));//随机-357

参考链接:

关于PHP7新特性 - PHP7新特性 - PHP7​www.php7.site

发表评论

登录后才能评论

评论列表(0条)