zoukankan      html  css  js  c++  java
  • 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 变为一个可以设置钩子的指针函数,有利于对垃圾回收的统计
     
  • 相关阅读:
    chrome如何分析页面加载时间
    Mysql、sqlserver、oracle指定返回记录数
    与oracle 有关的那点事
    websocket 初步认识
    致那些说“你们测试想XXX就XXX”的开发
    除了RPS和错误率,性能测试还需要关注这些指标
    Zookeeper简介
    Servlet 简介
    Linux常见压缩、解压缩
    k8s CNI插件简单了解
  • 原文地址:https://www.cnblogs.com/biggerCoder/p/5035042.html
Copyright © 2011-2022 走看看