现代PHP语言令人兴奋的新特性

写太久股票了,写点和编程有关的东西。

最近准备重构一些老项目,PHP写的,听说PHP最近的新版里面加了不少新特性,整理了放这。

一、命名空间

5.3.0引入,使用虚拟层次组织PHP代码,为以后基于PSR的代码体系奠定了基础。命名空间的引入让类名冲突变的不太可能,并且让分布式的组件式开发变的方便起来。

// 为一个文件设置命名空间
namespace Symfony\Component\HttpFoundation;

// 为一个文件使用或引入另一个命名空间
use Symfony\Component\HttpFoundation\Response;

二、性状

5.4.0引入,关键字trait,性状这个翻译是抄的一本书上的。性状是类的部分实现,可以混入一个或多个PHP类里。

比如Web开发里常常需要验证表单提交过来的参数是否符合要求,或者更抽象,验证一个数组内的内容是否符合另一个数组定义的对应要求,比如长度,是否为数字,是否为空等。

之前的做法是在做表单验证的Model类里写一个通用的父类,然后让所有业务Model去继承这个父类,在父类里写通用的验证提交参数的方法。但这样的话,这个验证的方法只能在Model内使用。

如果想在Model以外的地方去验证某一个数组的内容是否符合要求该如何?可以使用trait来代替通用类的写法。
在一个trait里单独实现和验证相关的内容,然后在任意需要验证的类中引用trait即可。

<?php
trait TraitDemo {
    // Trait的实现
}

class ClassDemo {
    use TraitDemo;
    // Class的实现
}

三、生成器

5.5.0引入,generator在其他语言里经常能看到。生成器会根据需要计算并产出需要迭代的值。例如一个数组遍历,通常的方法会把整个数组放入内存里,然后依次读取处理。

而生成器不同,他并不将数组整个读进内存,而是每次只读取一条,把下次要处理的值生产出来,再循环的时候拿到上次生产的值进行处理,再生产下一次要处理的值。

<?php
function generatorDemo(){
    yield 1;
    yield 2;
    yield 3;
}

foreach(generatorDemo() as $item){
    echo $item, PHP_EOL;
}

// 输出
// 1
// 2
// 3

四、闭包

5.3.0时引入,闭包在创建的时候会封装其周围的运行状态,即使周围环境改变了,闭包内的状态依然可以保持。PHP里闭包也被称为匿名函数,虽然其他语言里,这两个是不同的东西。

闭包既可以作为函数被调用,被传入参数,也可以本身作为参数被传入其他函数。前面生成器每次迭代返回的都是Generator对象,闭包则是Closure类的对象,他们看起来是函数,其实都是对象。

<?php
$closure = function($demo){
    return 'hello ' . $demo;
}
echo $closure('world');
// 输出 hello world

$name = 'Heitaosu';
$closure2 = function($demo) use ($name) {
    return $demo . ' ' . $name;
};
$closure2('Hey,');
// 输出 Hey, Heitaosu

五、内置服务器

以前在玩RoR的时候,老是感叹,要是PHP啥时候也有这么方便的内置服务器就好了,现在也有了。5.4.0引入。

// 只允许本地使用4000端口访问
php -S localhost:4000
// 允许公开使用4000端口访问,一般是局域网,除非绑定了公网IP
php -S 0.0.0.0:4000
// 允许本地使用8000端口并指定php.ini配置文件
php -S localhost:8000 -c /path/to/php.ini

标签: php, 开发, 编程

添加新评论