📜  PHP 7 |特征

📅  最后修改于: 2022-05-13 02:24:09.469000             🧑  作者: Mango

PHP 7 |特征

PHP7 中添加了许多功能。 PHP7发布后,网站性能提升了25-70%。下面我们将通过实例一一讨论PHP7的特性。

标量数据类型提示:标量数据类型是 boolean、integer、float 和字符串 。早些时候,我们无法对标量数据类型进行类型提示。我们正在对数组或类对象进行提示。

例子:


输出:

object(User)#1 (0) {
}

现在让我们看看如何对 Php7 中可用的标量数据类型进行类型提示




输出:

37

我们在第二个参数字符串'34' 中传递一个字符串,但我们在这里得到的输出是 34 和 3 的相加,即 37,因为这里禁用了严格模式。现在如果你想限制这个,你需要在文件的顶部给出一个声明。
例子:


输出:

Fatal error: Uncaught TypeError: Argument 2 passed to add() must be of the type integer,
string given, called in /home/cg/root/5012177/main.php on line 11 and defined 
in /home/cg/root/5012177/main.php:7
Stack trace:
#0 /home/cg/root/5012177/main.php(11): add(3, '34')
#1 {main}
  thrown in /home/cg/root/5012177/main.php on line 7
PHP Fatal error:  Uncaught TypeError: Argument 2 passed to add() must be of the type integer,
string given, called in /home/cg/root/5012177/main.php on line 11 and defined 
in /home/cg/root/5012177/main.php:7
Stack trace:
#0 /home/cg/root/5012177/main.php(11): add(3, '34')
#1 {main}
  thrown in /home/cg/root/5012177/main.php on line 7

现在让我们看看布尔的例子。下面是布尔数据类型的代码。
例子:


输出:

bool(true)

返回类型声明:在 C 或 C++ 中,定义将从函数返回的值的数据类型。现在我们将看到如何在 PHP7 中做到这一点。
例子:


输出:

array(0) {
}

在上面的例子中声明了一个函数,需要给数据类型 using: 然后在函数test() 中返回相同数据类型的数组。



空合并算子:空合并运算符是“??”。这个运算符基本上取代了三元运算符。早些时候我们使用三元运算符,如下所示……


输出:

string(9) "Not Found"

现在使用'??'运算符我们可以缩短代码。
例子:


输出:

string(9) "Not Found"

摸索导入和命名空间:早些时候,当我们必须定义多个命名空间和类并将一个类从一个命名空间使用或导入到另一个命名空间时,我们使用了“use”关键字,然后我们必须为命名空间提供需要导入的类名。
例子:


输出:

object(Course\BTech)#1 (0) {
}
object(Course\MTech)#1 (0) {
}

在上面的示例中,导入两个类,但是如果您需要使用从一个命名空间到另一个命名空间的多个类呢?它必须编写多行“use”语句来定义每个类,这会使您的代码变得冗长。所以在 PHP7 中引入了分组导入来解决这个问题。让我们看看上面的示例如何在分组导入和嵌套命名空间的帮助下工作。
例子:


输出:

object(Course\BTech)#1 (0) {
}
object(Course\MTech)#1 (0) {
}
object(Course\Branch\CSE)#1 (0) {
}

所以分组导入会减少代码,会更易读和方便。

综合比较/飞船运营商:综合比较运算符是三家运算符的结合。这些运算符是小于、大于和等于。三个运算符的组合运行,输出将根据结果而变化。现在让我们以这个运算符为例。



例子:

 strlen($b); 
});
   
var_dump($arr);
   
?>

输出:

array(3) {
  [0]=>
  string(2) "to"
  [1]=>
  string(7) "welcome"
  [2]=>
  string(13) "geeksforgeeks"
}

在上面的示例中,我们比较数组中定义的单词的长度并按升序对其进行排序。 usort() 是一个PHP预构建函数,其中传递一个数组作为第一个参数,第二个参数是用户定义的函数,表示您自己的自定义逻辑函数。从此链接 usort() 阅读有关 usort()函数的更多信息。因此,我们可以使用 spaceship 或组合运算符来完成相同的任务,而不是手动使用 if 和 else。

匿名类: PHP7 引入了匿名类,现在的问题是什么时候使用它们?当您只使用一次类并且不希望它再次被实例化时。首先让我们看看我们通常如何创建一个类和对象。

例子:

hiGeeks();
?>

输出:

geeksforgeeks

现在让我们看看如何创建一个匿名类。
例子:

readme;
  }
};
$anonymous -> printOut();
?>

输出:

Welcome to geeksforgeeks

在这里我们可以为这个类创建一个对象,但我们可以扩展另一个类。
例子:

hiGeeks();
   
$anonymous = new class extends test{
    private $readme  = "Welcome to geeksforgeeks";
    function printOut() {
        echo $this->readme;
    }
};
   
$anonymous -> printOut();
$anonymous -> hiGeeks();
?>

输出:



geeksforgeeks Welcome to geeksforgeeksgeeksforgeeks

Closure::call() 方法: PHP7 引入了一个新方法 call(),它是在绑定对象作用域的同时调用闭包的一种简写方式。大多数时候在 JavaScript 中我们使用闭包,它是匿名函数,在PHP 5 中我们也使用闭包,但在 PHP7 中我们以不同的方式使用它。
例子:

username = $username;
        $this->email= $email;
    }
}
   
$getUserEmail = function() {
    return $this->username. ' email address is '.$this->email;
};
   
$user = new User('abc','abc@gmail.com');
  
// Using PHP5 
$email = $getUserEmail->bindTo($user, 'User');
echo $email().'  ';
   
// Using PHP7
echo $getUserEmail->call($user);
?>

