PHP7.1-PHP7.4 新特征

自定义方法声明传入参数类型

function ace(int $abc,string $bc){
	//return ['abc'=>$abc,'bc'=>$bc];
}

var_dump(ace('123','qwe'));

自定义方法声明返回值类型

function ace(int $abc,string $bc):array{
	return ['abc'=>$abc,'bc'=>$bc];
}

var_dump(ace('123','qwe'));

NULL合并运算符

$a = '123';

$a = $a ?? 'abc'; // isset($a) ? $a : 'abc';

echo $a; //return 123

-------------------------------------------------------
$a = '123';

$a = $a ?: 'abc'; // $a ? $a : 'abc';

echo $a;

组合比较符

echo 1 <=> 1; // 0
echo '<br>';
echo 1 <=> 2; // -1
echo '<br>';
echo 2 <=> 1; // 1

定义常量数组

define('ABC',['999','888','777']);

echo ABC[1]; //888

绑定方法并闭包试用

class ABC
{
    private $a = 1;
    protected $b = 2;
}


// PHP 7 之前版本的代码

$getABC = function() {return $this->a;};

$getA = $getABC->bindTo(new ABC, 'ABC'); // 中间层闭包

echo $getA();

echo '<br>';

// PHP 7+ 版本的代码

$getABC = function() {return $this->b;};

echo $getABC->call(new ABC);

序列化过滤参数

class MyClass1 {
    public $obj1prop;
}
class MyClass2 {
    public $obj2prop;
}


$obj1 = new MyClass1();
$obj1->obj1prop = 1;
$obj2 = new MyClass2();
$obj2->obj2prop = 2;

$serializedObj1 = serialize($obj1);
$serializedObj2 = serialize($obj2);

// 默认行为是接收所有类
// 第二个参数可以忽略
// 如果 allowed_classes 设置为 false, unserialize 会将所有对象转换为 __PHP_Incomplete_Class 对象
$data = unserialize($serializedObj1 , ["allowed_classes" => false]);

// 转换所有对象到 __PHP_Incomplete_Class 对象,只允许 MyClass1 和 MyClass2 转换到 __PHP_Incomplete_Class
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

print($data->obj1prop);
print(PHP_EOL);
print($data2->obj2prop);

IntlChar
新的 IntlChar 类暴露出 ICU 中的 Unicode 字符特性。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符(若要使用此类,请先安装Intl扩展)

printf('%x', IntlChar::CODEPOINT_MAX);  //10ffff
echo IntlChar::charName('@');  //COMMERCIAL AT
var_dump(IntlChar::ispunct('!'));  //bool(true)

生成随机数

//加密生存被保护的伪随机字符串
//string random_bytes ( int $length )
var_dump(random_bytes(5));

//加密生存被保护的伪随机整数
//int random_int ( int $min , int $max )
var_dump(random_int(10,100));

Group use declarations
从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入

// PHP 7 之前的代码
use some\namespace\ClassA;

use some\namespace\ClassB;

use some\namespace\ClassC as C;

use function some\namespace\fn_a;

use function some\namespace\fn_b;

use function some\namespace\fn_c;

use const some\namespace\ConstA;

use const some\namespace\ConstB;

use const some\namespace\ConstC;

// PHP 7+ 版本的代码
use some\namespace\{ClassA, ClassB, ClassC as C};

use function some\namespace\{fn_a, fn_b, fn_c};

use const some\namespace\{ConstA, ConstB, ConstC};

PHP7异常断言

$s = 123;
//断言(assert)在程序中的某个特定点该的表达式值为真。如果该表达式为假,就中断操作
assert(is_int($s));

//-----------------------------------------------------------------------------------------------------

//zend.assertions
//参数说明
//1 - 生成和执行代码 (开发模式)(默认)
//0 - 生成代码,但在执行时跳过它
//-1 - 不生成代码 (生产环境)

//assert.exception
//参数说明
//1 - 断言失败时抛出,可以抛出异常对象,如果没有提供异常,则抛出 AssertionError 对象实例。
//0 - 使用或生成 Throwable, 仅仅是基于对象生成的警告而不是抛出对象(与 PHP 5 兼容)

ini_set('zend.assertions', 0);

//跳过执行ture == false 不产生错误信息
assert(true == false);
echo 'Hi!';

//return Hi!

//-----------------------------------------------------------------------------------------------------

ini_set('zend.assertions', 1);
ini_set('assert.exception', 1);

assert(true == false);
echo 'Hi!';

//return  Fatal error: Uncaught AssertionError: assert(true == false) in D:\phpstudy_pro\WWW\index.php:27 Stack trace: #0 D:\phpstudy_pro\WWW\index.php(27): assert(false, 'assert(true == ...') #1 {main} thrown in D:\phpstudy_pro\WWW\index.php on line 27

错误处理

class MathOperations 
{
   protected $n = 10;

