PHP7 新特性学习

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) . "
";}'
  • 移除了一些扩展
  • 利用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
    • (<scripts+languages*=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 ";
  • 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 SymfonyComponentConsoleHelperTable;
use SymfonyComponentConsoleInputArrayInput;
use SymfonyComponentConsoleOutputNullOutput;
use SymfonyComponentConsoleQuestionQuestion;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;
use SymfonyComponentConsoleQuestionChoiceQuestion as Choice;
use SymfonyComponentConsoleQuestionConfirmationQuestion;

// Proposed group use syntax:

use SymfonyComponentConsole{
HelperTable,
InputArrayInput,
InputInputInterface,
OutputNullOutput,
OutputOutputInterface,
QuestionQuestion,
QuestionChoiceQuestion as Choice,
QuestionConfirmationQuestion,
};
  • 断言捕获个人认为试用调试代码
  • 可以捕获引擎的致命错误如下
function call_method($obj) {
$obj->method();
}
try {
call_method(null); // oops!
} catch (EngineException $e) {
echo "Exception: {$e->getMessage()} ";
}
  • 生成器返回表达式 不会用
  • 类型声明
  • Continue output buffering despite aborted connection(不懂啊)
  • 加入新的符号整除 %%
echo 3%%2;
//输出1
  • 加入 gc_collect_cycles 变为一个可以设置钩子的指针函数,有利于对垃圾回收的统计
 
原文地址:https://www.cnblogs.com/biggerCoder/p/5035042.html