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 的新特性就是这些了,大家有没有很期待呢?
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 的小伙伴啦!
超链接下载
如果浏览器支持超链接的方式下载文件,会在点击超链接的时候自动下载文件。
下面我们来测试一下通过超链接下载文件:
<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);
效果如下:
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
不显示调试错误
之前没有开启之前,出现这样的错误提示,并不是我们希望的,这样没有给我们任何有意义的调试信息:
解决办法
在入口处统一设置如下代码即可:
ini_set("display_errors", "On");
error_reporting(E_ALL);
php.ini的话,代码如下:
找到display_errors = On 修改为 display_errors = off
相关文章
- 最基础的对数据的增加删除修改操作实例,菜鸟们收了吧...2013-09-26
- 这篇文章主要介绍了C# 10个常用特性,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-09
JavaScript中的Reflect对象详解(ES6新特性)
这篇文章主要介绍了JavaScript中的Reflect对象(ES6新特性)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-07-29- 在MySQL中,InnoDB引擎类型的表支持了外键约束。 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持); 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时...2015-11-24
- 这篇文章主要介绍了C#语言主要特性总结,本文总结了C#语言的简单、现代、面向对象、类型安全、相互兼容性、可伸缩性和可升级性等几个主要特点,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了ES6新特性之变量和字符串用法,结合具体实例形式分析了ES6中变量与字符串的特性、使用方法与相关注意事项,需要的朋友可以参考下...2017-04-03
- GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。下文给大家介绍MySQL 5.6 GTID新特性实践,感兴趣的朋友一起看看吧...2016-10-20
- C# 实现简单打印的实例代码,需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了C++17新特性个人总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-22
- 这篇文章主要介绍了python3.9之你应该知道的新特性详解,需要的朋友可以参考下...2021-04-29
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
这篇文章主要介绍了ES6新特性之类(Class)和继承(Extends)相关概念与用法,结合实例形式较为详细的分析了ES6中类(Class)和继承(Extends)的基本概念、语法、使用方法与注意事项,需要的朋友可以参考下...2017-05-27- 这篇文章主要介绍了ES6新特性之解构、参数、模块和记号用法,结合实例形式分析了解构、参数、模块和记号的功能、用法及相关使用注意事项,需要的朋友可以参考下...2017-04-03
- 从8.0开始,可通过SET PERSIST命令将全局变量的修改持久化到配置文件中,下面这篇文章主要给大家介绍了关于MySQL8新特性之全局参数持久化的相关资料,需要的朋友可以参考下...2021-10-11
- 这篇文章主要给大家介绍了关于c#中string的特性介绍及注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 干货来袭! 为大家分享了C# 7.0 新特性,VS2017可用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- [ajax介绍] ajax是使用客户端脚本与web服务器交换数据的web应用开发方法。web页面不用打断交互流程进行重新加裁,就可以动态地更新。使用ajax,用户可以创建接近本地...2016-11-25
- PHP7新特性foreach与前版本稍一些改变了,那么在PHP7新特性foreach到底作了什么改变呢,我们下面一起来看看PHP7新特性foreach 修改使用例子,希望文章能够帮助到大家。...2016-11-25
- 这篇文章主要介绍了C#最简单的字符串加密解密方法,本文直接给出实例代码,需要的朋友可以参考下...2020-06-25
- 下面小编就为大家分享一篇asp.net使用H5新特性实现异步上传的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-09-22
- 本文主要介绍jQuery 3中一些新增的特性和一些变更的特性,以及一些废弃删除的特性,另外介绍了jQuery 3.0 最大的变化就是彻底放弃对 IE8 的支持,大家可以先看一下。...2016-04-17