>백엔드 개발 >PHP 튜토리얼 >한 기사에서는 PHP5-8 각 버전의 기능을 자세히 설명합니다. [요약]

한 기사에서는 PHP5-8 각 버전의 기능을 자세히 설명합니다. [요약]

青灯夜游
青灯夜游앞으로
2022-07-27 11:42:424056검색

이 글은 모든 사람을 위한 PHP5-8의 각 버전의 기능을 요약하고 있습니다. 필요하다면 읽고, 수집하고, 읽는 것이 모든 사람에게 도움이 되기를 바랍니다.

한 기사에서는 PHP5-8 각 버전의 기능을 자세히 설명합니다. [요약]

PHP5-8

PHP5.1 각 버전의 기능 요약:

  • autoload
  • PDO
  • MySQLi
  • 유형 제약 조건

PHP5.2:

  • JSON 지원

PHP5.3:

  • Namespace
  • 익명 함수
  • Closure
  • 새로운 매직 메소드 __callStatic()__invoke()__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();

PDO

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

安装

可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展。

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

使用

<?php
$dbms=&#39;mysql&#39;;     //数据库类型
$host=&#39;localhost&#39;; //数据库主机名
$dbName=&#39;test&#39;;    //使用的数据库
$user=&#39;root&#39;;      //数据库连接用户名
$pass=&#39;&#39;;          //对应的密码
$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));

MySQLi

mysqli.dll是PHP对mysql新特性的一个扩展支持,允许访问MySQL 4.1及以上版本提供的功能。

mysql与mysqli的区别:

  • mysqli连接是永久连接,而mysql是非永久连接。

  • 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'];
}

类型约束

通过类型约束可以限制参数的类型,不过这一机制并不完善,目前仅适用于类和 callable(可执行类型) 以及 array(数组), 不适用于 string 和 int.

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

PHP5.2


JSON

PHP5.3


命名空间

避免不同包中的类名或变量名产生冲突
<?php
namespace XXX; // 命名空间的分隔符是反斜杠,该声明语句必须在文件第一行。

匿名函数(闭包)

用来临时性地创建一个无名函数,用于回调函数等用途。
$func = function($arg)
{
    print $arg;
};
$func("Hello World! hovertree.top");

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

__callStatic():用静态方式中调用一个不可访问方法时调用

__invoke()

새로운 매직 변수 __DIR__ 🎜🎜정적 메소드에 대한 동적 호출🎜🎜지연된 정적 바인딩🎜🎜Heredoc 및 Nowdoc🎜🎜const를 사용하여 클래스 외부에서 상수 정의🎜🎜3차 연산자🎜🎜Phar🎜🎜🎜PHP5.4:🎜🎜🎜Short Open 태그🎜🎜배열 약어🎜🎜Traits,🎜🎜내장 웹 서버🎜🎜정적 메서드에 대한 동적 액세스🎜🎜인스턴스화 중 클래스 멤버에 액세스🎜🎜🎜PHP5.5:🎜🎜🎜yield🎜🎜foreach에 대한 목록🎜 🎜세부사항 수정 🎜🎜🎜PHP5.6:🎜🎜🎜지속적인 향상🎜🎜네임스페이스 향상🎜🎜가변 함수 매개변수🎜🎜🎜PHP7.0:🎜🎜🎜스칼라 유형 선언🎜🎜반환 값 유형 선언🎜🎜정의된 정의 상수 배열🎜 🎜 익명 수업 🎜🎜null 병합 연산자🎜🎜🎜PHP7.1: 🎜🎜🎜nullable 유형🎜🎜void 유형🎜🎜다중 예외 잡기🎜🎜🎜PHP7.2: 🎜🎜🎜새 개체 개체🎜🎜를 사용하면 추상 메서드 재정의가 가능합니다. 🎜🎜🎜PHP7. 3: 구문 수준에는 큰 변화가 없습니다🎜🎜PHP7.4: 🎜🎜🎜Type 속성 🎜🎜화살표 함수 🎜🎜Null 병합 연산자 지원 방법 🎜🎜Opcache 사전 로드 🎜🎜🎜PHP8.0 :🎜🎜🎜JIT 그냥- 시간 내 컴파일🎜🎜이름이 지정된 매개변수🎜🎜Annotations🎜🎜Union 유형🎜🎜일치 표현식🎜🎜Nullsafe 연산자🎜🎜생성자 속성 승격🎜🎜

PHP5.1🎜


__autoload() 매직 메소드

