<h2>类型声明</h2>
<p>看代码,一目了然了。</p>
<pre class="brush:php;toolbar:false">class person
{
public function age(int $age) : string
{
return 'Age is ' . $age;
}
}</pre>
<h2>命名空间与use关键字批量声明</h2>
<p>非混合模式</p>
<pre class="brush:php;toolbar:false">use Publishers\Packt\{ Book, Ebook, Video};
use function Publishers\Packt\{ getBook, saveBook };
use const Publishers\Packt\{ COUNT, KEY };</pre>
<p>混合模式</p>
<pre class="brush:php;toolbar:false">use Publishers\Packt\{
Book,
Ebook,
Video,
function getBook,
function saveBook,
const COUNT,
const KEY
};</pre>
<p>复合模式</p>
<pre class="brush:php;toolbar:false">use Publishers\Packt\{
Paper\Book,
Electronic\Ebook,
Media\Video
};</pre>
<h2>匿名类</h2>
<p>匿名类的声明与使用时同时进行的,具备其他类所具备的所以功能,区别在于匿名类没有类名。语法如下:</p>
<pre class="brush:php;toolbar:false">new class(argument) { definition };</pre>
<p><em>匿名类是没有类名的,但在PHP内部,会在内存的引用地址表中为其分配一个全局唯一的名称。</em></p>
<pre class="brush:php;toolbar:false">$name = new class('You') {
public function __construct($name)
{
echo $name;
}
};</pre>
<p>匿名类可以继承父类及父类的方法。</p>
<pre class="brush:php;toolbar:false">class Packt
{
protected $number;
public function __construct()
{
echo 'parent construct';
}
public function getNumber() : float
{
return $this->number;
}
}
$number = new class(5) extends Packt
{
public function __construct(float $number)
{
parent::__construct();
$this->number = $number;
}
};
echo $number->getNumber();</pre>
<p>匿名类可以继承接口。</p>
<pre class="brush:php;toolbar:false">interface Publishers
{
public function __construct(string name, string address);
public function getName();
public function getAddress();
}
class packt
{
protected $number;
protected $name;
protected $address;
public function ...
}
$info = new class('name', 'address') extends Packt implement Publishers
{
public function __construct(string $name, string $address)
{
$this->name = $name;
$this->address = $address;
}
public function getName() : string
{
return $this->name;
}
public function getAddress() : string
{
return $this->address;
}
}
echo $info->getName() . ' ' . $info->getAddress();</pre>
<p>匿名类可以嵌套在一个类中使用。</p>
<pre class="brush:php;toolbar:false">class Math
{
public $first_number = 10;
public $second_number = 10;
public function add() : float
{
return $this->first_number + $this->second_number;
}
public function mutiply_sum()
{
return new class() extends Math
{
public function mutiply(float $third_number) : float
{
return $this->add() * $third_number;
}
};
}
}
$math = new Math();
echo $math->mutiply_sum()->mutiply(2);</pre>
<h2>摒弃老式构造函数</h2>
<p>从PHP4开始,构造函数可以通过命名与类名一致的方式来声明自己是构造函数,在PHP7中这种方式声明构造函数依然可以使用,但不推荐使用,会输出不推荐的信息 <code>Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Packt has a deprecated constructor in ...</code>,PHP7中推荐使用 <code>__construct()</code>。</p>
<h2>throwable接口</h2>
<p>从PHP7开始,程序中的fatal错误都可以被截获,PHP7提供了throwable接口,异常与错误都继承于这个接口。</p>
<h2>Error</h2>
<p>现在大多数的fatal错误情况会抛出一个error实例,类似于截获异常,error实例可以被try/catch截获。</p>
<pre class="brush:php;toolbar:false">try
{
...
} catch(Error $e)
{
echo $e->getMessage();
}</pre>
<p><em>一些错误情况只有error的子实例会被抛出,例如 TypeError、DivisionByZeroError、ParseError等。</em></p>
<h2><=>操作符</h2>
<p><code><=></code>操作符将<code>==</code>、<code><</code>、<code>></code>三个比较操作符打包在了一起,具体使用规则如下。</p>
<blockquote><p>操作符两边相等时返回 0<br>操作符左边小于右边时返回 -1<br>操作符左边大于右边时返回 1</p></blockquote>
<h2>null合并运算符</h2>
<p><code>??</code> 合并运算符,在第一操作数存在时可被直接返回,否则返回第二操作数。</p>
<pre class="brush:php;toolbar:false">$title = $post['title'] ?? NULL;
$title = $post['title'] ?? $get['title'] ?? 'No title';</pre>
<h2>uniform变量语法</h2>
<pre class="brush:php;toolbar:false">$first = ['name' => 'second'];
$second = 'two';
echo $$first['name'];
echo ${Sfirst['name']}; // PHP7
...
echo $object->$methods['title'];
echo $object->{$methods['title']}; // PHP7</pre>
<p>主要是因为PHP7与之前版本PHP的解析方式不一样,在PHP7中加上花括号就可以啦,就像上边代码这样,否则会报错。</p>
<h2>常量数组</h2>
<p>从PHP5.6开始常量数组可以用<code>const</code>关键字来声明,在PHP7中常量数组可以通过<code>define</code>函数来初始化。</p>
<pre class="brush:php;toolbar:false">const STORES = ['en', 'fr', 'ar']; // php5.6
define('STORES', ['en', 'fr', 'ar']); // php7</pre>
<h2>switch中的default默认值</h2>
<p>在PHP7之前,switch语句中允许多个default默认值,从PHP7开始,只能有一个default默认值,否则会产生fatal级别错误。</p>
<pre class="brush:php;toolbar:false">// php7之前
switch (true) {
case 'value':
# code...
break;
default:
# code...
break;
default:
# code...
break;
}
// php7
switch (true) {
case 'value':
# code...
break;
default:
# code...
break;
}</pre>
<h2>session_start函数中的选项数组</h2>
<p>在PHP7之前,使用session的时候都必须先调用session_start()函数,且这个函数并没有参数需要传递,所有session相关的配置都在php.ini文件中,从PHP7开始,可以在调用这个函数时传递参数选项数组,这些设置信息将覆盖php.ini中的session配置。</p>
<pre class="brush:php;toolbar:false">session_start([
'cookie_lifetime' => 3600,
'read_and_close' => true
]);</pre>
<h2>unserialize函数引入过滤器</h2>
<p>unserialize()可以反序列化任何类型的对象,没有任何过滤项,不安全,PHP7在unserialize()中引入了过滤器,且默认允许反序列化所有类型的对象。</p>
<pre class="brush:php;toolbar:false">$result = unserialize($object, ['allowed_classes' => ['Book', 'Ebook']]);</pre>
以上是PHP7中有哪些特性的详细内容。更多信息请关注PHP中文网其他相关文章!