php7.1新特性简单介绍

 更新时间:2016年11月25日 15:30  点击:2010
新特性每一个版本都会有新特性了,这里我们来看php7.1新特性吧,希望文章能够让各位理解到php7.1新特性基本用法哦。


Allow specifying keys in list()
Square bracket syntax for array destructuring assignment

下面这个支持效果,还是不错的

list($a, $b) = array($b, $a);
[$a, $b] = [$b, $a];
 
foreach ($points as ["x" => $x, "y" => $y]) {
    var_dump($x, $y);
}
这个在遍历的时候会很方便,也很强大
感觉这两个特性会使数组使用便捷一些

Nullable Types

这个就是一个简写的标量或null,用处有,但感觉不大

Generalize support of negative string offsets

这个特性好,可以简化一些简单的字符串处理

Support Class Constant Visibility

暂时想不到太大用处,只是将类常量完善了

Void Return Type

这个限制函数返回值有用

同时希望miexd,number什么的也尽快出来

Catching Multiple Exception Types

多cacth异常感觉没什么用,可能还是不太会用异常吧


剩下的都是比较明显的,没啥好讨论的改进,所以就一块儿说吧


字符串索引可使用负数

$str='abcdef';
var_dump($str[-2]); // => string(1) "e"
 
$str{-3} = '.';
var_dump($str);        // => string(6) "abc.ef"
 
var_dump(isset($str{-4}));    // => bool(true)
 
var_dump(isset($str{-10}));    // => bool(false)
Void 返回类型

如果一个方法被设定成返回 void 类型,那么它将不能返回任何值

function foo(): void
{
    return 1; // 报错,不能有返回
}
 
function foo(): void
{
    return; // 正确
}
 
function foo(): void
{
    // 也正确
}

但要注意 null 是不能返回的:

function foo(): void
{
    return null; // 这也是不行的!
}

最后,如果子类要覆盖父类的某个返回 void 的方法,返回类型是不可以更改的。

类常量可见性设置

class Token
{
    // 默认是 public 属性
    const PUBLIC_CONST = 0;
 
    // 可添加可见性设置
    private const PRIVATE_CONST = 0;
    protected const PROTECTED_CONST = 0;
    public const PUBLIC_CONST_TWO = 0;
 
    // 所有常量只能设置一次可见性
    // 也可以这么写
    private const FOO = 1, BAR = 2;
}

多种 Exception 同时 Catch


try {
   // Some code...
} catch (ExceptionType1 | ExceptionType2 $e) {
   // 如果有不同的异常想用一种方式来处理的时候,就很有用了
} catch (\Exception $e) {
   // ...
}
好啦,PHP 7.1 的新特性就是这些了,大家有没有很期待呢?

PHP 7.1新功能有不少哦今天我们来看PHP 7.1 方括号数组符号多值复制和指定键值赋值的例子,具体的如下。


PHPer 们可能都知道 list 的用法,简单来说就是可以在一个表达试里通过数组对多个变量赋值:

$values = array('value1', 'value2');
$list($v1, $v2) = $values;

感觉是不是很方便呢?在 PHP 7.1 中,还能更省事儿:


[$v1, $v2] = ['foo', 'bar'];

这还不是最给力的,在 PHP 7.1 里我们还可以指定键值来赋值,从而不用关心数组元素的顺序:

list('v1' => $value1, 'v2' => $value2) = array('v1' => 'foo', 'v2' => 'bar', ...);
 
// or
['v1' => $value1, 'v2' => $value2] = ['v1' => 'foo', 'v2' => 'bar', ...];

其实在 PHP 5 的年代,list 就有一个很不错的用法可能大家都不熟悉:


$arr = [
    ['x', 'y'],
    ['x1', 'y2'],
];
 
foreach ($arr as list($x, $y)) {
    echo $x, ' ', $y, PHP_EOL;
}

到了 PHP 7.1,因为可以指定键值赋值,这种用法将更加的灵活,估计也更加常用:


$arr = [
    ['x' => 1, 'y' => '2'],
    ['x' => 2, 'y' => '4'],
];
 
foreach ($arr as ['x' => $x, 'y' => $y)) {
    echo $x, ' ', $y, PHP_EOL;
}

再看看一个官网的例子,是不是感觉好像春风拂面一样清爽:

class ElePHPant
{
    private $name, $colour, $age, $cuteness;
 
