关于php:PHP58各版本特性详解

5次阅读

共计 7827 个字符,预计需要花费 20 分钟才能阅读完成。

汇总

PHP5.1:

  • autoload
  • PDO
  • MySQLi
  • 类型束缚

PHP5.2:

  • JSON 反对

PHP5.3:

  • 命名空间
  • 匿名函数
  • 闭包
  • 新增魔术办法 __callStatic()__invoke()
  • 新增魔术变量__DIR__
  • 动静调用静态方法
  • 提早动态绑定
  • Heredoc 和 Nowdoc
  • 类外应用 const 定义常量
  • 三元运算符
  • Phar

PHP5.4:

  • Short Open Tag
  • 数组简写
  • Traits,
  • 内置 Web 服务器
  • 动静拜访静态方法
  • 实例化时拜访类成员

PHP5.5:

  • yield
  • list 用于 foreach
  • 细节批改

PHP5.6:

  • 常量加强
  • 命名空间加强
  • 可变函数参数

PHP7.0:

  • 标量类型申明
  • 返回值类型申明
  • defined 定义常量数组
  • 匿名类
  • null 合并运算符

PHP7.1:

  • 可为空类型
  • void 类型
  • 多异样捕捉

PHP7.2:

  • 新的对象 object
  • 容许重写形象办法

PHP7.3:语法层面没有很大的扭转

PHP7.4:

  • 类型属性
  • 箭头函数
  • Null 合并运算符反对办法
  • Opcache 预加载

PHP8.0:

  • JIT 即时编译
  • 命名参数
  • 注解
  • 联结类型
  • Match 表达式
  • Nullsafe 运算符
  • 结构器属性晋升

PHP5.1

__autoload()魔术办法

这是一个主动加载函数,在 PHP5 中,当咱们实例化一个未定义的类时,就会触发此函数。能够通过定义这个函数来启用类的主动加载。

function  __autoload($className) {$filePath =“project/class/{$className}.php”;  
    if (is_readable($filePath)) {require($filePath);  // 这里能够只用 require,因为一旦蕴含进来后,php 引擎再遇到类 A 时,将不会调用__autoload,而是间接应用内存中的类 A,不会导致屡次蕴含。}  
}  
$a = new A();  
$b = new B();  
$c = new C(); 

PHP 中__autoload()魔术办法详解

PDO

PHP 数据对象(PDO)扩大为 PHP 拜访数据库定义了一个轻量级的统一接口。

装置

能够通过 PHP 的 phpinfo() 函数来查看是否装置了 PDO 扩大。

//Linux
extension=pdo.so
//Windows  
extension=php_pdo.dll  

应用

<?php
$dbms='mysql';     // 数据库类型
$host='localhost'; // 数据库主机名
$dbName='test';    // 应用的数据库
$user='root';      // 数据库连贯用户名
$pass='';          // 对应的明码
$dsn="$dbms:host=$host;dbname=$dbName";


try {$dbh = new PDO($dsn, $user, $pass); // 初始化一个 PDO 对象
    echo "连贯胜利 <br/>";
    /* 你还能够进行一次搜寻操作
    foreach ($dbh->query('SELECT * from FOO') as $row) {print_r($row); // 你能够用 echo($GLOBAL); 来看到这些值
    }
    */
    $dbh = null;
} catch (PDOException $e) {die ("Error!:" . $e->getMessage() . "<br/>");
}
// 默认这个不是长连贯,如果须要数据库长连贯,须要最初加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

PHP PDO

MySQLi

mysqli.dll 是 PHP 对 mysql 新个性的一个扩大反对,容许拜访 MySQL 4.1 及以上版本提供的性能。

mysql 与 mysqli 的区别:

  1. mysqli 连贯是永恒连贯,而 mysql 是非永恒连贯。
  2. mysql 连贯每当第二次应用的时候,都会从新关上一个新的过程。mysqli 连贯始终都只应用同一个过程。

应用

$conn = mysqli_connect('localhost', 'root', '123', 'db_test') or ('error');
$sql = "select * from db_table";
$query = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($query)){echo $row['title'];
}