输出:

abc email address is abc@gmail.com  abc email address is abc@gmail.com

所以 call() 方法使我们的代码更简洁易用。

生成器:在 PHP 中进行编程变得更加强大,因为引入了一些新功能,例如带有生成器的“返回”和其中的产量。我们将看到它的层次结构在 PHP7 中是如何工作的。
例子:

'. $value;
}
  
echo '
'. $control->getReturn();     ?>

输出:

200300500

在上面的例子中,为了获得 yield 的值,我们使用了 foreach 循环,而为了获得 return 的值,我们使用了 getReturn()。这里我们需要处理 order 来获取 yield 和 return 的值。如果我们更改顺序,我们将收到错误消息。
例子:

'. $control->getReturn();
   
foreach ($control as $value) {
    echo '
'. $value; }     ?>

输出:

PHP Fatal error:  Uncaught Exception: Cannot get return value of a generator that
hasn't returned in /home/cg/root/6474693/main.php:14
Stack trace:
#0 /home/cg/root/6474693/main.php(14): Generator->getReturn()
#1 {main}
  thrown in /home/cg/root/6474693/main.php on line 14

所以在上面的例子中,我们试图首先获取 return 和 yield 的值,这会给你一个错误。同样在 PHP7 中,它允许从另一个生成器函数产生。我们可以编写多个生成器函数,您可以允许它们链接到另一个。

例子:

'. $value;
}
  
echo '
'. $control->getReturn();    ?>

输出:



This is from Gen2This is from Gen200This is from Gen3This is from Gen300300500

错误处理:错误和异常实现 Throwable 接口。我们可以使用 try/catch 块来处理错误对象和异常。

  1. 类型错误:当某些类型的错误与类型声明不匹配时会发生此错误。
  2. 解析错误:当代码或包含文件中存在语法错误时会发生此错误。
  3. 断言错误:当不满足断言设置的条件时会发生此错误。

在 PHP7 中,我们可以以优雅的方式处理错误,并且可以在发生异常时抛出异常。 Php7 之前的致命错误不会调用错误处理程序并停止脚本并且无法正确关闭资源。让我们看看 Throwable 接口。

interface Throwable
{
    public function getMessage(): string;
    public function getCode(): int;
    public function getFile(): string;
    public function getLine(): int;
    public function getTrace(): array;
    public function getTraceAsString(): string;
    public function getPrevious(): Throwable;
    public function __toString(): string;
}

下面是如何在 try/catch 块中使用 Throwable 的语法。

try {
  // Code
}catch(Throwable $e) {
  // Exceptions or Error handling
}
  1. 致命错误处理:下面是以更优雅的方式处理致命错误的示例,我们还将看到如何正确关闭资源。

    例子:

    ';
        }
           
        public function __destruct() {
           echo 'User Destruct...
    ';      }         }     function run($object) {     $object->hello(); }     try {     $user = new User();     run(null);    // Use Error instead of exception to // generate custom error message     } catch (Error $e) {     echo 'Error on Line: '.$e->getLine().' in '         .$e->getFile().''. $e->getMessage().'
    '; } finally {     echo 'Finally Ran...
    '; }     ?>

    输出:

    User Construct...Error on Line: 16 in /home/cg/root/6474693/main.php
    Call to a member function hello() on nullFinally Ran...User Destruct...
    

    Sa o 这是我们如何处理致命错误,我们可以正确关闭我们的资源并创建自定义消息。如果我们在像 'catch (Exception $e)' 这样的 catch 块中使用 'Exception' 而不是 'Error',我们将不会得到从我们端创建的正确消息,所以使用 Error 而不是 Exception。

  2. 类型错误和解析错误处理:我们可以像处理致命错误一样处理类型错误和解析错误。让我们先看看如何处理类型错误。下面是我们试图获取两个整数中的一些并进行类型提示的示例。

    例子:

    ';
        }
           
        public function __destruct() {
           echo 'User Destruct...
    ';      }         }     function sum(int $num1, int $num2) {     return $num1 + $num2; }     try {     $user = new User();     echo sum('Test', 2); } catch(Exception $e) {     echo $e->getMessage(); } catch(Error $e) {     echo ''.get_class($e). 'on line '.         $e->getLine().':'.$e->getMessage().'
    '; }     ?>

    输出:

    User Construct...TypeError on line 15:Argument 1 passed to sum() must be
    of the type integer, string given, called in /home/cg/root/4010040/main.php on line 21User Destruct...
    

    在上面的例子中,我们传递了一个字符串和一个整数,由于在我们的函数使用了类型提示,这给了我们类型错误。从上面的示例中,我们可以正确处理错误,即使出现错误,我们也可以关闭资源。我们使用不同的函数,如 get_class()、getLine()、getMessage() 以最优雅的方式处理错误。

    现在让我们举一个例子来处理解析错误。以下是由于文件中的语法错误,我们将收到错误的代码。

    例子:

    ';
        }
           
        public function __destruct() {
           echo 'User Destruct...
    ';      }         }     function sum(int $num1, int $num2) {     return $num1 + $num2; }     try {     $user = new User();            // Syntax error for var_dump in below line     $result = eval("var_dup(1);"); } catch(Exception $e) {     echo $e->getMessage(); } catch(Error $e) {     echo ''.get_class($e). ' on line '.$e->getLine()         .':'.$e->getMessage().'
    '; }     ?>

    输出:

    User Construct...Error on line 1:Call to undefined function var_dup()User Destruct...
    

整数除法函数: PHP7 引入了 intdiv()函数,它接受两个参数,一个是被除数,另一个是除数。结果将是 int 形式的除法。
例子:


输出:

int(3)
3