精华内容
参与话题
问答
  • php7 新特性整理

    万次阅读 2017-07-04 23:58:43
    PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来越好。  在这里整理 PHP 5.1 ,PHP5.2,PHP5.3,PHP5.4,PHP5.5,PHP5.6 ,PHP7,PHP7.1 所有新特性,已备大家...

    PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来越好。 
    在这里整理 PHP 5.1 ,PHP5.2,PHP5.3,PHP5.4,PHP5.5,PHP5.6 ,PHP7,PHP7.1 所有新特性,已备大家学习及使用 
    PHP5.1~PHP5.6 http://blog.csdn.net/fenglailea/article/details/9853645 
    PHP7~PHP7.1 
    http://blog.csdn.net/fenglailea/article/details/52717364 
    风.fox

    Buid-in web server内置了一个简单的Web服务器

    把当前目录作为Root Document只需要这条命令即可:

    php -S localhost:3300

    也可以指定其它路径

    php -S localhost:3300 -t /path/to/root  

    还可以指定路由

    php -S localhost:3300 router.php

    命名空间(php5.3)

    命名空间的分隔符为反斜杆\

    namespace fox\lanmps\Table;    
    class Select {}

    获取完整类别名称

    PHP5.3 中引入命名空间的别名类和命名空间短版本的功能。虽然这并不适用于字符串类名称

    use Some\Deeply\Nested\Namespace\FooBar;    
    // does not work, because this will try to use the global `FooBar` class    
    $reflection = new ReflectionClass('FooBar');   
    echo FooBar::class;  

    为了解决这个问题采用新的FooBar::class语法,它返回类的完整类别名称

    命名空间 use 操作符开始支持函数和常量的导入

    namespace Name\Space {  
        const FOO = 42;  
        function f() { echo __FUNCTION__."\n"; }  
    }  
    namespace {  
        use const Name\Space\FOO;  
        use function Name\Space\f;  
    
        echo FOO."\n";  
        f();  
    } 

    输出 
    42 
    Name\Space\f

    Group use declarations

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

    //PHP7之前
    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;
    
    // PHP7之后
    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};

    支持延迟静态绑定

    static关键字来引用当前类,即实现了延迟静态绑定

    class A {    
        public static function who() {    
            echo __CLASS__;    
        }    
        public static function test() {    
            static::who(); // 这里实现了延迟的静态绑定    
        }    
    }    
    class B extends A {    
        public static function who() {    
             echo __CLASS__;    
        }    
    }
    B::test();    

    输出结果: 
    B

    支持goto语句

    多数计算机程序设计语言中都支持无条件转向语句goto,当程序执行到goto语句时,即转向由goto语句中的标号指出的程序位置继续执行。尽管goto语句有可能会导致程序流程不清晰,可读性减弱,但在某些情况下具有其独特的方便之处,例如中断深度嵌套的循环和 if 语句。

    goto a;    
    echo 'Foo';    
    a:    
    echo 'Bar';    
    for($i=0,$j=50; $i<100; $i++) {    
      while($j--) {    
        if($j==17) goto end;    
      }     
    }    
    echo "i = $i";    
    end:    
    echo 'j hit 17'; 

    支持闭包、Lambda/Anonymous函数

    闭包(Closure)函数和Lambda函数的概念来自于函数编程领域。例如JavaScript 是支持闭包和 lambda 函数的最常见语言之一。 
    在PHP中,我们也可以通过create_function()在代码运行时创建函数。但有一个问题:创建的函数仅在运行时才被编译,而不与其它代码同时被编译成执行码,因此我们无法使用类似APC这样的执行码缓存来提高代码执行效率。 
    在PHP5.3中,我们可以使用Lambda/匿名函数来定义一些临时使用(即用即弃型)的函数,以作为array_map()/array_walk()等函数的回调函数。

    echo preg_replace_callback('~-([a-z])~', function ($match) {    
        return strtoupper($match[1]);    
    }, 'hello-world');    
    // 输出 helloWorld    
    $greet = function($name)    
    {    
        printf("Hello %s\r\n", $name);    
    };    
    $greet('World');    
    $greet('PHP');    
    //...在某个类中    
    $callback =      function ($quantity, $product) use ($tax, &$total)         {    
       $pricePerItem = constant(__CLASS__ . "::PRICE_" .  strtoupper($product));    
       $total += ($pricePerItem * $quantity) * ($tax + 1.0);    
     };    

    魔术方法__callStatic()和__invoke()

    PHP中原本有一个魔术方法__call(),当代码调用对象的某个不存在的方法时该魔术方法会被自动调用。新增的__callStatic()方法则只用于静态类方法。当尝试调用类中不存在的静态方法时,__callStatic()魔术方法将被自动调用。

    class MethodTest {    
        public function __call($name, $arguments) {    
            // 参数 $name 大小写敏感    
            echo "调用对象方法 '$name' "    
                 . implode(' -- ', $arguments). "\n";    
        }    
        /**  PHP 5.3.0 以上版本中本类方法有效  */    
        public static function __callStatic($name, $arguments) {    
            // 参数 $name 大小写敏感    
            echo "调用静态方法 '$name' "    
                 . implode(' -- ', $arguments). "\n";    
        }    
    }    
    
    $obj = new MethodTest;    
    $obj->runTest('通过对象调用');    
    MethodTest::runTest('静态调用');  // As of PHP 5.3.0

    以上代码执行后输出如下: 
    调用对象方法’runTest’ –- 通过对象调用调用静态方法’runTest’ –- 静态调用 
    以函数形式来调用对象时,__invoke()方法将被自动调用。

    class MethodTest {    
        public function __call($name, $arguments) {    
            // 参数 $name 大小写敏感    
            echo "Calling object method '$name' "    
                 . implode(', ', $arguments). "\n";    
        }    
    
        /**  PHP 5.3.0 以上版本中本类方法有效  */    
        public static function __callStatic($name, $arguments) {    
            // 参数 $name 大小写敏感    
            echo "Calling static method '$name' "    
                 . implode(', ', $arguments). "\n";    
        }    
    }    
    $obj = new MethodTest;    
    $obj->runTest('in object context');    
    MethodTest::runTest('in static context');  // As of PHP 5.3.0  

    Nowdoc语法

    用法和Heredoc类似,但使用单引号。Heredoc则需要通过使用双引号来声明。 
    Nowdoc中不会做任何变量解析,非常适合于传递一段PHP代码。

    // Nowdoc 单引号 PHP 5.3之后支持    
    $name = 'MyName';    
    echo <<<'EOT'    
    My name is "$name".    
    EOT;    
    //上面代码输出 My name is "$name". ((其中变量不被解析)    
    // Heredoc不加引号    
    echo <<<FOOBAR    
    Hello World!    
    FOOBAR;    
    //或者 双引号 PHP 5.3之后支持    
    echo <<<"FOOBAR"    
    Hello World!    
    FOOBAR;  

    支持通过Heredoc来初始化静态变量、类成员和类常量。

    // 静态变量    
    function foo()    
    {    
        static $bar = <<<LABEL    
    Nothing in here...    
    LABEL;    
    }    
    // 类成员、常量    
    class foo    
    {    
        const BAR = <<<FOOBAR    
    Constant example    
    FOOBAR;    
    
        public $baz = <<<FOOBAR    
    Property example    
    FOOBAR;    
    }  

    在类外也可使用const来定义常量

    //PHP中定义常量通常是用这种方式  
    define("CONSTANT", "Hello world.");  
    
    //并且新增了一种常量定义方式  
    const CONSTANT = 'Hello World'; 

    三元运算符增加了一个快捷书写方式

    原本格式为是(expr1) ? (expr2) : (expr3) 
    如果expr1结果为True,则返回expr2的结果。 
    新增一种书写方式,可以省略中间部分,书写为expr1 ?: expr3 
    如果expr1结果为True,则返回expr1的结果

    $expr1=1;
    $expr2=2;
    //原格式  
    $expr=$expr1?$expr1:$expr2  
    //新格式  
    $expr=$expr1?:$expr2

    输出结果: 
    1 
    1

    空合并运算符(??)

    简化判断

    $param = $_GET['param'] ?? 1;

    相当于:

    $param = isset($_GET['param']) ? $_GET['param'] : 1;

    Json更懂中文(JSON_UNESCAPED_UNICODE)

    echo json_encode("中文", JSON_UNESCAPED_UNICODE);  
    //输出:"中文" 

    二进制

    $bin  = 0b1101;  
    echo $bin;  
    //13 

    Unicode codepoint 转译语法

    这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的。

     echo "\u{9876}"

    旧版输出:\u{9876} 
    新版输入:顶

    使用 ** 进行幂运算

    加入右连接运算符 * 来进行幂运算。 同时还支持简写的 *= 运算符,表示进行幂运算并赋值。

    printf("2 ** 3 ==      %d\n", 2 ** 3);
    printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);
    
    $a = 2;
    $a **= 3;
    printf("a ==           %d\n", $a);

    输出 
    2 ** 3 == 8 
    2 * 3 * 2 == 512 
    a == 8

    太空船操作符(组合比较符)

    太空船操作符用于比较两个表达式。当 ab 时它分别返回 -1 、 0 或 1 。 比较的原则是沿用 PHP 的常规比较规则进行的。

    // Integers
    echo 1 <=> 1; // 0
    echo 1 <=> 2; // -1
    echo 2 <=> 1; // 1
    // Floats
    echo 1.5 <=> 1.5; // 0
    echo 1.5 <=> 2.5; // -1
    echo 2.5 <=> 1.5; // 1
    // Strings
    echo "a" <=> "a"; // 0
    echo "a" <=> "b"; // -1
    echo "b" <=> "a"; // 1

    Traits

    Traits提供了一种灵活的代码重用机制,即不像interface一样只能定义方法但不能实现,又不能像class一样只能单继承。至于在实践中怎样使用,还需要深入思考。 
    魔术常量为TRAIT

    官网的一个例子:  
    trait SayWorld {  
            public function sayHello() {  
                    parent::sayHello();  
                    echo "World!\n";  
                    echo 'ID:' . $this->id . "\n";  
            }  
    }  
    
    class Base {  
            public function sayHello() {  
                    echo 'Hello ';  
            }  
    }  
    
    class MyHelloWorld extends Base {  
            private $id;  
    
            public function __construct() {  
                    $this->id = 123456;  
            }  
    
            use SayWorld;  
    }  
    
    $o = new MyHelloWorld();  
    $o->sayHello();  
    
    /*will output: 
    Hello World! 
    ID:123456 
     */  

    array 数组简写语法

    $arr = [1,'james', 'james@fwso.cn'];  
    $array = [  
      "foo" => "bar",  
      "bar" => "foo"  
      ]; 

    array 数组中某个索引值简写

    function myfunc() {  
        return array(1,'james', 'james@fwso.cn');  
    }
    echo myfunc()[1];  
    
    $name = explode(",", "Laruence,male")[0];  
    explode(",", "Laruence,male")[3] = "phper";  

    非变量array和string也能支持下标获取了

    echo array(1, 2, 3)[0];  
    echo [1, 2, 3][0];  
    echo "foobar"[2];  

    支持为负的字符串偏移量

    现在所有接偏移量的内置的基于字符串的函数都支持接受负数作为偏移量,包括数组解引用操作符([]).

    var_dump("abcdef"[-2]);
    var_dump(strpos("aabbcc", "b", -3));

    以上例程会输出:

    string (1) "e"
    int(3)

    常量引用

    “常量引用”意味着数组可以直接操作字符串和数组字面值。举两个例子:

    function randomHexString($length) {    
        $str = '';    
        for ($i = 0; $i < $length; ++$i) {    
            $str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string    
        }    
    }    
    function randomBool() {    
        return [false, true][mt_rand(0, 1)]; // direct dereference of array    
    }   

    常量增强

    允许常量计算,允许使用包含数字、字符串字面值和常量的标量表达式

    const A = 2;  
    const B = A + 1;  
    class C  
    {  
        const STR = "hello";  
        const STR2 = self::STR + ", world";  
    }

    允许常量作为函数参数默认

    function test($arg = C::STR2)

    类常量可见性 
    现在起支持设置类常量的可见性。

    class ConstDemo
    {
        const PUBLIC_CONST_A = 1;
        public const PUBLIC_CONST_B = 2;
        protected const PROTECTED_CONST = 3;
        private const PRIVATE_CONST = 4;
    }

    通过define()定义常量数组

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

    函数变量类型声明

    两种模式 : 强制 ( 默认 ) 和 严格模式 
    类型:array,object(对象),string、int、float和 bool

    class bar {  
    function foo(bar $foo) {  
    }  
    //其中函数foo中的参数规定了传入的参数必须为bar类的实例,否则系统会判断出错。同样对于数组来说,也可以进行判断,比如:  
    function foo(array $foo) {  
    }  
    }  
      foo(array(1, 2, 3)); // 正确,因为传入的是数组  
      foo(123); // 不正确,传入的不是数组
    
    function add(int $a) 
    { 
        return 1+$a; 
    } 
    var_dump(add(2));
    
    function foo(int $i) { ... }  
    foo(1);      // $i = 1  
    foo(1.0);    // $i = 1  
    foo("1");    // $i = 1  
    foo("1abc"); // not yet clear, maybe $i = 1 with notice  
    foo(1.5);    // not yet clear, maybe $i = 1 with notice  
    foo([]);     // error  
    foo("abc");  // error  

    参数跳跃

    如果你有一个函数接受多个可选的参数,目前没有办法只改变最后一个参数,而让其他所有参数为默认值。 
    RFC上的例子,如果你有一个函数如下:

    function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... }  

    那么有没有办法设置$report_errors=false,而其他两个为默认值。为了解决这个跳跃参数的问题而提出:

    create_query("deleted=0", "name", default, default, false);  

    可变函数参数

    代替 func_get_args()

    function add(...$args)  
    {  
        $result = 0;  
        foreach($args as $arg)  
            $result += $arg;  
        return $result;  
    } 

    可为空(Nullable)类型

    类型现在允许为空,当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。可以通过在类型前面加上一个问号来使之成为可为空的。

    function test(?string $name)
    {
        var_dump($name);
    }

    以上例程会输出:

    string(5) "tpunt"
    NULL
    Uncaught Error: Too few arguments to function test(), 0 passed in...

    Void 函数

    在PHP 7 中引入的其他返回值类型的基础上,一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。

    function swap(&$left, &$right) : void
    {
        if ($left === $right) {
            return;
        }
        $tmp = $left;
        $left = $right;
        $right = $tmp;
    }
    $a = 1;
    $b = 2;
    var_dump(swap($a, $b), $a, $b);

    以上例程会输出:

    null
    int(2)
    int(1)

    试图去获取一个 void 方法的返回值会得到 null ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。

    返回值类型声明

    函数和匿名函数都可以指定返回值的类型

    function show(): array 
    { 
        return [1,2,3,4]; 
    }
    
    function arraysSum(array ...$arrays): array
    {
    return array_map(function(array $array): int {
    return array_sum($array);
    }, $arrays);
    }

    参数解包功能

    在调用函数的时候,通过 … 操作符可以把数组或者可遍历对象解包到参数列表,这和Ruby等语言中的扩张(splat)操作符类似

    function add($a, $b, $c) {  
        return $a + $b + $c;  
    }  
    $arr = [2, 3];  
    add(1, ...$arr);

    实例化类

    class test{  
        function show(){  
    return 'test';  
        }  
    }  
    echo (new test())->show();

    支持 Class::{expr}() 语法

    foreach ([new Human("Gonzalo"), new Human("Peter")] as $human) {  
        echo $human->{'hello'}();  
    } 

    Callable typehint

    function foo(callable $callback) {  
    }

    foo("false"); //错误,因为false不是callable类型  
      foo("printf"); //正确  
      foo(function(){}); //正确  
    class A {  
      static function show() {  
        }  
    }  
      foo(array("A", "show")); //正确

    Getter 和 Setter

    如果你从不喜欢写这些getXYZ()和setXYZ($value)方法,那么这应该是你最受欢迎的改变。提议添加一个新的语法来定义一个属性的设置/读取:

    class TimePeriod {  
        public $seconds;  
        public $hours {  
            get { return $this->seconds / 3600; }  
            set { $this->seconds = $value * 3600; }  
        }  
    }  
    $timePeriod = new TimePeriod;  
    $timePeriod->hours = 10;  
    var_dump($timePeriod->seconds); // int(36000)  
    var_dump($timePeriod->hours);   // int(10)  

    迭代器 yield

    目前,自定义迭代器很少使用,因为它们的实现,需要大量的样板代码。生成器解决这个问题,并提供了一种简单的样板代码来创建迭代器。 
    例如,你可以定义一个范围函数作为迭代器:

    function *xrange($start, $end, $step = 1) {  
        for ($i = $start; $i < $end; $i += $step) {  
            yield $i;  
        }  
    }  
    foreach (xrange(10, 20) as $i) {  
        // ...  
    }  

    上述xrange函数具有与内建函数相同的行为,但有一点区别:不是返回一个数组的所有值,而是返回一个迭代器动态生成的值。

    列表解析和生成器表达式

    列表解析提供一个简单的方法对数组进行小规模操作:

    $firstNames = [foreach ($users as $user) yield $user->firstName];  

    上述列表解析相等于下面的代码:

    $firstNames = [];  
    foreach ($users as $user) {  
        $firstNames[] = $user->firstName;  
    }

    也可以这样过滤数组:

    $underageUsers = [foreach ($users as $user) if ($user->age < 18) yield $user];  

    生成器表达式也很类似,但是返回一个迭代器(用于动态生成值)而不是一个数组。

    生成器的返回值

    在PHP5.5引入生成器的概念。生成器函数每执行一次就得到一个yield标识的值。在PHP7中,当生成器迭代完成后,可以获取该生成器函数的返回值。通过Generator::getReturn()得到。

    function generator()
    {
        yield 1;
        yield 2;
        yield 3;
        return "a";
    }
    
    $generatorClass = ("generator")();
    foreach ($generatorClass as $val) {
        echo $val ." ";
    
    }
    echo $generatorClass->getReturn();

    输出为:1 2 3 a

    生成器中引入其他生成器

    在生成器中可以引入另一个或几个生成器,只需要写yield from functionName1

    function generator1()
    {
        yield 1;
        yield 2;
        yield from generator2();
        yield from generator3();
    }
    
    function generator2()
    {
        yield 3;
        yield 4;
    }
    
    function generator3()
    {
        yield 5;
        yield 6;
    }
    
    foreach (generator1() as $val) {
        echo $val, " ";
    }

    输出:1 2 3 4 5 6

    finally关键字

    这个和java中的finally一样,经典的try … catch … finally 三段式异常处理。

    多异常捕获处理

    一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

    try {
        // some code
    } catch (FirstException | SecondException $e) {
        // handle first and second exceptions
    } catch (\Exception $e) {
        // ...
    } finally{
    //
    }

    foreach 支持list()

    对于“数组的数组”进行迭代,之前需要使用两个foreach,现在只需要使用foreach + list了,但是这个数组的数组中的每个数组的个数需要一样。看文档的例子一看就明白了。

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

    短数组语法 Symmetric array destructuring

    短数组语法([])现在可以用于将数组的值赋给一些变量(包括在foreach中)。 这种方式使从数组中提取值变得更为容易。

    $data = [
        ['id' => 1, 'name' => 'Tom'],
        ['id' => 2, 'name' => 'Fred'],
    ];
    while (['id' => $id, 'name' => $name] = $data) {
        // logic here with $id and $name
    }

    list()现在支持键名

    现在list()支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

    $data = [
        ['id' => 1, 'name' => 'Tom'],
        ['id' => 2, 'name' => 'Fred'],
    ];
    while (list('id' => $id, 'name' => $name) = $data) {
        // logic here with $id and $name
    }

    iterable 伪类

    现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。

    function iterator(iterable $iter)
    {
        foreach ($iter as $val) {
            //
        }
    }

    ext/openssl 支持 AEAD

    通过给openssl_encrypt()和openssl_decrypt() 添加额外参数,现在支持了AEAD (模式 GCM and CCM)。 
    通过 Closure::fromCallable() 将callables转为闭包 
    Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。

    class Test
    {
        public function exposeFunction()
        {
            return Closure::fromCallable([$this, 'privateFunction']);
        }
        private function privateFunction($param)
        {
            var_dump($param);
        }
    }
    $privFunc = (new Test)->exposeFunction();
    $privFunc('some value');

    以上例程会输出:

    string(10) "some value"

    匿名类

    现在支持通过 new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。

    interface Logger
    {
        public function log(string $msg);
    }
    
    class Application
    {
        private $logger;
    
        public function getLogger(): Logger
        {
            return $this->logger;
        }
    
        public function setLogger(Logger $logger)
        {
            $this->logger = $logger;
        }
    }
    
    $app = new Application;
    $app->setLogger(new class implements Logger
    {
        public function log(string $msg)
        {
            echo $msg;
        }
    });
    var_dump($app->getLogger());

    Closure::call()

    Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。

    class Test
    {
        public $name = "lixuan";
    }
    
    //PHP7和PHP5.6都可以
    $getNameFunc = function () {
        return $this->name;
    };
    $name = $getNameFunc->bindTo(new Test, 'Test');
    echo $name();
    //PHP7可以,PHP5.6报错
    $getX = function () {
        return $this->name;
    };
    echo $getX->call(new Test);

    为unserialize()提供过滤

    这个特性旨在提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入。

    //将所有对象分为__PHP_Incomplete_Class对象
    $data = unserialize($foo, ["allowed_classes" => false]);
    //将所有对象分为__PHP_Incomplete_Class 对象 除了ClassName1和ClassName2
    $data = unserialize($foo, ["allowed_classes" => ["ClassName1", "ClassName2"]);
    //默认行为,和 unserialize($foo)相同
    $data = unserialize($foo, ["allowed_classes" => true]);

    IntlChar

    新增加的 IntlChar 类旨在暴露出更多的 ICU 功能。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。Intl是Pecl扩展,使用前需要编译进PHP中,也可apt-get/yum/port install php5-intl

    printf('%x', IntlChar::CODEPOINT_MAX);
    echo IntlChar::charName('@');
    var_dump(IntlChar::ispunct('!'));

    以上例程会输出: 
    10ffff 
    COMMERCIAL AT 
    bool(true)

    预期

    预期是向后兼用并增强之前的 assert() 的方法。 它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。 老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。

    ini_set('assert.exception', 1);
    class CustomError extends AssertionError {}
    assert(false, new CustomError('Some error message'));

    以上例程会输出: 
    Fatal error: Uncaught CustomError: Some error message

    intdiv()

    接收两个参数作为被除数和除数,返回他们相除结果的整数部分。

    var_dump(intdiv(7, 2));

    输出int(3)

    CSPRNG

    新增两个函数: random_bytes() and random_int().可以加密的生产被保护的整数和字符串。总之随机数变得安全了。 
    random_bytes — 加密生存被保护的伪随机字符串 
    random_int —加密生存被保护的伪随机整数

    preg_replace_callback_array()

    新增了一个函数preg_replace_callback_array(),使用该函数可以使得在使用preg_replace_callback()函数时代码变得更加优雅。在PHP7之前,回调函数会调用每一个正则表达式,回调函数在部分分支上是被污染了。

    Session options

    现在,session_start()函数可以接收一个数组作为参数,可以覆盖php.ini中session的配置项。 
    比如,把cache_limiter设置为私有的,同时在阅读完session后立即关闭。

    session_start(['cache_limiter' => 'private',
                   'read_and_close' => true,
    ]);

    $_SERVER[“REQUEST_TIME_FLOAT”]

    这个是用来统计服务请求时间的,并用ms(毫秒)来表示

    echo "脚本执行时间 ", round(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"], 2), "s";  

    empty() 支持任意表达式

    empty() 现在支持传入一个任意表达式,而不仅是一个变量

    function always_false() {
        return false;
    }
    
    if (empty(always_false())) {
        echo 'This will be printed.';
    }
    
    if (empty(true)) {
        echo 'This will not be printed.';
    }

    输出 
    This will be printed.

    php://input 可以被复用

    php://input 开始支持多次打开和读取,这给处理POST数据的模块的内存占用带来了极大的改善。

    Upload progress 文件上传

    Session提供了上传进度支持,通过$_SESSION[“upload_progress_name”]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。 
    详细的看http://www.laruence.com/2011/10/10/2217.html

    大文件上传支持

    可以上传超过2G的大文件。

    GMP支持操作符重载

    GMP 对象支持操作符重载和转换为标量,改善了代码的可读性,如:

    $a = gmp_init(42);  
    $b = gmp_init(17);  
    
    // Pre-5.6 code:  
    var_dump(gmp_add($a, $b));  
    var_dump(gmp_add($a, 17));  
    var_dump(gmp_add(42, $b));  
    
    // New code:  
    var_dump($a + $b);  
    var_dump($a + 17);  
    var_dump(42 + $b);  

    JSON 序列化对象

    实现了JsonSerializable接口的类的实例在json_encode序列化的之前会调用jsonSerialize方法,而不是直接序列化对象的属性。 
    参考http://www.laruence.com/2011/10/10/2204.html

    HTTP状态码在200-399范围内均被认为访问成功

    支持动态调用静态方法

    class Test{    
        public static function testgo()    
        {    
             echo "gogo!";    
        }    
    }    
    $class = 'Test';    
    $action = 'testgo';    
    $class::$action();  //输出 "gogo!"

    弃用e修饰符

    e修饰符是指示preg_replace函数用来评估替换字符串作为PHP代码,而不只是仅仅做一个简单的字符串替换。不出所料,这种行为会源源不断的出现安全问题。这就是为什么在PHP5.5 中使用这个修饰符将抛出一个弃用警告。作为替代,你应该使用preg_replace_callback函数。你可以从RFC找到更多关于这个变化相应的信息。

    新增函数 boolval

    PHP已经实现了strval、intval和floatval的函数。为了达到一致性将添加boolval函数。它完全可以作为一个布尔值计算,也可以作为一个回调函数。

    新增函数hash_pbkdf2

    PBKDF2全称“Password-Based Key Derivation Function 2”,正如它的名字一样,是一种从密码派生出加密密钥的算法。这就需要加密算法,也可以用于对密码哈希。更广泛的说明和用法示例

    array_column

    //从数据库获取一列,但返回是数组。  
    $userNames = [];  
    foreach ($users as $user) {  
        $userNames[] = $user['name'];  
    }  
    //以前获取数组某列值,现在如下  
    $userNames = array_column($users, 'name');  

    一个简单的密码散列API

    $password = "foo";    
    // creating the hash    
    $hash = password_hash($password, PASSWORD_BCRYPT);    
    // verifying a password    
    if (password_verify($password, $hash)) {    
        // password correct!    
    } else {    
        // password wrong!    
    }   

    异步信号处理 Asynchronous signal handling

    A new function called pcntl_async_signals() has been introduced to enable asynchronous signal handling without using ticks (which introduce a lot of overhead). 
    增加了一个新函数 pcntl_async_signals()来处理异步信号,不需要再使用ticks(它会增加占用资源)

    pcntl_async_signals(true); // turn on async signals
    pcntl_signal(SIGHUP,  function($sig) {
        echo "SIGHUP\n";
    });
    posix_kill(posix_getpid(), SIGHUP);

    以上例程会输出:

    SIGHUP

    HTTP/2 服务器推送支持 ext/curl

    Support for server push has been added to the CURL extension (requires version 7.46 and above). This can be leveraged through the curl_multi_setopt() function with the new CURLMOPT_PUSHFUNCTION constant. The constants CURL_PUST_OK and CURL_PUSH_DENY have also been added so that the execution of the server push callback can either be approved or denied. 
    蹩脚英语: 
    对于服务器推送支持添加到curl扩展(需要7.46及以上版本)。 
    可以通过用新的CURLMOPT_PUSHFUNCTION常量 让curl_multi_setopt()函数使用。 
    也增加了常量CURL_PUST_OK和CURL_PUSH_DENY,可以批准或拒绝 服务器推送回调的执行

    php.ini中可使用变量

    PHP default_charset 默认字符集 为UTF-8

    ext/phar、ext/intl、ext/fileinfo、ext/sqlite3和ext/enchant等扩展默认随PHP绑定发布。其中Phar可用于打包PHP程序,类似于Java中的jar机制

    PHP7.1不兼容性

    1.当传递参数过少时将抛出错误

    在过去如果我们调用一个用户定义的函数时,提供的参数不足,那么将会产生一个警告(warning)。 现在,这个警告被提升为一个错误异常(Error exception)。这个变更仅对用户定义的函数生效, 并不包含内置函数。例如:

    function test($param){}
    test();

    输出:

    Uncaught Error: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d

    2.禁止动态调用函数

    禁止动态调用函数如下 
    assert() - with a string as the first argument 
    compact() 
    extract() 
    func_get_args() 
    func_get_arg() 
    func_num_args() 
    get_defined_vars() 
    mb_parse_str() - with one arg 
    parse_str() - with one arg

    (function () {
        'func_num_args'();
    })();

    输出

    Warning: Cannot call func_num_args() dynamically in %s on line %d

    3.无效的类,接口,trait名称命名

    以下名称不能用于 类,接口或trait 名称命名: 
    void 
    iterable

    4.Numerical string conversions now respect scientific notation

    Integer operations and conversions on numerical strings now respect scientific notation. This also includes the (int) cast operation, and the following functions: intval() (where the base is 10), settype(), decbin(), decoct(), and dechex().

    5.mt_rand 算法修复

    mt_rand() will now default to using the fixed version of the Mersenne Twister algorithm. If deterministic output from mt_srand() was relied upon, then the MT_RAND_PHP with the ability to preserve the old (incorrect) implementation via an additional optional second parameter to mt_srand().

    6.rand() 别名 mt_rand() 和 srand() 别名 mt_srand()

    rand() and srand() have now been made aliases to mt_rand() and mt_srand(), respectively. This means that the output for the following functions have changes: rand(), shuffle(), str_shuffle(), and array_rand().

    7.Disallow the ASCII delete control character in identifiers

    The ASCII delete control character (0x7F) can no longer be used in identifiers that are not quoted.

    8.error_log changes with syslog value

    If the error_log ini setting is set to syslog, the PHP error levels are mapped to the syslog error levels. This brings finer differentiation in the error logs in contrary to the previous approach where all the errors are logged with the notice level only.

    9.在不完整的对象上不再调用析构方法

    析构方法在一个不完整的对象(例如在构造方法中抛出一个异常)上将不再会被调用

    10.call_user_func()不再支持对传址的函数的调用

    call_user_func() 现在在调用一个以引用作为参数的函数时将始终失败。

    11.字符串不再支持空索引操作符 The empty index operator is not supported for strings anymore

    对字符串使用一个空索引操作符(例如str[]=x)将会抛出一个致命错误, 而不是静默地将其转为一个数组

    12.ini配置项移除

    下列ini配置项已经被移除: 
    session.entropy_file 
    session.entropy_length 
    session.hash_function 
    session.hash_bits_per_character

    PHP7.0 不兼容性

    1、foreach不再改变内部数组指针

    在PHP7之前,当数组通过 foreach 迭代时,数组指针会移动。现在开始,不再如此,见下面代码。

    $array = [0, 1, 2];
    foreach ($array as &$val) {
        var_dump(current($array));
    }

    PHP5输出: 
    int(1) 
    int(2) 
    bool(false) 
    PHP7输出 
    int(0) 
    int(0) 
    int(0)

    2、foreach通过引用遍历时,有更好的迭代特性

    当使用引用遍历数组时,现在 foreach 在迭代中能更好的跟踪变化。例如,在迭代中添加一个迭代值到数组中,参考下面的代码:

    $array = [0];
    foreach ($array as &$val) {
        var_dump($val);
        $array[1] = 1;
    }

    PHP5输出: 
    int(0) 
    PHP7输出: 
    int(0) 
    int(1)

    3、十六进制字符串不再被认为是数字

    含十六进制字符串不再被认为是数字

    var_dump("0x123" == "291");
    var_dump(is_numeric("0x123"));
    var_dump("0xe" + "0x1");
    var_dump(substr("foo", "0x1"));

    PHP5输出: 
    bool(true) 
    bool(true) 
    int(15) 
    string(2) “oo” 
    PHP7输出 
    bool(false) 
    bool(false) 
    int(0) 
    Notice: A non well formed numeric value encountered in /tmp/test.php on line 5 
    string(3) “foo”

    4、PHP7中被移除的函数

    被移除的函数列表如下: 
    call_user_func() 和 call_user_func_array()从PHP 4.1.0开始被废弃。 
    已废弃的 mcrypt_generic_end() 函数已被移除,请使用mcrypt_generic_deinit()代替。 
    已废弃的 mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() 和 mcrypt_ofb() 函数已被移除。 
    set_magic_quotes_runtime(), 和它的别名 magic_quotes_runtime()已被移除. 它们在PHP 5.3.0中已经被废弃,并且 在in PHP 5.4.0也由于魔术引号的废弃而失去功能。 
    已废弃的 set_socket_blocking() 函数已被移除,请使用stream_set_blocking()代替。 
    dl()在 PHP-FPM 不再可用,在 CLI 和 embed SAPIs 中仍可用。 
    GD库中下列函数被移除:imagepsbbox()、imagepsencodefont()、imagepsextendfont()、imagepsfreefont()、imagepsloadfont()、imagepsslantfont()、imagepstext() 
    在配置文件php.ini中,always_populate_raw_post_data、asp_tags、xsl.security_prefs被移除了。

    5、new 操作符创建的对象不能以引用方式赋值给变量

    new 操作符创建的对象不能以引用方式赋值给变量

    class C {}
    $c =& new C;

    PHP5输出: 
    Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3 
    PHP7输出: 
    Parse error: syntax error, unexpected ‘new’ (T_NEW) in /tmp/test.php on line 3

    6、移除了 ASP 和 script PHP 标签

    使用类似 ASP 的标签,以及 script 标签来区分 PHP 代码的方式被移除。 受到影响的标签有:<% %>、<%= %>、

    7、从不匹配的上下文发起调用

    在不匹配的上下文中以静态方式调用非静态方法, 在 PHP 5.6 中已经废弃, 但是在 PHP 7.0 中, 会导致被调用方法中未定义 $this 变量,以及此行为已经废弃的警告。

    class A {
        public function test() { var_dump($this); }
    }
    // 注意:并没有从类 A 继承
    class B {
        public function callNonStaticMethodOfA() { A::test(); }
    }
    (new B)->callNonStaticMethodOfA();

    PHP5输出: 
    Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8 
    object(B)#1 (0) { 
    } 
    PHP7输出 
    Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8 
    Notice: Undefined variable: this in /tmp/test.php on line 3 
    NULL

    8、在数值溢出的时候,内部函数将会失败

    将浮点数转换为整数的时候,如果浮点数值太大,导致无法以整数表达的情况下, 在之前的版本中,内部函数会直接将整数截断,并不会引发错误。 在 PHP 7.0 中,如果发生这种情况,会引发 E_WARNING 错误,并且返回 NULL。

    9、JSON 扩展已经被 JSOND 取代

    JSON 扩展已经被 JSOND 扩展取代。 
    对于数值的处理,有以下两点需要注意的: 
    第一,数值不能以点号(.)结束 (例如,数值 34. 必须写作 34.0 或 34)。 
    第二,如果使用科学计数法表示数值,e 前面必须不是点号(.) (例如,3.e3 必须写作 3.0e3 或 3e3)。

    10、INI 文件中 # 注释格式被移除

    在配置文件INI文件中,不再支持以 # 开始的注释行, 请使用 ;(分号)来表示注释。 此变更适用于 php.ini 以及用 parse_ini_file() 和 parse_ini_string() 函数来处理的文件。

    11、$HTTP_RAW_POST_DATA 被移除

    不再提供 $HTTP_RAW_POST_DATA 变量。 请使用 php://input 作为替代。

    12、yield 变更为右联接运算符

    在使用 yield 关键字的时候,不再需要括号, 并且它变更为右联接操作符,其运算符优先级介于 print 和 => 之间。 这可能导致现有代码的行为发生改变。可以通过使用括号来消除歧义。

    echo yield -1;
    // 在之前版本中会被解释为:
    echo (yield) - 1;
    // 现在,它将被解释为:
    echo yield (-1);
    yield $foo or die;
    // 在之前版本中会被解释为:
    yield ($foo or die);
    // 现在,它将被解释为:
    (yield $foo) or die;

    PHP 7.1.x 中废弃的特性

    1.ext/mcrypt

    mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。

    2.mb_ereg_replace()和mb_eregi_replace()的Eval选项

    对于mb_ereg_replace()和mb_eregi_replace()的 e模式修饰符现在已被废弃

    弃用或废除

    下面是被弃用或废除的 INI 指令列表. 使用下面任何指令都将导致 错误. 
    define_syslog_variables 
    register_globals 
    register_long_arrays 
    safe_mode 
    magic_quotes_gpc 
    magic_quotes_runtime 
    magic_quotes_sybase 
    弃用 INI 文件中以 ‘#’ 开头的注释. 
    弃用函数: 
    call_user_method() (使用 call_user_func() 替代) 
    call_user_method_array() (使用 call_user_func_array() 替代) 
    define_syslog_variables() 
    dl() 
    ereg() (使用 preg_match() 替代) 
    ereg_replace() (使用 preg_replace() 替代) 
    eregi() (使用 preg_match() 配合 ‘i’ 修正符替代) 
    eregi_replace() (使用 preg_replace() 配合 ‘i’ 修正符替代) 
    set_magic_quotes_runtime() 以及它的别名函数 magic_quotes_runtime() 
    session_register() (使用 SESSION)sessionunregister()(使_SESSION 超全部变量替代) 
    session_is_registered() (使用 $_SESSION 超全部变量替代) 
    set_socket_blocking() (使用 stream_set_blocking() 替代) 
    split() (使用 preg_split() 替代) 
    spliti() (使用 preg_split() 配合 ‘i’ 修正符替代) 
    sql_regcase() 
    mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代) 
    mysql_escape_string() (使用 mysql_real_escape_string() 替代) 
    废弃以字符串传递区域设置名称. 使用 LC_* 系列常量替代. 
    mktime() 的 is_dst 参数. 使用新的时区处理函数替代. 
    弃用的功能: 
    弃用通过引用分配 new 的返回值. 
    调用时传递引用被弃用. 
    已弃用的多个特性 allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat42、session.bug_compat_warn 以及 y2k_compliance。

    展开全文
  • 下一个PHP 7里程版本PHP 7.4预计将于2019年11月28日正式发布。因此,现在该让我们深入研究一些最令人兴奋的新增功能和新功能,这些功能将使PHP更快,更可靠。 。 实际上,即使PHP 7.4显着提高了性能并提高了代码的...

    PHP

    下一个PHP 7里程版本PHP 7.4预计将于2019年11月28日正式发布。因此,现在该让我们深入研究一些最令人兴奋的新增功能和新功能,这些功能将使PHP更快,更可靠。 。

    实际上,即使PHP 7.4显着提高了性能并提高了代码的可读性,PHP 8仍将是PHP性能的真正里程碑,因为JIT包含的建议已得到批准。

    无论如何,今天我们正在经历一些我们期望的PHP 7.4最有趣的功能和更改。 因此,在阅读这篇文章之前,请确保保存以下日期:

    6月6日:PHP 7.4 Alpha 1

    7月18日:PHP 7.4 Beta 1 –功能冻结

    11月28日:PHP 7.4 GA发布

    您可以在RFC官方页面上查看功能和添加项的完整列表。


    PHP 7.4发布日期:
    PHP 7.4计划于2019年11月28日发布。它是下一个PHP 7次要版本,应再次提高性能并提高代码的可读性/可维护性。

    PHP 7.4中的PHP有何新功能? 

    在本文中,我们讨论了PHP 7.4最终版本中应在语言中添加的一些更改和功能:

    • 支持数组内解包 – 数组扩展Spread运算符
    • 箭头函数 2.0 (更加简短的闭包)
    • NULL 合并运算符
    • 弱引用
    • 协变返回和逆变参数
    • 预加载
    • 新的自定义对象序列化机制 

    性能提升,数组表达式中引入 Spread 运算符…

    自 PHP 5.6 起可用,参数解包是将数组和 Traversable 解包为参数列表的语法。要解压一个数组或 Traversable,必须以 …(3 点)为前缀,如下例所示:

    function test(...$args) { var_dump($args); }
    test(1, 2, 3);

    然而 PHP 7.4 RFC 建议将此功能扩展到数组中去定义:

    $arr = [...$args];

    Spread 运算符的第一个好处就是性能,RPC 文档指出:

    Spread 运算符应该比 array_merge 拥有更好的性能。这不仅仅是 Spread 运算符是一个语法结构,而 array_merge 是一个方法。还是在编译时,优化了高效率的常量数组

    Spread 运算符的一个显着优点是它支持任何可遍历的对象,而该 array_merge 函数仅支持数组。以下是数组中参数带有 Spread 运算符的示例:

    $parts = ['apple', 'pear'];
    $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
    var_dump($fruits);

    如果在 PHP 7.3 或更早版本中运行此代码,PHP 会抛出一个 Parse 错误:

    Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3

    相反,PHP 7.4 将返回一个数组

    array(5) {
        [0]=>
        string(6) "banana"
        [1]=>
        string(6) "orange"
        [2]=>
        string(5) "apple"
        [3]=>
        string(4) "pear"
        [4]=>
        string(10) "watermelon"
      }

    RFC 声明我们可以多次扩展同一个数组。此外,我们可以在数组中的任何位置使用 Spread Operator 语法,因为可以在 spread 运算符之前或之后添加常规元素。因此,以下代码将按预期工作:

    $arr1 = [1, 2, 3];
    $arr2 = [4, 5, 6];
    $arr3 = [...$arr1, ...$arr2];
    $arr4 = [...$arr1, ...$arr3, 7, 8, 9];

    也可以将函数返回的数组作为参数,放到新数组中:

    function buildArray(){
        return ['red', 'green', 'blue'];
    }
    $arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];

    PHP 7.4 输出以下数组:

    array(6) {
        [0]=>
        string(3) "red"
        [1]=>
        string(5) "green"
        [2]=>
        string(4) "blue"
        [3]=>
        string(4) "pink"
        [4]=>
        string(6) "violet"
        [5]=>
        string(6) "yellow"
    }

    我们也可以使用生成器

      function generator() {
        for ($i = 3; $i <= 5; $i++) {
            yield $i;
        }
      }
      $arr1 = [0, 1, 2, ...generator()];

    但不允许通过引用传递的方式。请考虑以下示例:

    $arr1 = ['red', 'green', 'blue'];
    $arr2 = [...&$arr1];

    如果我们尝试通过传递引用的方式,PHP 会抛出以下 Parse 错误:

    Parse error: syntax error, unexpected '&' in /app/spread-operator.php on line 3

    如果第一个数组的元素是通过引用存储的,那么它们也通过引用存储在第二个数组中。这是一个例子:

      $arr0 = 'red';
      $arr1 = [&$arr0, 'green', 'blue'];
      $arr2 = ['white', ...$arr1, 'black'];

    这是我们用 PHP 7.4 获得的:

      array(5) {
        [0]=>
        string(5) "white"
        [1]=>
        &string(3) "red"
        [2]=>
        string(5) "green"
        [3]=>
        string(4) "blue"
        [4]=>
        string(5) "black"
      }

    箭头函数 2.0 (简短闭包)

    在 PHP 中,匿名函数被认为是非常冗长且难以实现和难以维护的,RFC 建议引入更简单,更清晰的箭头函数(或简短闭包)语法,这样我们就可以简洁地编写代码。在 PHP 7.4 以前:

      function cube($n){
        return ($n * $n * $n);
      }
      $a = [1, 2, 3, 4, 5];
      $b = array_map('cube', $a);
      print_r($b);

    PHP 7.4 允许使用更简洁的语法,上面的函数可以重写如下:

      $a = [1, 2, 3, 4, 5];
      $b = array_map(fn($n) => $n * $n * $n, $a);
      print_r($b);

    目前,由于语言结构,匿名函数(闭包)可以使用 use 继承父作用域中定义的变量,如下所示:

      $factor = 10;
      $calc = function($num) use($factor){
        return $num * $factor;
      };

    但是在 PHP 7.4 中,父级作用域的值是通过隐式捕获的(隐式按值的作用域进行绑定)。所以我们可以用一行来完成一下这个函数

      $factor = 10;
      $calc = fn($num) => $num * $factor;

    父级作用域定义的变量可以用于箭头函数,它跟我们使用 use 是等价的,并且不可能被父级所修改。新语法是对语言的一个很大改进,因为它允许我们构建更易读和可维护的代码。

    NULL 合并运算符

    由于日常使用中存在大量同时使用三元表达式和 isset () 的情况, 我们添加了 null 合并运算符 (??) 这个语法糖。如果变量存在且值不为 NULL, 它就会返回自身的值,否则返回它的第二个操作数。

      $username = $_GET['user'] ?? ‘nobody';

    这段代码的作用非常简单:它获取请求参数并设置默认值(如果它不存在)。但是在 RFC 这个例子中,如果我们有更长的变量名称呢?

    $this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';

    长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC 建议引入 null 合并等于运算符 (null_coalesce_equal_operator)??=,所以我们可以敲下面这段代码来替代上面的这段代码:

      $this->request->data['comments']['user_id'] ??= ‘value’;

    如果左侧参数的值为 null,则使用右侧参数的值。

    注意,虽然 coalesce 运算符 ?? 是一个比较运算符,但 ??= 它是赋值运算符。

    类型属性 2.0

    类型的声明,类型提示,以及指定确定类型的变量传递给函数或类的方法。其中类型提示是在 PHP5 的时候有的一个功能,PHP 7.2 的时候添加了 object 的数据类型。而 PHP7.4 更是增加了主类属性声明,看下面的例子:

      class User {
        public int $id;
        public string $name;
      }

    除了 void 和 callable 外,所有的类型都支持

      public int $scalarType;
      protected ClassName $classType;
      private ?ClassName $nullableClassType;

    为什么不支持 void 和 callable?下面是 RFC 的解释

    The void type is not supported, because it is not useful and has unclear semantics.
    不支持 void 类型,是因为它没用,并且语义不清晰。

    The callable type is not supported, because its behavior is context dependent.
    不支持 callable 类型,因为其行为取决于上下文。

    因此,我们可以放心使用 boolintfloatstringarrayobjectiterableselfparent,当然还有我们很少使用的 nullable 空允许 (?type)

    所以你可以在 PHP7.4 中这样敲代码:

      // 静态属性的类型
      public static iterable $staticProp;
    
      // var 中声明属性
      var bool $flagl
    
      // 设置默认的值
      // 注意,只有 nullable 的类型,才能设置默认值为 null
      public string $str = "foo";
      public ?string $nullableStr = null;
    
      // 多个同类型变量的声明
      public float $x, $y;

    如果我们传递不符合给定类型的变量,会发生什么?

      class User {
        public int $id;
        public string $name;
      }
    
      $user = new User;
      $user->id = 10;
      $user->name = [];
    
      // 这个会产生一个致命的错误
      Fatal error: Uncaught TypeError: Typed property User::$name must be string, array used in /app/types.php:9

    弱引用

    在这个 RFC 中,提议引入 WeakReference 这个类,弱引用允许编码时保留对对象的引用,该引用不会阻止对象被破坏;这对于实现类似于缓存的结构非常有用。

    该提案的作者 Nikita Popov 给出的一个例子:

      $object = new stdClass;
      $weakRef = WeakReference::create($object);
    
      var_dump($weakRef->get());
      unset($object);
      var_dump($weakRef->get());
    
      // 第一次 var_dump
      object(stdClass)#1 (0) {}
    
      // 第二次 var_dump,当 object 被销毁的时候,并不会抛出致命错误
      NULL

    协变返回和逆变参数

    协变和逆变
    百度百科的解释

    • Invariant (不变): 包好了所有需求类型
    • Covariant (协变):类型从通用到具体
    • Contravariant (逆变): 类型从具体到通用目前,PHP 主要具有 Invariant 的参数类型,并且大多数是 Invariant 的返回类型,这就意味着当我是 T 参数类型或者返回类型时,子类也必须是 T 的参数类型或者返回类型。但是往往会需要处理一些特殊情况,比如具体的返回类型,或者通用的输入类型。而 RFC 的这个提案就提议,PHP7.4 添加协变返回和逆变参数,以下是提案给出来的例子:协变返回:
    interface Factory {
      function make(): object;
    }
    
    class UserFactory implements Factory {
      // 将比较泛的 object 类型,具体到 User 类型
     function make(): User;
    }

    逆变参数:

    interface Concatable {
      function concat(Iterator $input); 
    }
    
    class Collection implements Concatable {
      // 将比较具体的 `Iterator`参数类型,逆变成接受所有的 `iterable`类型
      function concat(iterable $input) {/* . . . */}
    }

    预加载

    这个 RFC 是由 Dmitry Stogov 提出的,预加载是在模块初始化的时候,将库和框架加载到 OPCache 中的过程,如下图所示

    引用他的原话:

    On server startup – before any application code is run – we may load a certain set of PHP files into memory – and make their contents “permanently available” to all subsequent requests that will be served by that server. All the functions and classes defined in these files will be available to requests out of the box, exactly like internal entities.
    服务器启动时 – 在运行任何应用程序代码之前 – 我们可以将一组 PHP 文件加载到内存中 – 并使得这些预加载的内容,在后续的所有请求中 “永久可用”。这些文件中定义的所有函数和类在请求时,就可以开箱即用,与内置函数相同。

    预加载由 php.ini 的 opcache.preload 进行控制。这个参数指定在服务器启动时编译和执行的 PHP 脚本。此文件可用于预加载其他文件,或通过 opcache_compile_file() 函数

    这在性能上有很大的提升,但是也有一个很明显的缺点,RFC 提出来了

    preloaded files remain cached in opcache memory forever. Modification of their corresponding source files won’t have any effect without another server restart.

    预加载的文件会被永久缓存在 opcache 内存中。在修改相应的源文件时,如果没有重启服务,修改就不会生效。

    新的自定义对象序列化机制 

    这是尼基塔·波波夫(Nikita Popov)的另一项建议 ,得到了绝大多数票的批准。

    当前,我们有两种不同的机制可以在PHP中对对象进行自定义序列化:

    • __sleep()__wakeup()魔术方法
    • Serializable接口

    根据Nikita的说法,这两个选项都存在导致复杂且不可靠的代码的问题。 您可以在RFC深入研究此主题。 在这里,我只提到新的序列化机制应该通过提供两个结合了两个现有机制的新魔术方法__serialize()__unserialize()来防止这些问题。

    该提案以20票对7票获得通过。

    PHP7.4 又将废弃什么功能呢?

    更改连接运算符的优先级

    目前,在 PHP 中 + , - 算术运算符和 . 字符串运算符是左关联的, 而且它们具有相同的优先级。例如:

      echo "sum: " . $a + $b;

    在 PHP 7.3 中,此代码生成以下警告:

      Warning: A non-numeric value encountered in /app/types.php on line 4

    这是因为这段代码是从左往右开始的,所以等同于:

      echo ("$sum: " . $a) + $b;

    针对这个问题,这个 RFC 建议更改运算符的优先级,使 . 的优先级低于 + ,- 这两个运算符,以便在字符串拼接之前始终执行加减法。所以这行代码应该等同于以下内容:

      echo "$sum: " . ($a + $b);

    这个提案分为两步走:

    • 从 PHP7.4 开始,当遇见 + - 和 . 在没有指明执行优先级时,会发出一个弃用通知。
    • 而真正调整优先级的这个功能,会在 PHP8 中执行弃用左关联三元运算符在 PHP 中,三元运算符与许多其他语言不同,它是左关联的。而根据 Nikita Popof 的所说:对于在不同语言之间切换的编程人员来说,会令他们感到困扰。比如以下的例子,在 PHP 中是正确的:$b = $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : 'other';它会被解释为:$b = (($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : 'other';对于这种复杂的三元表现形式,它很有可能不是我们希望的方式去工作,容易造成错误。因此,这个 RFC 提议删除并弃用三元运算符的左关联使用,强制编程人员使用括号。这个提议分为两步执行:
    • 从 PHP7.4 开始,没有明确使用括号的嵌套三元组将抛出弃用警告。
    • 从 PHP 8.0 开始,将出现编译运行时错误。

    php7.4性能

    出于对PHP 7.4的Alpha预览版性能状态的好奇,我今天针对使用Git构建的PHP 7.3.6、7.2.18、7.1.29和7.0.32运行了一些快速基准测试,并且每个发行版均以相同的方式构建。

    在此阶段,PHPBench的7.4性能与PHP 7.3稳定版相当,已经比PHP 7.0快了约30%…当然,与PHP 5.5的旧时代相比,收益甚至更大。

    在微基准测试中,PHP 7.4的运行速度仅比PHP 7.3快一点,而PHP-8.0的性能却差不多,至少要等到JIT代码稳定下来并默认打开为止。

    在Phoronix测试套件的内部PHP自基准测试中,PHP 7.4的确确实处于PHP 7.3性能水平之上-至少在此Alpha前状态下。 自PHP 7.0起,取得了一些显着的进步,而自PHP5发行缓慢以来,也取得了许多进步。

    总结:PHP7.4是一个令人期待的版本,但是PHP8才是整个PHP界最重大的事情。

     

    参考链接:

    令人期待的 PHP7.4

    https://kinsta.com/blog/php-7-4/

    An Early Look At Some PHP 7.4 Performance Benchmarks

     

    展开全文
  • php7和php5对比

    万次阅读 多人点赞 2018-07-31 22:35:23
    PHP7来一发 PHP7正式发布到现在已经一年半了,刚出道就号称比旧版本快了几倍,各种开源框架或系统运行在PHP7上速度效率提高了几倍,反正不管是媒体还是开发者都在煽风点火,不,应该是赞不绝口。 我就静静看你们...

    PHP7来一发

    PHP7正式发布到现在已经一年半了,刚出道就号称比旧版本快了几倍,各种开源框架或系统运行在PHP7上速度效率提高了几倍,反正不管是媒体还是开发者都在煽风点火,不,应该是赞不绝口。
    我就静静看你们装逼,不说话。

    一般手机系统升级我是跑最后的,因为不愿意踩坑,毕竟iOS和Android这种系统都会出现bug,何况世界上被人黑的最多的语言。

    今日时机已到,看看PHP7有没有传说的那么王炸。

    安装两个PHP版本

    http://php.net/ 已经有最新PHP7的最新版本,大家可自行下载。
    为了测试PHP5和PHP7(PHP6已被放弃,心疼1s)的性能,我在不同的目录安装了两个php版本。

    安装过程就略过了,无论源码安装还是包管理工具安装,记得自己的路径即可。

    PHP7:

    # /usr/local/php7/bin/php -v
    PHP 7.1.5 (cli) (built: May 13 2017 23:36:41) ( NTS )
    Copyright (c) 1997-2017 The PHP Group
    Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    

    PHP5:

    # /usr/bin/php -v
    PHP 5.6.30 (cli) (built: Jan 19 2017 22:31:39) 
    Copyright (c) 1997-2016 The PHP Group
    Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    

    环境说明:为了保证最佳的测试效果,本次测试在直接在生产环境进行,更逼近真实情况。
    操作系统:CentOS 7.2 64位
    基础配置:1核 1GB 1Mbps
    主机品牌:腾讯云

    PHP7和PHP5的对决

    1. 纯php脚本测试

    vim test.php

    $arr = array();
    for ($i = 0; $i < 500000; $i++) {
            $arr[$i] = $i;
    }
    
    $tmp = array();
    foreach ($arr as $i) {
        if ($i % 2 == 0) {
            $is_exists = array_key_exists($i, $arr);
            if ($is_exists) {
               array_push($tmp, $i);
            }
        }
    }
    

    PHP5版本测试:

    time /usr/bin/php test.php 
    real    0m0.301s
    user    0m0.239s
    sys     0m0.050s
    --------------------------
    time /usr/bin/php test.php
    real    0m0.310s
    user    0m0.241s
    sys     0m0.054s
    --------------------------
    time /usr/bin/php test.php
    real    0m0.289s
    user    0m0.238s
    sys     0m0.050s
    

    PHP7版本测试:

    time /usr/local/php7/bin/php test.php
    
    real    0m0.087s
    user    0m0.063s
    sys     0m0.024s
    -------------------------------------
    time /usr/local/php7/bin/php test.php
    
    real    0m0.106s
    user    0m0.073s
    sys     0m0.033s
    --------------------------------------
    time /usr/local/php7/bin/php test.php
    
    real    0m0.083s
    user    0m0.061s
    sys     0m0.022s
    

    通过数据可以看出来,单纯的php脚本测试,可以看出php7性能提升了3到4倍。

    2.php数据库操作测试

    首先我们创建一个用户表:

    Table: test_user
    Create Table: CREATE TABLE `test_user` (
      `uid` int(11) NOT NULL AUTO_INCREMENT,
      `name` char(100) NOT NULL DEFAULT '',
      PRIMARY KEY (`uid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
    

    给test_user表插入一条数据:

    insert into test_user (uid,name) values (1,"dada");
    MariaDB [test]> select * from test_user;
    +-----+------+
    | uid | name |
    +-----+------+
    |   1 | dada |
    +-----+------+
    

    创建数据库测试脚本test_db.php,确保你的两个PHP版本都安装了PDO扩展。

    /usr/bin/php -m|grep pdo
    pdo_mysql
    pdo_sqlite
    
    /usr/local/php7/bin/php -m|grep pdo
    pdo_mysql
    pdo_sqlite
    

    我的两个PHP版本已经安装了PDO(不要再使用php_mysql扩展,已经过时了,PHP7已经完全抛弃,mysqli也不建议使用)。

    接下来我们通过PDO编写脚本,测试select执行50万次的性能对比:

    $host = "yourHost";
    $user = "yourUser";
    $pass = "yourPass";
    $db   = "test";
    $port = 3306;
    
    try
    {
      $dbh = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
      echo "Connected<p>";
    }
    catch (Exception $e)
    {
      echo "Unable to connect: " . $e->getMessage() ."<p>";
    }
    
    $sql = "select  SQL_NO_CACHE * from test_user;";
    $tmp = array();
    for ($i=1; $i<=500000; $i++) {
      $ret = $dbh->query($sql);  
      foreach ($ret as $row) {
        $tmp['id']   = $row['id'];
        $tmp['name'] = $row['name'];
      }
    }
    

    PHP5测试test_db.php:

    time /usr/bin/php test_db.php
    real    0m48.396s
    user    0m11.149s  
    sys     0m3.998s
    
    real    0m51.447s
    user    0m11.800s
    sys     0m4.395s
    
    real    0m51.517s
    user    0m11.733s
    sys     0m4.439s
    
    

    PHP7测试test_db.php:

    real    0m47.900s
    user    0m9.875s
    sys     0m4.130s
    
    real    0m46.977s
    user    0m9.760s
    sys     0m3.983s
    
    real    0m50.010s
    user    0m10.268s
    sys     0m4.307s
    

    这次脚本执行了50w次查询,user执行时间PHP7执行的脚本几乎都比PHP5要少一秒!是少一秒不是一毫秒。

    3.PHP框架测试

    • thinkphp

    国内肯定是首选thinkphp框架,选择最新的thinkphp5。我这里直接在官网下载的thinkphp5.0.9版本。

    • (一)框架入口测试

    PHP5下的测试:

    time /usr/bin/php ./public/index.php
    real    0m0.036s
    user    0m0.026s
    sys     0m0.010s
    
    real    0m0.038s
    user    0m0.026s
    sys     0m0.012s
    
    real    0m0.041s
    user    0m0.032s
    sys     0m0.009s
    

    PHP7下的测试:

    time /usr/local/php7/bin/php ./public/index.php
    real    0m0.027s
    user    0m0.021s
    sys     0m0.005s
    
    real    0m0.027s
    user    0m0.018s
    sys     0m0.009s
    
    real    0m0.025s
    user    0m0.023s
    sys     0m0.002s
    

    在入口测试下,可以看到PHP和PHP7没有太大的区别,但PHP7还是稍微快一点。

    • (二)框架逻辑测试
      在框架入口复用第一步的逻辑:
    <?php
    namespace app\index\controller;
    
    class Index
    {
        public function index()
        {
           $arr = array();
           for ($i = 0; $i < 500000; $i++) {
               $arr[$i] = $i;
           }
    
           $tmp = array();
           foreach ($arr as $i) {
               if ($i % 2 == 0) {
                   $is_exists = array_key_exists($i, $arr);
                   if ($is_exists) {
                       array_push($tmp, $i);
                   }
              }
          }
        }
    }
    

    PHP5版本:

    time /usr/bin/php ./public/index.php
    real    0m0.538s
    user    0m0.463s
    sys     0m0.072s
    
    real    0m0.454s
    user    0m0.386s
    sys     0m0.065s
    
    real    0m0.387s
    user    0m0.331s
    sys     0m0.055s
    

    PHP7版本:

    time /usr/local/php7/bin/php ./public/index.php
    real    0m0.150s
    user    0m0.123s
    sys     0m0.024s
    
    real    0m0.137s
    user    0m0.105s
    sys     0m0.031s
    
    real    0m0.123s
    user    0m0.096s
    sys     0m0.026s
    

    在thinkphp框架中使用PHP7版本,性能提升大约是PHP5版本的4倍!

    • laravel

    然后我们测试下现在最火热的PHP艺术家的框架。

    • (一) 框架入口测试
      PHP5版本:
    time /usr/bin/php ./public/index.php
    
    real    0m0.104s
    user    0m0.081s
    sys     0m0.022s
    
    real    0m0.148s
    user    0m0.122s
    sys     0m0.025s
    
    real    0m0.122s
    user    0m0.100s
    sys     0m0.021s
    

    PHP版本

    time /usr/local/php7/bin/php ./public/index.php
    
    real    0m0.079s
    user    0m0.064s
    sys     0m0.015s
    
    real    0m0.081s
    user    0m0.067s
    sys     0m0.014s
    
    real    0m0.067s
    user    0m0.054s
    sys     0m0.013s
    

    我们可以看到laravel的框架入口测试中,PHP5和PHP7的表现差异不大,但即使PHP5最高快的0.081s也比PHP7版本最慢的0.067s要慢。所以PHP7还是更胜一筹。

    • (二)框架逻辑测试
      尝试增加一点逻辑,和thinkphp一样,复用测试逻辑。
      首先修改laravel路由,直接调用UserController的index方法:
    Route::get('/', 'UserController@index');
    

    在index方法中写入测试逻辑:

    public function index()
    {
          $arr = array();
           for ($i = 0; $i < 500000; $i++) {
               $arr[$i] = $i;
           }
    
           $tmp = array();
           foreach ($arr as $i) {
               if ($i % 2 == 0) {
                   $is_exists = array_key_exists($i, $arr);
                   if ($is_exists) {
                       array_push($tmp, $i);
                   }
              }
          }
    }
    

    PHP5版本

    time /usr/bin/php ./public/index.php
    real    0m0.510s
    user    0m0.377s
    sys     0m0.079s
    
    real    0m0.627s
    user    0m0.447s
    sys     0m0.091s
    
    real    0m0.519s
    user    0m0.436s
    sys     0m0.079s
    

    PHP7版本

    time /usr/local/php7/bin/php ./public/index.php
    
    real    0m0.201s
    user    0m0.167s
    sys     0m0.032s
    
    real    0m0.216s
    user    0m0.174s
    sys     0m0.040s
    
    real    0m0.169s
    user    0m0.134s
    sys     0m0.034s
    

    PHP7性能提升了3到4倍

    压力测试

    1000个请求,50个并发

    • PHP5版本:

     

    image.png

     

    三次样本如下:

     

    image.png

     

    image.png

     

    image.png

    • PHP7版本:

       

       

      1

     

    2

     

    3

     

    4

    通过压力测试,在PHP7版本下,可以看到单个请求时间和请求完成时间以及每个连接请求实际运行时间的平均值都耗时更少,最重要的性能指标QPS也是高于PHP5的版本。

    PHP7的opcache性能测试

    开启opcache:

     

    image.png

     

    image.png

     

    image.png

     

    image.png

    卧槽!开启了opcache的PHP7果然是要起飞的节奏,相比未开启的PHP7性能提升了十几倍,相比PHP5提升了将进20倍!问你怕不怕!

    PHP脚本测试数据如下:

     

    PHP7 vs PHP5.png

     

    纯php脚本测试过程,PHP7性能大约是PHP5的3到4倍。

    压力测试数据如下:

     

     

    PHP5 vs PHP7 vs PHP7+OPCACHE.png

    结论:

    本文对PHP7和PHP5进行简单对比,性能确实有3到4倍提升,无论是在php纯脚本中,还是在框架中,PHP7高性能的表现都是一致的。

    PHP7很快,PHP7+OpCache飞快,PHP7确实牛逼,PHP的新时代已来临,赶紧用起来!

    展开全文
  • 本课程我们将详细的为您讲解怎么使用php处理视频,比如:上传视频,视频格式转码(所有格式转换为mp4),自动视频抓图(生成缩略图)等等 亮点二:强大的用户系统功能 本项目强大的用户功能,比如最基础的注册登录...
  • PHP7自定义函数

    万人学习 2017-08-20 09:57:29
    King老师精心打造的PHP7自定义函数课程,在PHP中提供了强大的系统函数来帮我们完成功能,但有时候只用系统函数往往还是不够的,还需要根据业务来封装自定义函数,本课程讲解了如何自定义函数,以及自定义函数中常见...
  • PHP7.2源码安装

    千次阅读 2019-05-07 11:03:07
    一、下载php7.2版本的安装包 1.下载 2.上传到服务器的root目录 pwd:查看当前目录 ll:查看当前目录下的文件 二.解压 tar -xjvfphp-7.2.18.tar.bz 三.configure(编译) cd php-7.2.18 ./configure --...

    一、下载php7.2版本的安装包

    1.下载

    2.上传到服务器的root目录

    pwd:查看当前目录

    ll:查看当前目录下的文件

    二.解压

    tar -xjvf php-7.2.18.tar.bz

    三.configure(编译)

    cd php-7.2.18

    ./configure --prefix=/home/work/study

     

    四.make(构建)

    make

    make test

    五.make install

    linux对php操作的一些命令

    cd php ——进入到php

    cd ..——进入上级目录

    .bin/php -m  查看它的扩展

    vi test.php ——创建一个test.php文件夹

    <?php

    echo time();

    :wq——保存并退出

    按esc到命令模式

    按i编辑文本模式

    1、:w   保存文件但不退出vi 

    2、:w file 将修改另外保存到file中,不退出vi 

    3、:w!  强制保存,不推出vi

    4.、:wq  保存文件并退出vi 

    5、:wq! 强制保存文件,并退出vi

    6、:q 不保存文件,退出vi

    7、:q!不保存文件,强制退出vi 

    ./bin/php test.php ——执行

    六、简化php执行命令

    1.编辑根目录下的 .bash_profile文件(vi ~/.bash_profile)

    2.source ~/.bash_profile

    3.php -v

    测试

    总结:php源码安装的时候会遇到哪些坑?

    1.gcc autoconfig——如果没有编译的时候系统会提示需要装这两个软件

    2.编译后的文件,没有php.ini文件

    cp php.ini-development /home/work/study/ect/——复制到编译后的文件夹中

    mv php.ini-development php.ini——改名字

    改了php.ini的配置,不生效

    php -i |grep php.ini  

    所以将php.ini移动到lib下面

    mv ./etc/php.ini ./lib

    展开全文
  • 话说当年追时髦,php7一出就给电脑立马装上了,php5和php7共存,也是立马写了个超级耗时间的循环脚本测了一番,确实php7给力很多,然后也是注意了一些新增的特性与一些丢弃掉的用法。 由于php升级乃头等大事,公司...
  • 此篇张是我对PHP7跟PHP以前版本做的一个对比。 我们来看下PHP更新出来的各种版本:   首先先来说下PHP7带来的新东西 1.类型的声明。 可以使用字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)...
  • PHP7 引入的“??” 和“?:”的区别

    万次阅读 2018-09-13 18:39:03
    PHP7 引入的“??” 和“?:”的区别 实践出真知~ 测试代码 输入测试: 1 &amp;amp;amp;amp;lt;?php 2 $array = [ 3 'a' =&amp;amp;amp;amp;gt; 1, 4 'b' =&amp;amp;amp;amp;...
  • Php7.3安装

    千次阅读 2019-04-27 11:45:05
    首先安装(安装过了就不用安装了): mysql:https://blog.csdn.net/qq_40200087/article/details/89479137 nginx:... 下载:https://www.php.net/downloads.php#v7.3.4 ...
  • PHP7新特性 What will be in PHP 7/PHPNG

    万次阅读 多人点赞 2015-04-17 11:18:37
    PHP7将在2015年10月正式发布,我们来看看官网给出的php7 特性 官网:http://www.php7.ca/ https://wiki.php.net/phpng
  • PHP7新特性总结

    万次阅读 2018-04-22 10:54:59
     话说当年追时髦,php7一出就给电脑立马装上了,php5和php7共存,也是立马写了个超级耗时间的循环脚本测了一番,确实php7给力很多,然后也是注意了一些新增的特性与一些丢弃掉的用法。 由于php升级乃头等大事,...
  • 课前小知识普及:MSSQL和SQL Server是同一个软件,叫法不同而已,MSSQL全称是Microsoft ...最近有用户在使用PHPWAMP的时候,向我咨询一个问题,就是关于PHP如何连接MSSQL数据库。 平时我们搭建网站通常是PHP+My...
  • php集成环境和自己配置的区别?PHP绿色集成环境和自己安装的有什么区别吗?PHP集成环境与安装版的区别?php集成环境、php绿色集成环境、php独立安装版环境这三者的区别
  • yum安装最新版php7

    万次阅读 多人点赞 2017-06-16 11:20:09
    1、首先要更新yum源,不然肯定是老版本,一般都在5.6及以下,但是php7都出来好久了,性能提升50%以上! 按照系统更新yum源,我的是centos7,所以我运行下面的代码! CentOS/RHEL 7.x: rpm -Uvh ...
  • 目前有很多网友自发在网上编写了PHPWAMP的使用教程,对于他们的热心我表示感谢, 但是他们有些地方的理解还是有误的,大家查看非官方教程时需要自行判断正确性。 建议大家查看我写官方教程,后期也会在CSDN发布...
  • Centos安装PHP7及配置php-fpm开机启动

    万次阅读 2018-11-13 16:47:55
    centos 7 编译安装 php-7.2.11的步骤 在官网下载php-7.2.11的php压缩包,centos 7 安装 php-7.2.11的步骤,http://cn2.php.net/distributions/php-7.2.11.tar.gz cd /usr/local/src wget-c...
  • PHP5.6升级PHP7总结

    千次阅读 2019-04-07 16:55:21
    话说当年追时髦,php7一出就给电脑立马装上了,php5和php7共存,也是立马写了个超级耗时间的循环脚本测了一番,确实php7给力很多,然后也是注意了一些新增的特性与一些丢弃掉的用法。 由于php升级乃头等大事,公司...
  • PHPWAMP集成环境Zend组件的相关介绍,站点管理默认已经全部安装Zend解密
  • php7和php5区别

    万次阅读 2018-04-03 11:30:25
    1、php标量类型和返回类型声明 #主要分为两种模式,强制性模式和严格模式 declare(strict_types=1) #1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。 2、NULL合并运算符 $site = is...
  • ①、服务器nginx 、php 、mysql都是安装好的,于是想直接升级php7. ②按照文章:https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral 进行操作,中途出现一些不一样的地方...
  • PHPWAMP内置IIS管理器一键搭建PHP网站,支持无限个不同PHP版本同时运行
  • PHP7基础入门

    万人学习 2017-08-18 12:03:19
    King老师精心打造PHP7入门教程,由浅入深讲解了什么是PHP,PHP环境搭建,PHP基础语法等,是PHP入门教程! 山哥出品,必属精品!
  • PHP7会话控制

    万人学习 2017-08-16 10:41:49
    King老师精心打造的PHP7会话控制课程,由浅入深的讲解了PHP中的会话控制思想,解决方案,详细剖析了PHP中的session和cookie的使用,并通过实战案例进行实战演练,让我们一起开启会话控制之旅吧~ 山哥出品,必属精品...
  • 1、卸掉之前的本地环境(php、Apache、mysql),如果本地默认开启了IIS服务,需将IIS服务关闭(端口占用),虽然可以改Apache服务端口,但是访问时带端口访问,总让人感觉别扭。 IIS服务关闭方法:win+R键,输入...
  • php7 + php-fpm + nginx 完整源码编译安装

    万次阅读 2018-08-02 14:00:17
    1.下载所有待编译安装的包 ...wgethttp://cn2.php.net/distributions/php-7.2.8.tar.gz php 装好后自带php-fpm 注意: 如果发现装好后没带php-fpm,那十有八九是你编译的configure那条命令参数没带全,注意有个...
  • CentOS7 安装 PHP7 完全详细教程

    万次阅读 2019-08-12 10:26:04
    CentOS7的默认PHP版本是PHP5,但是如果我们要安装PHP7,不需要将现有的PHP5删除,只要将PHP升级到PHP7即可。 使用 yum provides php 命令可以获取CentOS7的PHP包安装情况。显示的是在现有的安装源中能够安装的最新...
  • centos7安装php7 php-fpm nginx mariadb及解决php7与php-fpm冲突的问题 简介 关闭SELINUX 设置80、3306端口开放 可用的php7源 安装nginx服务器 安装MariaDB数据库 重启nginx、php-fpm、MariaDB 小问题集锦 简介 ...
  • Centos下PHP5升级PHP7

    万次阅读 2017-12-22 10:35:09
    首先下载PHP7安装包,使用wget http://am1.php.net/distributions/php-7.2.0.tar.bz2,或者直接访问下载,然后ftp到linux服务器 解压压缩包,tar –xjf php-7.0.2.tar.bz2 进入文件夹,cd php-7.0.2 ,安装必要的...
  • 浅析PHP7新功能及语法变化总结

    万次阅读 2016-09-12 22:04:51
    这篇文章主要介绍了浅析PHP7新功能及语法变化总结的相关资料,需要的朋友可以参考下 标量类型声明 有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符...

空空如也

1 2 3 4 5 ... 20
收藏数 2,243,576
精华内容 897,430
关键字:

php7