zoukankan      html  css  js  c++  java
  • PHP5.3总结

    PHP5.3 新增了大量新特征,同时也做了一些不向下兼容的修改。

    【PHP5.3弃用的功能】:以下几个功能被弃用,若在配置文件中启用,则 PHP 会在运行时发出警告。

    Register Globals这是 php.ini 中的一个选项(register_globals), 开启后会将所有表单变量($_GET和$_POST)注册为全局变量.

    if(isAuth())
        $authorized = true;
    if($authorized)
        include("page.php");


    这段代码在通过验证时,将 $authorized 设置为 true. 然后根据 $authorized 的值来决定是否显示页面.
    但由于并没有事先把 $authorized 初始化为 false, 当 register_globals 打开时,可能访问 /auth.php?authorized=1 来定义该变量值,绕过身份验证。
    该特征属于历史遗留问题,在 PHP4.2 中被默认关闭,在 PHP5.4 中被移除。

    Magic Quotes

    对应 php.ini 中的选项 magic_quotes_gpc, 这个特征同样属于历史遗留问题,已经在 PHP5.4 中移除。
    该特征会将所有用户输入进行转义,这看上去不错,在第一章我们提到过要对用户输入进行转义。
    但是 PHP 并不知道哪些输入会进入 SQL , 哪些输入会进入 Shell, 哪些输入会被显示为 HTML, 所以很多时候这种转义会引起混乱。

    Safe Mode
    很多虚拟主机提供商使用 Safe Mode 来隔离多个用户,但 Safe Mode 存在诸多问题,例如某些扩展并不按照 Safe Mode 来进行权限控制。
    PHP官方推荐使用操作系统的机制来进行权限隔离,让Web服务器以不同的用户权限来运行PHP解释器,请参见第一章中的最小权限原则.

    【PHP5.3的新增、改进】

    匿名函数
    也叫闭包(Closures), 经常被用来临时性地创建一个无名函数,用于回调函数等用途。

    $func = function($arg)
    {
        print $arg;
    };

    $func("Hello World");


    以上代码定义了一个匿名函数,并赋值给了 $func.
    可以看到定义匿名函数依旧使用 function 关键字,只不过省略了函数名,直接是参数列表。
    然后我们又调用了 $func 所储存的匿名函数。
    匿名函数还可以用 use 关键字来捕捉外部变量:

     
    function arrayPlus($array, $num)
    {
        array_walk($array, function(&$v) use($num){
            $v += $num;
        });
    }


    上面的代码定义了一个 arrayPlus() 函数(这不是匿名函数), 它会将一个数组($array)中的每一项,加上一个指定的数字($num).
    在 arrayPlus() 的实现中,我们使用了 array_walk() 函数,它会为一个数组的每一项执行一个回调函数,即我们定义的匿名函数。
    在匿名函数的参数列表后,我们用 use 关键字将匿名函数外的 $num 捕捉到了函数内,以便知道到底应该加上多少。

    魔术方法:__invoke(), __callStatic()
    PHP 的面向对象体系中,提供了若干“魔术方法”,用于实现类似其他语言中的“重载”,如在访问不存在的属性、方法时触发某个魔术方法。
    随着匿名函数的加入,PHP 引入了一个新的魔术方法 __invoke().
    该魔术方法会在将一个对象作为函数调用时被调用:

    class A
    {
        public function __invoke($str)
        {
            print "A::__invoke(): {$str}";
        }
    }

    $a = new A;
    $a("Hello World");


    输出毫无疑问是:

    A::__invoke(): Hello World


    __callStatic() 则会在调用一个不存在的静态方法时被调用。


    命名空间
    PHP的命名空间有着前无古人后无来者的无比讨厌的语法:

    <?php
    // 命名空间的分隔符是反斜杠,该声明语句必须在文件第一行。
    // 命名空间中可以包含任意代码,但只有 **类, 函数, 常量** 受命名空间影响。
    namespace XXOOTest;

    // 该类的完整限定名是 XXOOTestA , 其中第一个反斜杠表示全局命名空间。
    class A{}

    // 你还可以在已经文件中定义第二个命名空间,接下来的代码将都位于 OtherTest2 .
    namespace OtherTest2;

    // 实例化来自其他命名空间的对象:
    $a = new XXOOTestA;
    class B{}

    // 你还可以用花括号定义第三个命名空间
    namespace Other {
        // 实例化来自子命名空间的对象:
        $b = new Test2B;

        // 导入来自其他命名空间的名称,并重命名,
        // 注意只能导入类,不能用于函数和常量。
        use XXOOTestA as ClassA
    }


    更多有关命名空间的语法介绍请参见官网


    命名空间时常和 autoload 一同使用,用于自动加载类实现文件:


    spl_autoload_register(
        function ($class) {
            spl_autoload(str_replace("\", "/", $class));
        }
    );


    当你实例化一个类 XXOOTestA 的时候,这个类的完整限定名会被传递给 autoload 函数,autoload 函数将类名中的命名空间分隔符(反斜杠)替换为斜杠,并包含对应文件。
    这样可以实现类定义文件分级储存,按需自动加载。

    后期静态绑定
    PHP 的 OPP 机制,具有继承和类似虚函数的功能,例如如下的代码:

    class A
    {
        public function callFuncXXOO()
        {
            print $this->funcXXOO();
        }

        public function funcXXOO()
        {
            return "A::funcXXOO()";
        }
    }

    class B extends A
    {
        public function funcXXOO()
        {
            return "B::funcXXOO";
        }
    }

    $b = new B;
    $b->callFuncXXOO();


    可以看到,当在 A 中使用 $this->funcXXOO() 时,体现了“虚函数”的机制,实际调用的是 B::funcXXOO().
    然而如果将所有函数都改为静态函数:

    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();


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

    class A
    {
        static public function callFuncXXOO()
        {
            print static::funcXXOO();
        }

        
    }


    这样就会像预期一样输出了:

    代码如下:
    B::funcXXOO

    Heredoc 和 Nowdoc

    PHP5.3 对 Heredoc 以及 Nowdoc 进行了一些改进,它们都用于在 PHP 代码中嵌入大段字符串。
    Heredoc 的行为类似于一个双引号字符串:

    $name = "MyName";
    echo <<< TEXT
    My name is "{$name}".
    TEXT;


    Heredoc 以三个左尖括号开始,后面跟一个标识符(TEXT), 直到一个同样的顶格的标识符(不能缩进)结束。
    就像双引号字符串一样,其中可以嵌入变量。

    Heredoc 还可以用于函数参数,以及类成员初始化:

    var_dump(<<<EOD
    Hello World
    EOD
    );

    class A
    {
        const xx = <<< EOD
    Hello World
    EOD;

        public $oo = <<< EOD
    Hello World
    EOD;
    }


    Nowdoc 的行为像一个单引号字符串,不能在其中嵌入变量,和 Heredoc 唯一的区别就是,三个左尖括号后的标识符要以单引号括起来:

    $name = "MyName";
    echo <<< 'TEXT'
    My name is "{$name}".
    TEXT;


    输出:

    代码如下:
    My name is "{$name}".

    用 const 定义常量

    PHP5.3 起同时支持在全局命名空间和类中使用 const 定义常量。
    旧式风格:

    define("XOOO", "Value");


    新式风格:
    const XXOO = "Value";
    const 形式仅适用于常量,不适用于运行时才能求值的表达式:

    代码如下:
    // 正确
    const XXOO = 1234;
    // 错误
    const XXOO = 2 * 617;

    三元运算符简写形式
    旧式风格:

    echo $a ? $a : "No Value";


    可简写成:

    echo $a ?: "No Value";


    即如果省略三元运算符的第二个部分,会默认用第一个部分代替。

    Phar

    Phar即PHP Archive, 起初只是Pear中的一个库而已,后来在PHP5.3被重新编写成C扩展并内置到 PHP 中。
    Phar用来将多个 .php 脚本打包(也可以打包其他文件)成一个 .phar 的压缩文件(通常是ZIP格式)。
    目的在于模仿 Java 的 .jar, 不对,目的是为了让发布PHP应用程序更加方便。同时还提供了数字签名验证等功能。
    .phar 文件可以像 .php 文件一样,被PHP引擎解释执行,同时你还可以写出这样的代码来包含(require) .phar 中的代码:

     
    require("xxoo.phar");
    require("phar://xxoo.phar/xo/ox.php");
  • 相关阅读:
    TVM安装
    Caffe常用算子GPU和CPU对比
    [LeetCode] Longest Palindromic Substring 最长回文串
    [2019牛客多校第四场][G. Tree]
    [2019牛客多校第三场][G. Removing Stones]
    [2019HDU多校第一场][HDU 6580][C. Milk]
    [2019HDU多校第一场][HDU 6578][A. Blank]
    [2019HDU多校第一场][HDU 6590][M. Code]
    [2019HDU多校第一场][HDU 6588][K. Function]
    [2019牛客多校第二场][A. Eddy Walker]
  • 原文地址:https://www.cnblogs.com/L-moye/p/14367135.html
Copyright © 2011-2022 走看看