PHP7 新特性学习

  • Post author:
  • Post category:php


PHP7新特性

  • 随机整数或者字节

    random_int()

    random_bytes()

    当随机的熵不够的时候会抛出异常,可以根据异常自定一些处理。

    try {
    $bytes = random_bytes(42);
    } catch (Exception $e) {
    $cryptoStrong = false;
    $bytes = openssl_random_pseudo_bytes(42, $cryptoStrong);
    }
  • 在php7 中引入了新的exception 类,不是原来的 Exception 是继承 BasicEception的新异常类,主要有三种类 EngineException, TypeException 和 ParseException. 分别是引擎异常,类型异常, 解析异常。可以捕获系统的致命错误,可以进行错误恢复。
function add(int $left, int $right) {
return $left + $right;
}
try {
echo add('left', 'right');
} catch (Exception $e) {
// Handle exception
} catch (TypeException $e) {
// Appears to descend from Exception
// Log error and end gracefully
}
  • php7 加入了对一些敏感词的支持,允许使用部分敏感词做方法名。
  • php7 加入新的方法 preg_replace_callback_array function 可以根据匹配到的结果进行特殊处理
$code = preg_replace_callback_array(
array(
"/EXECUTE_DATA/m" =>
function($matches) {
return "execute_data";
},
"/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m" =>
function($matches) use ($spec, $prefix, $op1, $op2) {
return "return " . $matches[1] . ($spec?"_SPEC":"") . $prefix[$op1] . $prefix[$op2] . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)";
},
"/ZEND_VM_DISPATCH_TO_HELPER\(\s*([A-Za-z_]*)\s*\)/m" =>
function($matches) use ($spec, $prefix, $op1, $op2) {
return "return " . helper_name($matches[1], $spec, $op1, $op2) . "(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)";
},
"/ZEND_VM_DISPATCH_TO_HELPER_EX\(\s*([A-Za-z_]*)\s*,\s*[A-Za-z_]*\s*,\s*(.*)\s*\);/m" =>
function($matches) use ($spec, $prefix, $op1, $op2) {
return "return " . helper_name($matches[1], $spec, $op1, $op2) . "(" . $matches[2]. ", ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);";
},
), $code);
  • 增加用户生成密码的东西(没看懂,不知道干什么用得)
  • 匿名类的支持
  • 代理生成器 yield from expr 高端弄不懂,大概的意思就是可以是程序从某个地方断开去相应的地方取执行,执行完毕在返回。
  • 预留了更多的类型 这些类型不能用作 类名,接口名以及特征名,一边将来向下兼容性。

    • int
    • float
    • bool
    • string
    • true,false
    • null
  • 重新定义了一些Notice 错误提示
  • 类型中方法与类重名,会错误提示notice 因为php8 可能会去掉这个特性,建议都用__construct。
  • 去除了date.timezone 警告
  • 加入新的比较方法 <=>

    • 左边大于右边返回1
    • 左边小于右边返回-1
    • 相等返回0
  • 修复了foreach的一些诡异现象比如
php -r '$a = [1,2,3]; foreach($a as $v) {echo $v . " - " . current($a) . "\n";}'
  • 移除了一些扩展
  • 利用Jsond 替换了当前使用的Json
  • Json 解析加入新的参数 JSON_PRESERVE_ZERO_FRACTION 不会将特定类型的数据转换比如 10.0 转换成 int 10 .
echo json_encode(10.0); // Output 10
echo json_encode(10.1); // Output 10.1
echo json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION); // Output 10.0
echo json_encode(10.1, JSON_PRESERVE_ZERO_FRACTION); // Output 10.1
var_dump(json_decode(json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION))); // Output double(10)
var_dump(10.0 === json_decode(json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION))); // Output bool(true)
  • 增加函数返回类型设置
  • 添加参数快速解析api 提高了内部方法的参数解析速度
  • 支持对unicode 解析
  • PHP RFC: Native TLS (这个特性又没看懂,弱弱的感觉)
  • 加入了新的操作符 ?? 相当于三目运算 ? : 根据null来判断
$username = $_GET['user'] ?? 'nobody';
  • 整数的语义有些变化,是为了支持大整数型

    • 不管任何平台都将NaN认定为0
    • 不允许未操作负数
    • 位左移超出大小返回0
    • 位右移超出大小返回0 或者 -1
  • 在类型转换过程中出现float 转到int 是出现超出边际失败提醒
  • 将phpng 分支移动到主分支(鸟哥分支)
  • 抽象语法树 (不懂求科普)
  • 统一变量解析
  • 提高字符串和整型64位支持
  • Closure::call(又不懂了)
  • 修复list 方法出现的bug list 对字符串无效但是有时会生效
$ php -r 'list($a,$b) = "aa";var_dump($a,$b);'
NULL
NULL
$ php -r '$a[0]="ab"; list($a,$b) = $a[0]; var_dump($a,$b);'
string(1) "a"
string(1) "b"
  • 移除php边际标签

    • <%
    • <%=
    • %> closing tag
    • (<script\s+language\s*=\s*(php|”php”|’php’)\s*>)i opening tag
    • ()i closing tag
  • 在switch 中使用多个默认值,会报语法错误
  • 捕获 “call to a member function of a non-object”错误可以利用set_error_handler进行错误消息捕获来搞些事情
set_error_handler(function($code, $message) {
var_dump($code, $message);
});

$x= null;
var_dump($x->method());
echo "Alive\n";
  • unserialize() 反序列化是进行过滤
//反序列所有的东西
$data = unserialize($foo);
//反序列化所有对象
$data = unserialize($foo, false);
//反序列化除了这两个对象以外的
$data = unserialize($foo, array("MyClass", "MyClass2"));
  • IntlChar class (不懂,大神在哪)
  • session_start() 可以传入数组进行对session配置

    • read_only 只读,读取后立刻关闭
    • lazy_write 懒写入等session 更新后自动更新 通过对MD5加密后的结果进行对比查看是否更新
    • unsafe_lock 安全锁机制,读取或者写入时会上锁
    • lazy_destroy 懒销毁
  • 去除对16进制 数字和字符串的支持
  • 命名空间组的概念
// Current use syntax:

use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ChoiceQuestion as Choice;
use Symfony\Component\Console\Question\ConfirmationQuestion;

// Proposed group use syntax:

use Symfony\Component\Console\{
Helper\Table,
Input\ArrayInput,
Input\InputInterface,
Output\NullOutput,
Output\OutputInterface,
Question\Question,
Question\ChoiceQuestion as Choice,
Question\ConfirmationQuestion,
};
  • 断言捕获个人认为试用调试代码
  • 可以捕获引擎的致命错误如下
function call_method($obj) {
$obj->method();
}
try {
call_method(null); // oops!
} catch (EngineException $e) {
echo "Exception: {$e->getMessage()}\n";
}
  • 生成器返回表达式 不会用
  • 类型声明
  • Continue output buffering despite aborted connection(不懂啊)
  • 加入新的符号整除 %%
echo 3%%2;
//输出1
  • 加入 gc_collect_cycles 变为一个可以设置钩子的指针函数,有利于对垃圾回收的统计

转载于:https://www.cnblogs.com/biggerCoder/p/5035042.html