加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_新乡站长网 (https://www.0373zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php指针 [PHP7.0-PHP7.2]的新特性和新变更

发布时间:2022-12-05 11:34:16 所属栏目:PHP教程 来源:
导读:  增加了返回类型声明,类似参数类型。这样更方便的控制函数的返回值.在函数定义的后面加上:类型名即可

  function fun(int $a): array
  {
   return $a;
  }
  fun(3);//Fatal error
  复
  增加了返回类型声明,类似参数类型。这样更方便的控制函数的返回值.在函数定义的后面加上:类型名即可
 
  function fun(int $a): array
  {
    return $a;
  }
  fun(3);//Fatal error
  复制
 
  6. 匿名类
 
  php7允许new class {} 创建一个匿名的对象。
 
  //php7以前
  class Logger
  {
      public function log($msg)
      {
          echo $msg;
      }
  }
  $util->setLogger(new Logger());
  // php7+
  $util->setLogger(new class {
      public function log($msg)
      {
          echo $msg;
      }
  });
  复制
 
  7. Unicode codepoint 转译语法
 
  这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的
 
  echo "\u{aa}";// ?
  echo "\u{0000aa}";// ?
  echo "\u{9999}";// 香
  复制
 
  8. Closure::call
 
  闭包绑定 简短干练的暂时绑定一个方法到对象上闭包并调用它。
 
  class A {private $x = 1;}
  // PHP 7 之前版本的代码
  $getXCB = function() {return $this->x;};
  $getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
  echo $getX();
  // PHP 7+ 及更高版本的代码
  $getX = function() {return $this->x;};
  echo $getX->call(new A);
  复制
 
  9. 带过滤的unserialize
 
  提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入
 
  // 将所有的对象都转换为 __PHP_Incomplete_Class 对象
  $data = unserialize($foo, ["allowed_classes" => false]);
  // 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
  $data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
  // 默认情况下所有的类都是可接受的,等同于省略第二个参数
  $data = unserialize($foo, ["allowed_classes" => true]);
  复制
 
  10. IntlChar类
 
  这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。需要安装intl拓展
 
 
  printf('%x', IntlChar::CODEPOINT_MAX);
  echo IntlChar::charName('@');
  var_dump(IntlChar::ispunct('!'));
  复制
 
  11. 预期
 
  它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。以后可以使用这个这个进行断言测试
 
  ini_set('assert.exception', 1);
  class CustomError extends AssertionError {}
  assert(false, new CustomError('Some error message'));
  复制
 
  12. 命名空间按组导入
 
  从同一个命名空间下导入的类、函数、常量支持按组一次导入
 
  #php7以前
  use app\model\A;
  use app\model\B;
  #php7+
  use app\model{A,B}
  复制
 
  13.生成器支持返回表达式
 
  它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。
 
  $gen = (function() {
      yield 1;
      yield 2;
      return 3;
  })();
  foreach ($gen as $val) {
      echo $val, PHP_EOL;
  }
  echo $gen->getReturn(), PHP_EOL;
  # output
  //1
  //2
  //3
  复制
 
  14.生成器委派
 
  现在,只需在最外层生成其中使用yield from,就可以把一个生成器自动委派给其他的生成器
 
  function gen()
  {
      yield 1;
      yield 2;
      yield from gen2();
  }
  function gen2()
  {
      yield 3;
      yield 4;
  }
  foreach (gen() as $val)
  {
      echo $val, PHP_EOL;
  }
  复制
 
  15.整数除法函数intdiv
 
  var_dump(intdiv(10,3)) //3
  复制
 
  16.会话选项设置
 
  session_start() 可以加入一个数组覆盖php.ini的配置
 
  session_start([
      'cache_limiter' => 'private',
      'read_and_close' => true,
  ]);
  复制
 
  17. preg_replace_callback_array
 
  可以使用一个关联数组来对每个正则表达式注册回调函数php指针, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值
 
  string preg_replace_callback_array(array $regexesAndCallbacks, string $input);
  $tokenStream = []; // [tokenName, lexeme] pairs
  $input = <<<'end'
  $a = 3; // variable initialisation
  end;
  // Pre PHP 7 code
  preg_replace_callback(
      [
          '~\$[a-z_][a-z\d_]*~i',
          '~=~',
          '~[\d]+~',
          '~;~',
          '~//.*~'
      ],
      function ($match) use (&$tokenStream) {
          if (strpos($match[0], '$') === 0) {
              $tokenStream[] = ['T_VARIABLE', $match[0]];
          } elseif (strpos($match[0], '=') === 0) {
              $tokenStream[] = ['T_ASSIGN', $match[0]];
          } elseif (ctype_digit($match[0])) {
              $tokenStream[] = ['T_NUM', $match[0]];
          } elseif (strpos($match[0], ';') === 0) {
              $tokenStream[] = ['T_TERMINATE_STMT', $match[0]];
          } elseif (strpos($match[0], '//') === 0) {
              $tokenStream[] = ['T_COMMENT', $match[0]];
          }
      },
      $input
  );
  // PHP 7+ code
  preg_replace_callback_array(
      [
          '~\$[a-z_][a-z\d_]*~i' => function ($match) use (&$tokenStream) {
              $tokenStream[] = ['T_VARIABLE', $match[0]];
          },
          '~=~' => function ($match) use (&$tokenStream) {
              $tokenStream[] = ['T_ASSIGN', $match[0]];
          },
          '~[\d]+~' => function ($match) use (&$tokenStream) {
              $tokenStream[] = ['T_NUM', $match[0]];
          },
          '~;~' => function ($match) use (&$tokenStream) {
              $tokenStream[] = ['T_TERMINATE_STMT', $match[0]];
          },
          '~//.*~' => function ($match) use (&$tokenStream) {
              $tokenStream[] = ['T_COMMENT', $match[0]];
          }
      ],
      $input
  );
  复制
 
  18. 随机数、随机字符函数
 
  string random_bytes(int length);
  int random_int(int min, int max);
  复制
 
  19. define 支持定义数组
 
  #php7+
  define('ALLOWED_IMAGE_EXTENSIONS', ['jpg', 'jpeg', 'gif', 'png']);
  复制
 
  PHP7.0 变化1. 错误和异常处理相关变更
 
  PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。
 
  这也意味着,当发生错误的时候,以前代码中的一些错误处理的代码将无法被触发。 因为在 PHP 7 版本中,已经使用抛出异常的错误处理机制了。 (如果代码中没有捕获 Error 异常,那么会引发致命错误)。set_error_handle不一定接收的是异常,有可能是错误。
 
  ERROR层级结构
 
  interface Throwable
      |- Exception implements Throwable
          |- ...
      |- Error implements Throwable
          |- TypeError extends Error
          |- ParseError extends Error
          |- AssertionError extends Error
          |- ArithmeticError extends Error
              |- DivisionByZeroError extends ArithmeticError
  复制
 
  function handler(Exception $e) { ... }
  set_exception_handler('handler');
  // 兼容 PHP 5 和 7
  function handler($e) { ... }
  // 仅支持 PHP 7
  function handler(Throwable $e) { ... }
  复制
 
  2. list
 
  list 会按照原来的顺序进行赋值。不再是逆序了
 
  list($a,$b,$c) = [1,2,3];
  var_dump($a);//1
  var_dump($b);//2
  var_dump($c);//3
  复制
 
  list不再支持解开字符串、
 
  3. foreach不再改变内部数组指针
 
 
  #php 5
  int(1)
  int(2)
  bool(false)
  #php7
  int(0)
  int(0)
  int(0)
  复制
 
  4. 十六进制字符串不再被认为是数字
 
  var_dump("0x123" == "291");
  #php5
  true
  #php7
  false
    
  复制
 

(编辑:开发网_新乡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!