📅  最后修改于: 2020-10-21 05:02:00             🧑  作者: Mango
PHP 7是PHP编程语言的主要版本,被吹捧为Web应用程序的开发和交付方式中的一次革命,该应用程序可用于移动到企业和云。自2004年发布PHP 5以来,此版本被视为对PHP而言最重要的更改。
PHP 7中添加了许多功能,最重要的功能在下面提到-
改进的性能-将PHPNG代码合并到PHP7中,速度是PHP 5的两倍。
更低的内存消耗-优化的PHP 7使用更少的资源。
标量类型声明-现在可以强制执行参数和返回类型。
一致的64位支持-对64位体系结构机器的一致支持。
改进的异常层次结构–改进了异常层次结构。
许多致命错误转换为异常-增加了异常范围,涵盖了许多致命异常转换为异常。
安全随机数生成器-添加了新的安全随机数生成器API。
删除了不推荐使用的SAPI和扩展-从最新版本中删除了各种旧的和不受支持的SAPI和扩展。
空合并运算符(??) -添加了新的空合并运算符。
返回和标量类型声明-支持添加返回类型和参数类型。
匿名类-添加了对匿名的支持。
零成本断言-添加了对零成本断言的支持。
PHP 7使用新的Zend Engine 3.0将应用程序性能提高了近两倍,内存消耗比PHP 5.6高出50%。它允许为更多的并发用户提供服务,而无需任何其他硬件。在设计和重构PHP 7时考虑了当今的工作负载。
根据Zend团队的说法,以下插图显示了基于流行的基于PHP的应用程序上PHP 7与PHP 5.6和HHVM 3.7的性能比较。
在执行Magento事务时,PHP 7证明自己的速度是PHP 5.6的两倍以上。
在执行Drupal事务时,PHP 7证明自己的速度是PHP 5.6的两倍以上。
在执行Wordpress事务时,PHP 7证明自己的速度是PHP 5.6的两倍以上。
在线试用
我们已经在线设置了PHP编程环境,因此您可以在线编译和执行所有可用的示例。它使您对正在阅读的内容充满信心,并可以使用不同的选项来验证程序。随意修改任何示例并在线执行。
使用CodingGround上的在线编译器尝试以下示例。
Online PHP Script Execution Hello, PHP!"; ?>对于本教程中给出的大多数示例,您将在我们的网站代码部分的右上角找到一个Try it选项,它将带您到在线编译器。因此,只需使用并享受您的学习。
为了开发和运行PHP网页,您的计算机系统上需要安装三个重要组件。
Web服务器-PHP实际上可以与所有Web服务器软件一起使用,包括Microsoft的Internet信息服务器(IIS),但最常用的是Apache服务器。在此处免费下载Apache- http://httpd.apache.org/download.cgi
数据库-PHP PHP实际上可以与所有数据库软件一起使用,包括Oracle和Sybase,但最常用的是MySQL数据库。在此处免费下载MySQL- http://www.mysql.com/downloads/
PHP解析器-为了处理PHP脚本指令,必须安装解析器以生成可发送到Web浏览器的HTML输出。本教程将指导您如何在计算机上安装PHP解析器。
在继续之前,重要的是要确保您的计算机上具有正确的环境设置,以便使用PHP开发Web程序。将以下php文件存储在Apache的htdocs文件夹中。
在浏览器的地址栏中输入以下地址。
http://127.0.0.1/phpinfo.php
如果显示的页面显示与PHP安装相关的信息,则表明您已正确安装PHP和Webserver。否则,您必须按照给定的过程在计算机上安装PHP。
本节将指导您通过以下四个平台安装和配置PHP-
如果您将Apache用作Web服务器,则本节将指导您编辑Apache配置文件。
PHP配置文件php.ini是影响PHP功能的最终直接方法。
检查这里-PHP.INI文件配置
要在Windows计算机上配置IIS,可以参考IIS附带的《 IIS参考手册》。
在PHP 7中,引入了一个新功能,即标量类型声明。标量类型声明有两个选项-
强制-强制是默认模式,无需指定。
严格-严格模式必须明确暗示。
可以使用上述模式强制执行以下类型的函数参数-
它产生以下浏览器输出-
9
它产生以下浏览器输出-
Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...
在PHP 7中,引入了一个新功能,即返回类型声明。返回类型声明指定函数应返回的值的类型。可以声明返回类型的以下类型。
它产生以下浏览器输出-
5
它产生以下浏览器输出-
Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...
在PHP 7中,引入了一个新功能,即空合并运算符(??) 。它与isset()函数一起用于替换三元运算。 Null合并运算符符如果存在且不为NULL,则返回其第一个操作数;否则,返回第一个操作数。否则返回第二个操作数。
");
// Equivalent code using ternary operator
$username = isset($_GET['username']) ? $_GET['username'] : 'not passed';
print($username);
print("
");
// Chaining ?? operation
$username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';
print($username);
?>
它产生以下浏览器输出-
not passed
not passed
not passed
在PHP 7中,引入了一项新功能,即太空飞船运算符。它用于比较两个表达式。当第一个表达式分别小于,等于或大于第二个表达式时,它将返回-1、0或1。
1);print("
");
print( 1 <=> 2);print("
");
print( 2 <=> 1);print("
");
print("
");
//float comparison
print( 1.5 <=> 1.5);print("
");
print( 1.5 <=> 2.5);print("
");
print( 2.5 <=> 1.5);print("
");
print("
");
//string comparison
print( "a" <=> "a");print("
");
print( "a" <=> "b");print("
");
print( "b" <=> "a");print("
");
?>
它产生以下浏览器输出-
0
-1
1
0
-1
1
0
-1
1
现在可以使用define()函数定义数组常量。在PHP 5.6中,只能使用const关键字定义它们。
它产生以下浏览器输出-
cat
现在可以使用新类定义匿名类。可以使用匿名类代替完整的类定义。
logger;
}
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
print($msg);
}
});
$app->getLogger()->log("My first Log Message");
?>
它产生以下浏览器输出-
My first Log Message
添加Closure :: call()方法是一种将对象范围临时绑定到闭包并调用它的简便方法。与PHP 5.6的bindTo相比,它的性能要快得多。
x;
};
// Bind a clousure
$value = $getValue->bindTo(new A, 'A');
print($value());
?>
它产生以下浏览器输出-
1
x;
};
print($value->call(new A));
?>
它产生以下浏览器输出-
1
PHP 7引入了Filtered unserialize()函数,以便在对不受信任的数据上的对象进行反序列化时提供更好的安全性。它可以防止可能的代码注入,并使开发人员可以将可以反序列化的类列入白名单。
obj1prop = 1;
$obj2 = new MyClass2();
$obj2->obj2prop = 2;
$serializedObj1 = serialize($obj1);
$serializedObj2 = serialize($obj2);
// default behaviour that accepts all classes
// second argument can be ommited.
// if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
$data = unserialize($serializedObj1 , ["allowed_classes" => true]);
// converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);
print($data->obj1prop);
print("
");
print($data2->obj2prop);
?>
它产生以下浏览器输出-
1
2
在PHP7中,添加了一个新的IntlChar类,该类试图公开其他ICU功能。此类定义了许多静态方法和常量,可用于操作unicode字符。使用此类之前,您需要安装Intl扩展。
它产生以下浏览器输出-
10ffff
COMMERCIAL AT
true
在PHP 7中,引入了以下两个新功能,以跨平台的方式生成加密安全的整数和字符串。
random_bytes() -生成加密安全的伪随机字节。
random_int() -生成加密安全的伪随机整数。
random_bytes()生成适合加密用途的任意长度的加密随机字节字符串,例如在生成盐,密钥或初始化向量时。
string random_bytes ( int $length )
length-应该以字节为单位返回的随机字符串的长度。
返回一个字符串,其中包含请求数量的加密安全随机字节。
如果找不到合适的随机性来源,将引发异常。
如果给出了无效的参数,将抛出TypeError 。
如果给出了无效的字节长度,则将引发错误。
它产生以下浏览器输出-
54cc305593
random_int()生成适用于无偏结果至关重要的加密随机整数。
int random_int ( int $min , int $max )
min-要返回的最小值,必须为PHP_INT_MIN或更高。
max-要返回的最大值,必须小于或等于PHP_INT_MAX 。
返回最小到最大(包括端值)范围内的加密安全随机整数。
如果无法找到随机性的适当源,将引发异常。
如果给出了无效的参数,将抛出TypeError 。
如果max小于min,则将引发错误。
它产生以下浏览器输出-
614
-882
期望是对较早的assert()函数的向后兼容增强。期望允许在生产代码中使用零成本的断言,并提供断言失败时引发自定义异常的功能。 assert()现在是一种语言构造,其中第一个参数是与要测试的字符串或布尔值相比的表达式。
Directive | Default value | Possible values |
---|---|---|
zend.assertions | 1 |
1 − generate and execute code (development mode) 0 − generate code but jump around it at runtime -1 − do not generate code (production mode) |
assert.exception | 0 |
1 − throw, when the assertion fails, either by throwing the object provided as the exception or by throwing a new AssertionError object if exception was not provided. 0 − use or generate a Throwable as described above, but only generates a warning based on that object rather than throwing it (compatible with PHP 5 behaviour) |
断言-断言。在PHP 5中,它必须是要评估的字符串或要测试的布尔值。在PHP 7中,这也可以是任何返回值的表达式,该表达式将被执行,并且结果用于指示断言是成功还是失败。
description-断言失败时将包含在失败消息中的可选描述。
exception-在PHP 7中,第二个参数可以是Throwable对象,而不是描述性字符串,在这种情况下,如果断言失败并且启用了assert.exception配置指令,则这是将要抛出的对象。
FALSE如果断言是假的,否则返回true。
它产生以下浏览器输出-
Fatal error: Uncaught CustomError: Custom Error Message! in...
从PHP7开始,可以使用单个use语句从同一名称空间导入类,函数和常量,而不必使用多个use语句。
从PHP 7开始,错误处理和报告已更改。现在,大多数错误不是通过PHP 5使用的传统错误报告机制来报告错误,而是通过引发Error异常来处理。与异常相似,这些错误异常会冒泡直到到达第一个匹配的catch块。如果没有匹配的块,则将调用安装有set_exception_handler()的默认异常处理程序。如果没有默认的异常处理程序,则该异常将转换为致命错误,并将像传统错误一样进行处理。
由于Error层次结构不是从Exception扩展的,因此在PHP 5中使用catch(Exception $ e){…}块来处理未捕获的异常的代码将无法处理此类错误。需要使用catch(Error $ e){…}块或set_exception_handler()处理函数来处理致命错误。
n % 0;
return $value;
} catch (DivisionByZeroError $e) {
return $e->getMessage();
}
}
}
$mathOperationsObj = new MathOperations();
print($mathOperationsObj->doOperation());
?>
它产生以下浏览器输出-
Modulo by zero
PHP 7引入了一个新函数intdiv() ,该函数对其操作数执行整数除法并将该除法返回为int。
它产生以下浏览器输出-
int(3)
3
从PHP7 +起, session_start()函数接受一系列选项来覆盖php.ini中设置的会话配置指令。这些选项支持session.lazy_write ,默认情况下为session.lazy_write ,如果会话数据已更改,则会导致PHP覆盖任何会话文件。
添加的另一个选项是read_and_close ,它指示应读取会话数据,然后应立即以不变的方式关闭会话。例如,使用以下代码片段,将session.cache_limiter设置为private并将标志设置为在读取会话后立即关闭该会话。
'private',
'read_and_close' => true,
]);
?>
不推荐使用以下功能,并且可以从以后的PHP版本中删除这些功能。
PHP 4样式的构造函数是与定义它们的类同名的方法,现在已弃用,并且将来会删除。如果PHP 4构造函数是类中唯一定义的构造函数,则PHP 7将发出E_DEPRECATED。实现__construct()方法的类不受影响。
它产生以下浏览器输出-
Deprecated: Methods with the same name as their class will not be constructors
in a future version of PHP; A has a deprecated constructor in...
不推荐使用对非静态方法的静态调用,将来可能会删除它。
它产生以下浏览器输出-
Deprecated: Non-static method A::b() should not be called statically in...
Non-static call
password_hash()函数的salt选项已被弃用,以使开发人员不会生成自己的(通常是不安全的)盐。当开发人员不提供盐时,该函数本身会生成密码安全的盐-因此不再需要自定义盐生成。
capture_session_meta SSL上下文选项已被弃用。 SSL元数据现在通过stream_get_meta_data()函数。
以下扩展已从PHP 7开始删除-
以下SAPI已从PHP 7开始删除-