mysqli 和 mysql 的区别是什么

类型束缚

通过类型束缚能够限度参数的类型,不过这一机制并不欠缺,目前仅实用于类和 callable(可执行类型) 以及 array(数组), 不适用于 string 和 int.

// 限度第一个参数为 MyClass, 第二个参数为可执行类型,第三个参数为数组
function MyFunction(MyClass $a, callable $b, array $c)
{// ...}

PHP5.2

JSON

  • json_encode — 对变量进行 JSON 编码
  • json_decode — 对 JSON 格局的字符串进行解码

PHP5.3

命名空间

防止不同包中的类名或变量名产生抵触

<?php
namespace XXX; // 命名空间的分隔符是反斜杠,该申明语句必须在文件第一行。

匿名函数(闭包)

用来临时性地创立一个无名函数,用于回调函数等用处。

$func = function($arg)
{print $arg;};
$func("Hello World!hovertree.top");

新增魔术办法 __callStatic()__invoke()

__callStatic():用动态形式中调用一个不可拜访办法时调用

__invoke():以调用函数的形式调用一个对象时的回应办法

$person = new Person('小明'); // 初始赋值
$person(); // 触发__invoke()

新增魔术变量__DIR__

获取以后执行的 PHP 脚本所在的目录

如以后执行的 PHP 文件为 /htdocs/index.php,则 __FILE__ 等于’/htdocs/index.php’,而 __DIR__ 等于’/htdocs’。

动静调用静态方法

public static function test($userName)
{//...}

$className = 'cls';
$className::test('Tom'); // PHP >= 5.3.0

提早动态绑定

PHP 5.3.0 中减少了一个 static 关键字来援用以后类,即实现了提早动态绑定。

这是因为 self 的语义原本就是“以后类”,所以 PHP5.3 给 static 关键字赋予了一个新性能:前期动态绑定

class A
{static public function callFuncXXOO()
    {print self::funcXXOO();
    }
    static public function funcXXOO()
    {return "A::funcXXOO()";
    }
}
class B extends A
{static public function funcXXOO()
    {return "B::funcXXOO";}
}
$b = new B;
$b->callFuncXXOO(); //A::funcXXOO()
class A
{static public function callFuncXXOO()
    {print static::funcXXOO();
    }
    // ...
}
B::callFuncXXOO(); //B::funcXXOO()

类外应用 const 定义常量

常量是一个简略的标识符。在脚本执行期间该值不能扭转(除了所谓的魔术常量,他们其实不是常量)。常量默认大小写敏感。通常常量标识符总是大写的。

能够用 define()函数来定义常量。在 php5.3.0 当前,能够应用 const 关键字在类定义的内部定义常量,先前版本 const 关键字只能在类 (class) 中应用。一个常量一旦被定义,就不能再扭转或勾销定义。

const 和 define 的区别?

  1. const 是一个语言构造,而 define 是一个函数。const 在编译时要比 define 快很多。

const 用于类成员变量的定义,一经定义,不可批改。Define 不能够用于类成员变量的定义,可用于全局常量。

  1. Const 可在类中应用,define 不能
  2. Const 不能在条件语句中定义常量
  3. const 采纳一般的常量名称,define 能够采纳表达式作为名称
  4. const 只能承受动态的标量,而 define 能够采纳任何表达式
  5. const 定义的常量时大小写敏感,而 define 能够通过第三个参数(为 true 示意大小写不敏感)来指定大小写是否敏感。

PHP 常量详解:define 和 const 的区别

简化三元运算符

从 PHP 5.3 开始,通过排除两头表达式,甚至能够进一步简化三元语句。如果测试表达式在布尔上下文中评估为 true,则返回其值。否则,将返回代替办法。

<?php
$favoriteColor = $_GET["color"] ?: "pink";

Phar

PHP5.3 之后反对了相似 Java 的 jar 包,名为 phar。用来将多个 PHP 文件打包为一个文件。

创立一个 phar 压缩包

$phar = new Phar('swoole.phar');
$phar->buildFromDirectory(__DIR__.'/../', '/.php$/');
$phar->compressFiles(Phar::GZ);
$phar->stopBuffering();
$phar->setStub($phar->createDefaultStub('lib_config.php'));

应用 phar 压缩包

include 'swoole.phar';
include 'swoole.phar/code/page.php';

应用 phar 能够很不便的打包你的代码,集成部署到线上机器。

php phar 教程,PHP 中 phar 包的应用教程

PHP 5.3 中的新个性及被弃用的性能函数总结

PHP5 各个版本的新性能和新个性总结

PHP5.4

Short Open Tag 短凋谢标签

自 PHP5.4 起总是可用。

// 能够把
<?php echo $xxoo;?>
// 简写成:<?= $xxoo;?> 

数组简写

// 原来的数组写法
$arr = array("key" => "value", "key2" => "value2");
// 简写模式
$arr = ["key" => "value", "key2" => "value2"];

Traits

Traits 是 PHP 多重继承的一种解决方案。PHP 中无奈进行多重继承,但一个类能够蕴含多个 Traits

// Traits 不能被独自实例化,只能被类所蕴含
trait SayWorld
{public function sayHello()
    {echo 'World!';}
}
class MyHelloWorld
{
    // 将 SayWorld 中的成员蕴含进来
    use SayWorld;
}

$xxoo = new MyHelloWorld();
// sayHello() 函数是来自 SayWorld 构件的
$xxoo->sayHello();

优先级

基类中的成员函数将被 Traits 中的函数笼罩,以后类中的成员函数将笼罩 Traits 中的函数。

php5.4 新性能 Traits 介绍

内置 Web 服务器

PHP 从 5.4 开始内置一个轻量级的 Web 服务器,不反对并发,定位是用于开发和调试环境。
在开发环境应用它确实十分不便。

php -S localhost:8000

动静拜访静态方法

$func = "funcXXOO";
A::{$func}();

实例化时拜访类成员

(new MyClass)->xxoo();

php5.4 总结

PHP5.5

yield 关键字

yield 关键字用于当函数须要返回一个迭代器的时候,一一返回值。

function number10()
{for($i = 1; $i <= 10; $i += 1)
        yield $i;
}

list() 用于 foreach

$array = [[1, 2, 3],
    [4, 5, 6],
];
foreach ($array as list($a, $b, $c))
    echo "{$a} {$b} {$c}\n";

细节批改

  • 不举荐应用 mysql 函数,举荐应用 PDO 或 MySQLi
  • 不再反对 Windows XP.
  • 可用 MyClass::class 取到一个类的残缺限定名(包含命名空间)
  • empty() 反对表达式作为参数
  • try-catch 构造新增 finally 块

PHP5.6

常量加强

  1. 定义常量时容许应用之前定义的常量进行计算

    const A = 2;
    const B = A + 1;
  2. 容许常量作为函数参数默认值

    function func($arg = C::STR2)asdf 

可变函数参数

用于代替 func_get_args()

function add(...$args)
{//...}

同时能够在调用函数时,把数组开展为函数参数:

$arr = [2, 3];
add(1, ...$arr);

命名空间加强

命名空间反对常量和函数

PHP5.6 总结

PHP7.0

标量类型申明

四种标量类型:boolean(布尔型),integer(整型),float(浮点型, 也称作 double),string(字符串)

function typeString(string $a)
{echo $a;}
typeString('sad'); //sad

返回值类型申明

function returnErrorArray(): array
{return '1456546';}
print_r(returnErrorArray());
/*
Array
Fatal error: Uncaught TypeError: Return value of returnArray() must be of the type array, string returned in 
*/

define 定义数组

define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);
echo ANIMALS[1]; // 输入 "cat"

匿名类

匿名类就像一个没有当时定义的类,而在定义的时候间接就进行了实例化。

// 间接定义
$objA = new class{public function getName(){echo "I'm objA";}
};
$objA->getName();

PHP7 匿名类的用法

null 合并运算符

$username = $_GET['user'] ?? 'nobody';
// 这两个是等效的  当不存在 user 则返回?? 前面的参数
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

PHP7.1

可为空类型

参数以及返回值的类型当初能够通过在类型前加上一个问号使之容许为空。

当启用这个个性时,传入的参数或者函数返回的后果要么是给定的类型,要么是 null。

<?php
  function testReturn(): ?string{return 'elePHPant';}

void 类型

<?php
  function swap(&$left, &$right) : void{//...}

多异样捕捉

<?php
try {// some code} catch (FirstException | SecondException $e) {// ...}

PHP7.2

新的对象类型 object

<?php
 
function test(object $obj) : object
{return new SplQueue();
}
 
test(new StdClass());

容许重写形象办法

当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类能够重写被继承的抽象类的形象办法。

<?php
 
abstract class A
{abstract function test(string $s);
}
abstract class B extends A
{
    // overridden - still maintaining contravariance for parameters and covariance for return
    abstract function test($s) : int;
}

PHP7.4

类属性反对类型申明

<?php
class User {
    public int $id;
    public string $name;
}

箭头函数

应用隐式按值作用域绑定定义函数的简写语法。

<?php
  $factor = 10;
  $nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
  // $nums = array(10, 20, 30, 40);?>

Null 合并运算符反对办法

<?php
  $array['key'] ??= computeDefault();
  //if (!isset($array['key'])) {$array['key'] = computeDefault();}
?>

Opcache 预加载

Opcache 将获取您的 PHP 源文件,将其编译为“opcodes”,而后将这些编译后的文件存储在磁盘上。opcache 会跳过源文件和 PHP 解释器在运行时理论须要之间的转换步骤。

把握 PHP 7.x 各个版本的新个性

PHP7.0~PHP7.1~PHP7.2~PHP7.3~PHP7.4 新个性

PHP8.0

JIT 即时编译

PHP8 的 JIT 目前是在 Opcache 之中提供的

JIT 在 Opcache 优化之后的根底上,联合 Runtime 的信息再次优化,间接生成机器码

JIT 不是原来 Opcache 优化的代替,是加强

目前 PHP8 只反对 x86 架构的 CPU

命名参数

就是具名参数,在调用函数的时候,能够指定参数名称,指定参数名称后,参数程序能够不装置原函数参数程序传

// 传统形式调用
balance(100, 20);
//php8 应用命名参数调用
balance(amount: 100, payment: 20);

注解

应用注解能够将类定义成一个一个低解耦,高内聚的元数据类。在应用的时候通过注解灵便引入,反射注解类实例的时候达到调用的目标。
注解类只有在被实例化的时候才会调用

联结类型

在不确定参数类型的场景下,能够应用

function printSomeThing(string|int $value)
{var_dump($value);
}

Match 表达式

和 switch cash 差不多,不过是严格 === 匹配

<?php
$key = 'b';
$str = match($key) {
    'a' => 'this a',
    'c' => 'this c',
     0  => 'this 0',
    'b' => 'last b',
  };
echo $str;// 输入 last b

Nullsafe 运算符

// 不实例 User 类,设置为 null
$user = null;
echo $user->getName();//php8 之前调用, 报错
echo $user?->getName();//php8 调用, 不报错,返回空

结构器属性晋升

在构造函数中能够申明类属性的修饰词作用域

<?php
    // php8 之前
    class User
    {
        protected string $name;
        protected int $age;
        public function __construct(string $name, int $age)
        {
            $this->name = $name;
            $this->age = $age;
        }
    }
    //php8 写法,class User
    {
        public function __construct(
            protected string $name,
            protected int $age
        ) {}}

联合示例解说 PHP8 的新个性

正文完
 0