汇总

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扩大。

//Linuxextension=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

命名空间

防止不同包中的类名或变量名产生抵触
<?phpnamespace 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());/*ArrayFatal 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{    //...  }

多异样捕捉

<?phptry {    // 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

类属性反对类型申明

<?phpclass 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的新个性