    public function __construct(array $attributes) {
        // $this->name = $attributes['name']; // 以前
       
        // 现在
        [
            "name" => $this->name,
            "colour" => $this->colour,
            "age" => $this->age,
            "cuteness" => $this->cuteness
        ] = $attributes;
    }
 
    // ...
}

值得一提的是:此种赋值方式,是可以嵌套使用的!

[[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];

最后,在 PHP 7.1 的提案里有一个展望,也非常值得期待:

class ElePHPant
{
    private $name, $colour, $age, $cuteness;
 
    public function __construct(["name" => string $name, "colour" => \Colour $colour, "age" => int $age, "cuteness" => float $cuteness]) {
        $this->name = $name;
        $this->colour = $colour;
        $this->age = $age;
        $this->cuteness = $cuteness;
    }
 
    // ...
}
如果 PHP 推出此语法,那么参数列表将不再关心参数顺序,PHP 的小伙伴将不再羡慕 Ruby 的小伙伴啦!

PHP实现浏览器文件下载图片或者php文件需要通过header来输出下载否则会进行解析无法正确的下载文件哦,下面的我们就来看看吧。

超链接下载

如果浏览器支持超链接的方式下载文件,会在点击超链接的时候自动下载文件。

下面我们来测试一下通过超链接下载文件:

<a href="/Uploads/test.zip">通过超链接的方式下载文件</a><br>
 
当我们点击的时候如下所示:

超链接下载文件

通过超链接下载图片:
我们通过超链接下载图片时,会直接在浏览器打开显示,然后我们需要再存储到指定路径保存下来:

 
<a href="/Uploads/QC8054R7QPGQ_1000x500.jpg">通过超链接的方式下载图片</a><br>
 
效果是这样的:

超链接下载图片

通过程序下载

HTML端一行代码
 
<a href="download.php?filename=QC8054R7QPGQ_1000x500.jpg">通过程序的方式来下载图片</a>
 
download.php代码

我们是通过Header请求头来发送文件下载信息,指定下载的是附件,下载后的文件名,content-length来指定文件的大小,然后通过readfile函数来读取文件内容而实现文件下载:

<?php
 
$filename = $_GET['filename'];
header('content-disposition:attachment;filename='. basename($filename));
header('content-length:'. filesize($filename));
 
readfile($filename);
 
效果如下:

php多线程并发实现这个问题我们要如何实现呢,知道在java中多线程非常的简单但在php中多线程估计并不好操作,下面我们来看php多线程并发例子。


java里多线程就是一个new thread的事情,php依赖apache靠着linux底层有一个多线程的办法。

今天说说如果你无法操控apache的服务器,如何模拟php并发

<?php
if(function_exists('date_default_timezone_set')) {
    date_default_timezone_set('PRC');
}
 
function a()
{
 $time = time();
 
 sleep(3);
 $fp = fopen('result_a'.$time.'.log', 'w');
 fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
 fclose($fp);
}
function b()
{
 $time = time();
 
 sleep(3);
 $fp = fopen('result_b'.$time.'.log', 'w');
 fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
 fclose($fp);
}
 
if(!isset($_GET['act'])) $_GET['act'] = 'a';
 
if($_GET['act'] == 'a')
{
 a();
}
else if($_GET['act'] == 'b') b();
?>
以上代码,在本地写入一个文件。
如果你访问 localhost/a.php 在两个浏览器标签尽可能快的同时打开,发现两个文件创建时间相差为3秒

但是如果你访问localhost/a.php?act=b 另一个访问/a.php?act=a 你发现两个文件创建的时间几乎差不多。

对于apache来说同样的url意味着一个线程(我们或者说是进程),但是不同的URL意味着可以并发。

如果php内部有下载的动作

function runThread()
{
 down("http://localhost/test/a.php?act=a");
}
if($_GET['act'] == 'run')
{
 echo 'start:';
 
 runThread();
 
 echo ' End';
}
http://localhost/test/a.php?act=run

http://localhost/test/a.php?act=run&s=2

只要主访问的url不同,则认为是不同的进行,意味着并发。文件创建时间不为3秒

本地有Linux服务器的朋友也可以借助linux来进行模拟并发

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>
上面存成test.php, 然后写一段SHELL代码

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

错误信息提示就是在程序开发测试时碰到错误给出提示了,今天我们来看一篇关于PHP代码开启错误信息提示方法,具体的细节步骤如下文介绍。

不显示调试错误

之前没有开启之前,出现这样的错误提示,并不是我们希望的,这样没有给我们任何有意义的调试信息:

解决办法

在入口处统一设置如下代码即可:

 ini_set("display_errors", "On");
error_reporting(E_ALL);

php.ini的话,代码如下:

找到display_errors = On 修改为 display_errors = off

[!--infotagslink--]

相关文章

  • php简单数据操作的实例

    最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
  • C# 10个常用特性汇总

    这篇文章主要介绍了C# 10个常用特性,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-09
  • JavaScript中的Reflect对象详解(ES6新特性)

    这篇文章主要介绍了JavaScript中的Reflect对象(ES6新特性)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-29
  • 关于MySQL外键的简单学习教程

    在MySQL中,InnoDB引擎类型的表支持了外键约束。 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持); 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时...2015-11-24
  • C#语言主要特性总结

    这篇文章主要介绍了C#语言主要特性总结,本文总结了C#语言的简单、现代、面向对象、类型安全、相互兼容性、可伸缩性和可升级性等几个主要特点,需要的朋友可以参考下...2020-06-25
  • ES6新特性之变量和字符串用法示例

    这篇文章主要介绍了ES6新特性之变量和字符串用法,结合具体实例形式分析了ES6中变量与字符串的特性、使用方法与相关注意事项,需要的朋友可以参考下...2017-04-03
  • MySQL 5.6 GTID新特性实践

    GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。下文给大家介绍MySQL 5.6 GTID新特性实践,感兴趣的朋友一起看看吧...2016-10-20
  • C# 实现简单打印的实例代码

    C# 实现简单打印的实例代码,需要的朋友可以参考一下...2020-06-25
  • C++17新特性个人总结

    这篇文章主要介绍了C++17新特性个人总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-22
  • python3.9之你应该知道的新特性详解

    这篇文章主要介绍了python3.9之你应该知道的新特性详解,需要的朋友可以参考下...2021-04-29
  • ES6新特性之类(Class)和继承(Extends)相关概念与用法分析

    这篇文章主要介绍了ES6新特性之类(Class)和继承(Extends)相关概念与用法,结合实例形式较为详细的分析了ES6中类(Class)和继承(Extends)的基本概念、语法、使用方法与注意事项,需要的朋友可以参考下...2017-05-27
  • ES6新特性之解构、参数、模块和记号用法示例

    这篇文章主要介绍了ES6新特性之解构、参数、模块和记号用法,结合实例形式分析了解构、参数、模块和记号的功能、用法及相关使用注意事项,需要的朋友可以参考下...2017-04-03
  • MySQL8新特性之全局参数持久化详解

    从8.0开始,可通过SET PERSIST命令将全局变量的修改持久化到配置文件中,下面这篇文章主要给大家介绍了关于MySQL8新特性之全局参数持久化的相关资料,需要的朋友可以参考下...2021-10-11
  • c#中string的特性介绍及注意事项小结

    这篇文章主要给大家介绍了关于c#中string的特性介绍及注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • 干货来袭! C# 7.0 新特性(VS2017可用)

    干货来袭! 为大家分享了C# 7.0 新特性,VS2017可用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • ajax简单与ajax+php实例应用(1/4)

    [ajax介绍]   ajax是使用客户端脚本与web服务器交换数据的web应用开发方法。web页面不用打断交互流程进行重新加裁,就可以动态地更新。使用ajax,用户可以创建接近本地...2016-11-25
  • PHP7新特性foreach 修改使用例子

    PHP7新特性foreach与前版本稍一些改变了,那么在PHP7新特性foreach到底作了什么改变呢,我们下面一起来看看PHP7新特性foreach 修改使用例子,希望文章能够帮助到大家。...2016-11-25
  • C#最简单的字符串加密解密方法

    这篇文章主要介绍了C#最简单的字符串加密解密方法,本文直接给出实例代码,需要的朋友可以参考下...2020-06-25
  • asp.net使用H5新特性实现异步上传的示例

    下面小编就为大家分享一篇asp.net使用H5新特性实现异步上传的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-09-22
  • 即将发布的jQuery 3 有哪些新特性

    本文主要介绍jQuery 3中一些新增的特性和一些变更的特性,以及一些废弃删除的特性,另外介绍了jQuery 3.0 最大的变化就是彻底放弃对 IE8 的支持,大家可以先看一下。...2016-04-17