   // 求余数运算,除数为 0,抛出异常
   public function doOperation(): string  //声明返回值为字符串,但最终返回值是数字类型
   {
      try {
         $value = $this->n % 0;
         return $value;
      } catch (DivisionByZeroError $e) {
         return $e->getMessage();  //Modulo by zero
      }
   }
}

$mathOperationsObj = new MathOperations();
print($mathOperationsObj->doOperation());

intdiv()
PHP 7 新增加了 intdiv() 函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整

echo intdiv(9,3),PHP_EOL; // 3
echo intdiv(10,3),PHP_EOL;  // 3
echo intdiv(5,10),PHP_EOL;  // 0

Session
session_start() 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session 的配置项

session_start([
   'cache_limiter' => 'private', //在读取完毕会话数据之后马上关闭会话存储文件
    'cookie_lifetime'=>3600,   //SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废
    'read_and_close'=>true   //在读取完会话数据之后, 立即关闭会话存储文件,不做任何修改
]);
$_SESSION['name']='quan';
echo $_SESSION['name'];

PHP7废弃特性

  1. PHP4 风格的构造函数
    在 PHP4 中类中的函数可以与类名同名,这一特性在 PHP7 中被废弃,同时会发出一个 E_DEPRECATED 错误。当方法名与类名相同,且类不在命名空间中,同时PHP5的构造函数(__construct)不存在时,会产生一个 E_DEPRECATED 错误
class A {
   function A() {
      print('Style Constructor');
   }
}
//return 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...
  1. 以静态的方式调用非静态方法
    以静态的方式调用非静态方法,不再支持
class A {
   function b() {
      print('Non-static call');
   }
}
A::b();

//return Deprecated: Non-static method A::b() should not be called statically in...
Non-static call
  1. password_hash() 随机因子选项
    函数原 salt 量不再需要由开发者提供了。函数内部默认带有 salt 能力,无需开发者提供 salt 值

  2. capture_session_meta SSL 上下文选项
    废弃了 “capture_session_meta” SSL 上下文选项。 在流资源上活动的加密相关的元数据可以通过 stream_get_meta_data() 的返回值访问

PHP7移除的扩展

  • ereg
  • mssql
  • mysql
  • sybase_ct

PHP7移除的SAPI

  • aolserver
  • apache
  • apache_hooks
  • apache2filter
  • caudium
  • continuity
  • isapi
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • tux
  • webjames
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译 ./configure --prefix=/usr/local/php --exec-prefix=/usr/local/php --bindir=/usr/local/php/bin --sbindir=/usr/local/php/sbin --includedir=/usr/local/php/include --libdir=/usr/local/php/lib/php --mandir=/usr/local/php/php/man --with-config-file-path=/usr/local/php/etc --with-mysql-sock=/var/run/mysql/mysql.sock --with-mcrypt=/usr /i nclude --with-mhash --with-openssl --with-mysql=shared,mysqlnd --with-mysqli=shared,mysqlnd --with-pdo-mysql=shared,mysqlnd --with-gd --with-iconv --with-zlib --enable-zip --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-mbregex --enable-mbstring --enable-ftp --enable-gd-native-ttf --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-jpeg-dir --with-freetype-dir --enable-opcache --enable-fpm --enable-fastcgi --with-fpm-user=www --with-fpm-group=www --without-gdbm --with-mcrypt=/usr/local/apps/libmcrypt --disable-fileinfo 报错:1, **configure: error: system libzip must be upgraded to version >=**0.11。 使用Yum最版只到0.10,不足以达到要求。 一、先删除libzip yum remove libzip -y SSH执行以上命令,先删除libzip 和 libzip-devel 二、下载安装并手动编译 wget https://nih.at/libzip/libzip-1.2.0.tar.gz tar -zxvf libzip-1.2.0.tar.gz cd libzip-1.2.0 ./configure make && make install 三、(可忽略)另外最版本请参考官网:https://nih.at/libzip/ 1.5.0的libzip需要cmake wget https://libzip.org/download/libzip-1.5.0.tar.gz tar -zxvf libzip-* cd libzip* mkdir build && cd build && cmake .. && make && make install 报错2: error: off_t undefined; check your library configuration 根据报错信息分析 configure: error: off_t undefined; check your library configuration 未定义的类型 off_t。 off_t 类型是在 头文件 unistd.h中定义的,在32位系统 编程成 long int ,64位系统则编译成 long long int ,这里题主的系统应该是 64位的吧,在进行编译的时候 是默认查找64位的动态链接库,但是默认情况下 centos 的动态链接库配置文件/etc/ld.so.conf里并没有加入搜索路径,这个时候需要将 /usr/local/lib64 /usr/lib64 这些针对64位的库文件路径加进去。 采用下面的方法。 添加搜索路径到配置文件 echo '/usr/local/lib64 /usr/local/lib /usr/lib /usr/lib64'>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值