PHP 7.1.中的最后一个功能
PHP 7.1.中的最后一个功能

这是我们系列关于PHP 7.1中的最后一个功能的第三部分。看 '即将到来的PHP 7.1(A部分)' 和‘PHP 7.1.中的更多即将到来的功能(b部分)‘.

自我们上一篇文章以来,PHP 7.1现在是RC1,可以快速进入代码。我们现在正在展示PHP 7.1的最后一批新功能和现代化,以PHP 7.0的顶部。

每月删除每一美元

$这是一个特殊的变量,在类中使用来指定当前对象。在这个范围之外, 它不应该’t be used。 PHP 7.0开始使用此外部类和7.1 完成了这份工作。 $这可能’t在函数中使用作为参数,作为静态或全局变量,作为捕获变量或通过引用,可变变量也不是提取()和co。它可以’t未被释放,并且在未在对象上下文中使用时也会抛出异常。

<?php

function foo($this) { /**/ }
// Fatal error: Cannot use $this as parameter
?>

源代码中不再可能删除字符

From reading the docs, PHP source code has to be validated with this regex : /[_a-zA-Z\x7F-\xFF][_0-9a-zA-Z\x7F-\xFF]*/. Andrea Faulds (//ajf.me/) noted recently that this regex accepts the delete char (0x7f), which creates an unreadable PHP code, as editors won’t understand it. So do I.

相关错误报告.

像func_get_args()这样的函数可以’t被动态地打电话

使用动态呼叫(例如Call_User_Func(),$ clice_name或在ad hoc函数中的回调(array_map等)中,不能使用以下函数。

  • 提炼()
  • 袖珍的()
  • get_defined_vars()
  • func_get_args()
  • func_get_arg()
  • func_num_args()
  • parse_str()有一个参数
  • mb_parse_str()有一个参数
  • sassert()与字符串参数

在里面 相关的RFC,Nikita解释说,使用它们导致了解不明确的行为和优化问题,最好留在一边。这意味着必须使用那些函数来使用,并且可以’t设置在一个字符串中。

即使是未完全构造的对象也被称为restructor()

在实例化时间,调用类构造函数。如果在此呼叫期间抛出异常,则该对象应该被配置不完整,并且析构函数应该’被召唤。析构函数只会在完全构造的对象上调用。

有关这种情况,请重新开放PHP 5.0的旧错误。 PHP用于拦截直接从构造函数抛出时的异常,但不会’当它从另一个语境中抛出时,t抓住它,如祖先功能。

This has an impact on frameworks or in-house libraries, that centralize error management in a common function. See bug //bugs.php.net/bug.php?id=29368 for more details. (Note that bug number is 29368, while the current bug number is 73025 (as of Sep. 6, 2016).

<?php

function throwme($arg) {
   throw new Exception;
}

class foo {
  function __construct() {
    echo "Inside constructor\n";
    throwme($this);
  }

  function __destruct() {
    echo "Inside destructor\n";
  }
}

try {
  $bar = new foo;
} catch(Exception $exc) {
  echo "Caught exception!\n";
}
?>

call_user_func.()始终拒绝引用

call_user_func.()和call_user_func_array()现在始终始终抛出错误,试图调用其签名具有引用的方法。以前,如果在命名空间之外使用call_user_func(),则有时工作。

rand()现在是mt_rand()的别名

Rand()和srand()现在是mt_rand()和mt_srand()的别名。这意味着rand()的行为变化。特别是,当Srand()/ rand()用于创建数字的可生制又随机的Serie时。查看此代码:

<?php
  srand(10);
  print rand()."\n";
  print rand()."\n";
  print rand()."\n";
?>

srand()用于‘seed’rand(),这是初始化的另一个名称。从第一号(这里,10)开始生成随机数,但生成随机数的进程是可重复的:连续调用相同的脚本,连续几次生成始终相同的随机数:

1215069295
1311962008
1086128678

切换到PHP 7.1时,RAND()具有相同的行为,但不再具有相同的值:
1656398468
641584702
44564466

事实上,mt_rand()本身改变了行为,因此通过现在切换到MT_RAND()的准备代码导致相同的效果:

PHP 7.0结果使用MT_RAND()而不是RAND()
502355954
641584702
2112621188

无法准备一个’s代码更改,但PHP 7.1代码可以在传递MT_RAND_PHP常量时表现为PHP 7.0。

所有环境变量

现在可以省略getEnv()’s论证,并获取整个环境变量列表,而不是一个。这是相当于使用$ _env的,虽然有点慢。

PostgrayQL注意到处理

pg_last_notice() 获取在先前查询请求期间发出的通知。现在可以使用新的参数来管理此列表:默认和以前的行为,使用pgsql_notice_last处理; PGSQL_NOTICE_ALL,在数组中获取所有存储的通知,并且PGSQL_NOTICE_CLEAR删除它们都不读取。如果没有任何内容,PG_LAST_NOTICE()就像往常一样返回FALSE。

parse_url()更加限制

parse_url() 现在支持RFC3986,处理登录和通过时更加限制。特别是,登录或传递中不允许@ @(这将导致http://用户@ pass @ host / path)。

Unicode电子邮件过滤器和IMAP邮件大小

filter_flag_email_unicode可用于检查不寻常的电子邮件地址,包括符号或Unicode字符:‘Ü[email protected] [IPv6:2001:DB8:1FF :: A0B:DBD0]’。阅读更多信息 电子邮件地址.

只有受主题相关的,IMAP扩展已升级:长度超过16385字节的电子邮件地址将抛出错误的实例而不是导致致命错误。

自定义会话处理程序是可容纳的

自定义会话处理程序必须在生成会话ID时返回字符串。此外,否则返回null或数组现在抛出错误,而不是致命错误。捕获此类错误仍然非常重要,以避免向用户发送不安全的会话ID。

应为session_create_id(),session_regenere_id()和session_id()添加/ catch。

<?php
try{
  session_regenerate_id () ;
} catch (Error $e) {
// Log error
// deal with missing session ID
}
?>

jpeg_ignore_warning默认为0

操作JPEG图像时,PHP用于从jpeg2wbmp()和imageCreatefromjpeg()中报告警告。默认情况下,此现在设置为1,忽略警告。如果您的应用程序感觉比以前更少的错误图像,这可能是因为警告是隐藏的:返回PHP.ini并再次激活它。

openssl sslv2已被删除

当OpenSSL处于活动状态时,将多个流套接字传输添加到PHP二进制文件中,包括SSLv2和SSLv3。 SSLv2已被发现不安全和应’使用。在谷歌发布贵宾犬开发技术之后,SSLv3也在出路上。当前协议是TLS。 TLS 1.0接近SSLv3,因此当前的最佳选择是TLS 1.1和1.2。看 http://disablessl3.com/ for more.

会话ID可以超出存储

现在使用cspng生成会话ID。此外,出于速度原因,保护会话ID的原始值的散列被删除,在每个会话上保存MD5或SHA1呼叫。由于这将暴露会话的内部值,因此会话ID填充到Session.sid_length,额外的session.sid_bits_per_character字符(默认值4)。

然后,为了向后兼容性,会话ID的大小可以增加MD5的大小,其中至少增加6个额外的随机字符,导致会话ID大小为22.另一方面,会话ID可能会增长最多256个字符。

Generally speaking, this shouldn’t be a problem, until the session ID storage has some size optimization. Joomla ! Has already detected such needed upgrade (see //issues.joomla.org/tracker/joomla-cms/11761).

从可调用的封闭

PHP 7.0缺乏可调用闭合的方法。可调用的是PHP必须引用功能或方法的方式。它们与Array_Map,Array_Filter等一起使用,以便在阵列处理的某些点处被调用。

另一方面,Closure是可调用的多功能版本,并具有完整的API。将一些旧代码转换为闭包,并通过封闭类的新静态方法来实现:from可卡()

看 this example from the RFC: //wiki.php.net/rfc/closurefromcallable : getValidatorCallback returns different callable, built with its method, may they be private or not.

<?php class Validator {   
   public function getValidatorCallback($validationType) {   
      if ($validationType == 'email') { 
         return Closure::fromCallable([$this, 'emailValidation']); 
      }   
      return Closure::fromCallable([$this, 'genericValidation']); 
   }   

    private function emailValidation($userData)  { /**/ }   
    private function genericValidation($userData) { /**/ } 
}   

$validator = new Validator(); 
$callback = $validator->getValidatorCallback('email');
$callback($userData);

?>

去PHP 7.1!

这是我们三个部分系列的结束 PHP 7.1.。正如您所见,所有243个贡献者都有大量的工作到PHP 7.1。在这个新版本中,修复,现代化和清洁都是呈现出来的,所以更好地开始快速移动。

可以在使用PHP静态分析的代码中发现大多数特征和不兼容性,例如 exakat.。即使PHP 7.1还没准备好,也可以自动审查PHP来源以找到任何潜在的问题并获得准备。下载并在您的代码上使用它来了解更多信息。