PHP版本迭代更新特性(持续更新)

PHP 7 新特性

  • 类型声明
  • 命名空间批量声明
  • 匿名类
  • 老式构造方法废弃
  • Throwable接口
  • 新的操作符
  • 常量数组
  • switch不再支持多个默认值
  • session_start函数调整
  • unserialize引入过滤器

类型生声明

函数入参和出参支持声明类型:

declare(strict_types=1); // 严格限制入参类型

function test(int $num) : int 
{
    return $num * $num;
}

print_r(test('2'));

命名空间批量声明

同一命名空间下的类、方法、常量可以合并引入(非混合模式、混合模式、复合模式),以复合模式为例:

use Publishers\{
    Paper\Book,
    Electronic\Ebook,
    Media\Video,
    Media\Audio
}

匿名类

与正常类相似,可以继承父类、实现接口,区别在于没有类名。主要用于快速实现小块的功能单元:

class Math
{
    public $first_number = 10;
    public $second_number = 20;

    public function add() : float
    {
        return $this->first_number + $this->second_number;
    }

    public function multiply_num()
    {
        return new class() extends Math
        {
            public function multiply(float $third_number) : float
            {
                return $this->add() * $third_number;
            }
        };
    }
}

$math = new Math();
print_r($math->multiply_num()->multiply(2));  

老式构造方法废弃

使用与类名同名的函数作为构造函数这种方式不推荐使用,将会在未来版本中移除。

Throwable接口

异常(Exception)和绝大部分错误(Fatal)都能通过 try/catch 的方式予以捕获并处理(继承自 Throwable 接口):

<?php
try {
    $a = 20;
    $division = $a / 0;
} catch (DivisionByZeroError $e) {
    echo $e->getMessage();
}

新操作符

  1. <=> 用于对参数进行比较: 两边相等返回0,左边小于右边返回-1,左边大于右边返回1
  2. ?? 三元运算符的优化,以前需要这么写: $title = isset($_POST[『title』]) ? $_POST[『title』] : NULL; 现在可以这么写: $title = $_POST[『title』] ?? NULL;
  3. 统一变量语法 为了解决 $$first[『name』] 这种写法容易造成语法混淆,引入统一变量语法,这种写法需要改为: ${$first[『name』]} 即将优先执行的部分用花括号括起来,否则会报错,并且得到不确定的输出。

常量数组

define('STORES', ['en', 'fr', 'ar']);

switch不再支持多个默认值

switch(true)
{
    default:
        echo '1';
        break;
    default:
        echo '2';    
}

以上代码在 PHP 7 中会报错: Fatal error: Switch statements may only contain one default …

session_start函数调整

支持传递配置参数以覆盖 php.ini 中的默认配置。

unserialize引入过滤器

为了安全起见,在该函数中引入过滤器,以限定可以反序列化的对象。

PHP 7.4 转自 PHP7.4新特性预览

  • 短闭包 RFC
  • 属性类型定义 RFC
  • Null Coalescing Assignment Operator RFC
  • 自定义对象序列化 RFC
  • 弃用左关联三元运算符 RFC
  • 预加载 RFC
  • 外部函数接口 RFC
  • Reflection for references RFC
  • mb_str_split RFC
  • ext-hash 始终开启RFC

短闭包

引用更简单的闭包写法,在原来的基础加上fn关键字,采用了类型javascript =>写法。

<?php
// 7.3之前
array_map(function (User $user) { 
    return $user->id; 
}, $users)
// 现在
array_map(fn(User $user) => $user->id, $users)

关于短封闭的一些注意事项:

  • 可以直接访问父作用域,不需要使用use关键字
  • $this像普通的闭包一样可用
  • 短闭包只能包含一行,也就是return语句

属性类型定义

可以指定类属性的类型定义,更加的明确类型。

<?php

class A
{
    public string $name;

    public Foo $foo;

    protected ClassName $classType;

    private ?ClassName $nullableClassType;

     // Types are also legal on static properties
    public static iterable $staticProp;


}

关于属性类型定义更详细的说明请参考此处

Null Coalescing Assignment Operator

更短的??操作符写法。

<?php
// 7.4之前
$data['date'] = $data['date'] ?? new DateTime();

// 现在
$data['date'] ??= new DateTime();

弃用左关联三元运算符

与大多数其他语言不同,PHP中的三元运算符是左关联的而不是右关联的。对于在不同语言之间切换的程序员来说,左关联行为通常没有用,并且令人困惑。此RFC建议弃用并删除三元运算符的左关联性,并且需要显式使用括号。

<?php

echo 1 ? 2 : 3 ? 4 : 5;   // deprecated 7.4, 7.3 之前这是ok的。
echo (1 ? 2 : 3) ? 4 : 5; // ok 

自定义对象序列化

添加两个新的序列化魔术方法__serialize,__unserialize主要来解决__wakeupSerializable带来一些问题。可以通过https://wiki.php.net/rfc/custom_object_serialization来查看对比。

预加载

预加载是PHP这期核心的变更,可以带来一些重大的性能改进。

简而言之,如果您使用的所有PHP Web框架,则必须在每次请求时加载和重新编译其文件。预加载允许服务器在启动时在内存中加载PHP文件,并使它们永久可用于所有后续请求。

性能提升当然需要付出代价,如果预加载文件的来源发生变化,则必须重新启动服务器。

外部函数接口