이것은 PHP5에서 자동 로딩 함수입니다. 이 함수는 정의되지 않은 경우 실행됩니다. 클래스가 인스턴스화됩니다. 이 함수를 정의하면 클래스의 자동 로딩을 활성화할 수 있습니다.
$person = new Person(&#39;小明&#39;); // 初始赋值
$person(); //触发__invoke()
    🎜🎜PHP의 __autoload() 매직 메소드에 대한 자세한 설명🎜🎜🎜

    PDO

    PDO(PHP 데이터 개체) 확장은 PHP를 위한 쉬운 방법을 정의합니다. 데이터베이스에 액세스하려면 규모의 일관된 인터페이스를 사용하세요.

    설치

    🎜PDO 확장 프로그램이 설치되었는지는 PHP의 phpinfo() 함수를 통해 확인할 수 있습니다. 🎜
    public static function test($userName)
    {
        //...
    }
    
    $className = &#39;cls&#39;;
    $className::test(&#39;Tom&#39;); // PHP >= 5.3.0

    사용

    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()
      🎜🎜PHP PDO🎜🎜🎜

      MySQLi

      mysqli.dll은 mysql을 위한 PHP의 새로운 기능입니다. MySQL 4.1 이상에서 제공되는 기능에 대한 액세스를 허용하는 확장 지원입니다.

      mysql과 mysqli의 차이점:

        🎜🎜mysqli 연결은 영구적인 연결이지만, mysql은 비영구 연결입니다. 🎜🎜🎜🎜MySQL 연결은 두 번째 사용될 때마다 새로운 프로세스를 다시 엽니다. Mysqli 연결은 항상 동일한 프로세스를 사용합니다. 🎜🎜🎜

        사용

    class A
    {
        static public function callFuncXXOO()
        {
            print static::funcXXOO();
        }
        // ...
    }
    B::callFuncXXOO(); //B::funcXXOO()
      🎜🎜mysqli와 mysql의 차이점은 무엇입니까🎜🎜🎜

      유형 제약 조건 Strong>

      🎜 매개변수 유형은 유형 제약을 통해 제한될 수 있습니다. 그러나 이 메커니즘은 현재 클래스, 호출 가능 항목(실행 가능 유형) 및 배열(배열)에만 적용됩니다. 문자열 및 정수에는 적용되지 않습니다.🎜
    <?php
    $favoriteColor = $_GET["color"] ?: "pink";

    PHP5.2🎜

    JSON

    🎜🎜json_encode — 변수의 JSON 인코딩🎜🎜json_decode — JSON 형식 문자열 디코드🎜🎜

    PHP5.3🎜< hr/>

    네임스페이스

    다른 패키지의 클래스 이름이나 변수 이름 간의 충돌 방지
    $phar = new Phar(&#39;swoole.phar&#39;);
    $phar->buildFromDirectory(__DIR__.'/../', '/.php$/');
    $phar->compressFiles(Phar::GZ);
    $phar->stopBuffering();
    $phar->setStub($phar->createDefaultStub('lib_config.php'));

    익명 함수(클로저)

    콜백 함수 및 기타 목적을 위해 이름 없는 함수를 임시로 생성하는 데 사용됩니다.
    include 'swoole.phar';
    include 'swoole.phar/code/page.php';

    새로운 매직 메소드 __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的区别?

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

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

    • Const可在类中使用,define不能

    • Const不能在条件语句中定义常量

    • const采用普通的常量名称,define可以采用表达式作为名称

    • const只能接受静态的标量,而define可以采用任何表达式

    • 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(&#39;swoole.phar&#39;);
    $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可以很方便的打包你的代码,集成部署到线上机器。

    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中的函数。

    内置 Web 服务器

    PHP从5.4开始内置一个轻量级的Web服务器,不支持并发,定位是用于开发和调试环境。
    在开发环境使用它的确非常方便。

    php -S localhost:8000

    动态访问静态方法

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

    实例化时访问类成员

    (new MyClass)->xxoo();

    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


    常量增强

    • 定义常量时允许使用之前定义的常量进行计算

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

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

    可变函数参数

    用于代替 func_get_args()

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

    同时可以在调用函数时,把数组展开为函数参数:

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

    命名空间增强

    命名空间支持常量和函数

    PHP7.0


    标量类型声明

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

    function typeString(string $a)
    {
        echo $a;
    }
    typeString(&#39;sad&#39;); //sad

    返回值类型声明

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

    define 定义数组

    define(&#39;ANIMALS&#39;, [
        &#39;dog&#39;,
        &#39;cat&#39;,
        &#39;bird&#39;
    ]);
    echo ANIMALS[1]; // 输出 "cat"

    匿名类

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

    // 直接定义
    $objA = new class{
        public function getName(){
            echo "I&#39;m objA";
        }
    };
    $objA->getName();

    null 合并运算符

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

    PHP7.1


    可为空类型

    参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。

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

    <?php
      function testReturn(): ?string{
        return &#39;elePHPant&#39;;
      }

    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[&#39;key&#39;] ??= computeDefault();
      //if (!isset($array[&#39;key&#39;])) {$array[&#39;key&#39;] = computeDefault();}
    ?>

    Opcache 预加载

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

    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 = &#39;b&#39;;
    $str = match($key) {
        &#39;a&#39; => '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
            ) {}
        }

    推荐学习:《PHP视频教程

    위 내용은 한 기사에서는 PHP5-8 각 버전의 기능을 자세히 설명합니다. [요약]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제