外部函数接口,简称FFI,此API允许在纯PHP中加载共享库(.DLL或.so),调用C函数和访问C数据结构,而无需深入了解Zend扩展API,也无需学习第三种“中间”语言。对于PHP,FFI开辟了一种在纯PHP中编写PHP扩展和绑定到C库的方法。。 这是一个复杂的主题。您仍然需要C知识才能正确使用此功能。大家可以阅读该项目来了解https://github.com/dstogov/php-ffi

Reflection for references

SymfonyvarCloner转储程序,这样的库很大程度上依赖于反射API来可靠地转储变量。以前,没有对引用的适当反射支持,导致这些库依赖hack来检测引用。 PHP 7.4添加了ReflectionReference类来解决这个问题。

mb_str_split

添加了多字节的字符串分割函数和str_split一样。

<?php
print_r(mb_str_split("你好中国", 2));

Array
(
    [0] => 你好
    [1] => 中国
)

ext-hash 默认开启

哈希扩展(ext / hash)始终可用,类似于datesplpcre扩展。

PHPer成长之路

一、常见模式与框架

学习PHP技术体系,设计模式,流行框架

  • 常见的设计模式,编码必备
  • Laravel、ThinkPHP开发必不可少的最新框架
  • YII、Symfony4核心源码剖析

二、微服务架构与性能优化

业务体系越来越复杂,Swoole协程编程、PHP并发编程、MySQL底层优化是架构升级的必经之路,PHP性能优化和微服务相关的技术有哪些呢?

  • Tars分布式RPC框架
  • Swoft微服务框架
  • 服务器性能优化
  • 算法与数据结构

三、工程化与网站架构

任何脱离细节的PPT架构师都是耍流氓,向上能运筹帷幄,向下能解决一线开发问题,PHP架构师需深入工程化、高并发、高可用,海量数据,如果没有分布式的架构知识肯定是玩不转的:

  • Linux操作/shell脚本编程
  • docker容器/自动化部署
  • 分布式缓存/消息中间件
  • 分布式架构原理/高并发分流

亚马逊免费服务器搭建wordpress博客

1. 申请免费amazon服务器

使用邮箱注册amazon账号,绑定一张有效的信用卡(会扣$1),开启aws服务需要通过验证手机验证(语音或短信验证码),完成之后正常会收到开启成功的邮件。这时候就可以申请一个免费的服务器。

2.设置服务器密码登录

  • 1)使用密钥对文件(.pem)登陆服务器
  • ssh ubuntu@your-server-address -i ~/.ssh/zizizi.pem
  • sudo passwd root , 按提示输入密码:
  • Enter new UNIX password:
  • Retype new UNIX password:
  • passwd: password updated successfully
  • 2)更新 /etc/ssh/sshd_config 文件中的两个参数(值改为yes):
  • PasswordAuthentication yes
  • PermitRootLogin yes
  • 重启服务 sudo service ssh restart
  • 3)退出服务器,重新用密码登陆:
  • ssh root@your-server-address
  • root@your-server-address's password:
  • 输入密码后,enter键登入服务器

3.搭建lamp环境

  • 1)安装nginx
  • sudo apt-get install nginx
  • 安装成功后浏览器输入服务器地址,如果出现“Welcome to nginx!”页面,即安装成功,否则登录服务器控制台,设置安全组添加入站HTTP 80 端口
  • 2)安装php和常用php扩展
  • sudo apt-get install php
  • sudo apt-get install php-fpm php-gd php-mbstring php-curl php-xml php-mysql php-zip php-json php-redis php-memcached
  • 3)解决php7.2无法直接安装php-mcrypt的问题
  • sudo apt install php-dev libmcrypt-dev php-pear
  • sudo pecl channel-update pecl.php.net
  • sudo pecl install mcrypt-1.0.1
  • 成功安装php-mcrypt扩展后,编辑php.ini启动扩展:
  • 添加extension=mcrypt.so 到php.ini
  • 注:/etc/php/7.2/cli/php.ini为终端环境;/etc/php/7.2/apache2/php.ini为apache服务器;/etc/php/7.2/fpm/php.ini为nginx服务器

4.建立测试站点(以安装phpmyadmin为例)

  • sudo apt-get install phpmyadmin
  • sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin
  • 建立nginx配置文件并重启nginx服务
  server {
        listen  500;
        server_name localhost;
        set $root_path '/var/www/html/phpmyadmin/';
        root $root_path;

        index index.php index.html index.htm;

        try_files $uri $uri/ @rewrite;

        location @rewrite {
            rewrite ^/(.*)$ /index.php?_url=/$1;
        }

        location ~ \.php {
             include snippets/fastcgi-php.conf;
             # With php-fpm (or other unix sockets):
             fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
         #   fastcgi_pass 127.0.0.1:9000;
         #   fastcgi_index /index.php;

            fastcgi_split_path_info       ^(.+\.php)(/.+)$;
            fastcgi_param PATH_INFO       $fastcgi_path_info;
            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include                       fastcgi_params;
        }

        location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
            root $root_path;
        }

        location ~ /\.ht {
            deny all;
        }
    }
  • 访问服务器500端口,进入phpmyadmin登陆界面即配置成功。

4.无缝迁移wordpress博客

  • 上传网站文件到新主机的网站目录并解压。
  • 在新服务器创建一个同名数据库,并导入上面的网站数据库 sql 文件。
  • wp-option表字段option_name为siteurl和home对应的option_value对应修改为http://your-server-address