zoukankan      html  css  js  c++  java
  • 其实你并不懂如何定义一个 PHP 函数

    1 <?php
    2 function divide($dividend, $divisor){
    3     return $dividend / $divisor;
    4 }
    5 echo divide(12, 4);
    6 echo divide('sa', 'sd');

    这段代码乍一看没毛病,但是如果你向它传递「任意」参数,它就会出问题。

    写出好的代码是一个学无止境的过程。让我们来改进我们编写 PHP 函数的方式。 看下上面的代码,想想第二个函数调用那里会发生什么情况? 它会接受你输入的任何参数,并且尝试执行然后抛出一个数学错误。 但是我们怎么才能让一个函数严格接收能使其正确执行的参数呢? 现代的 PHP 解决了这个问题,并且有更多妙法能让你的代码质量更进一层,没有 bug。

    函数参数与它们的数据类型

    你可以严格控制你的函数,使其只接收让它正确运行的参数。让我们改变上面的函数定义:

    <?php
    function divide(int $dividend, int $divisor){
        return $dividend / $divisor;
    }
    echo divide(12, 4);
    echo divide('sa', 'sd');

      

    现在,第二次调用这个函数将会抛出一个致命错误,指出其需要的参数必须是整数类型。你可以用不同的方式处理参数。

     1 <?php
     2 // 可选参数
     3 function getName(string $firstName, string $lastName = ''){
     4     return $firstName . ' ' . $lastName;
     5 }
     6 echo getName('Muhammad', 'Nauman'); // Muhammad Nauman
     7 echo getName('Adam'); // Adam
     8 function divide(int $dividend, int $divisor = 2){
     9       return $dividend / $divisor;
    10 }
    11 echo divide(12, 4); // 3
    12 echo divide(12); // 6
    13 // 仅接收 Request 类的实例参数 $request
    14 function getReuestParams(Request $request){
    15     return $request->only('name', 'email');
    16 }
    在定义的时候,将可选参数或带默认值的参数作为最后一个参数。

    PHP 7.1 也给可迭代数据介绍了一种伪类型。它能接收任何可迭代的数据。

    上图是使用了 iterable 数据类型的函数。

    现在通过代码,我们可以控制的更多了,不是吗?没错,确实如此!

    函数与它们的返回值

    正如你可以控制传递给指定函数的参数类型一样,你也可以控制函数的返回值类型。它能确保你的函数总是返回同一个数据类型,并且不会崩溃。我们改变一下上面的代码:

     1 <?php
     2 // 可选参数
     3 function getName(string $firstName, string $lastName = '') : string {
     4     return $firstName . ' ' . $lastName;
     5 }
     6 echo getName('Muhammad', 'Nauman'); // Muhammad Nauman
     7 echo getName('Adam'); // Adam
     8 function divide(int $dividend, int $divisor = 2) : int {
     9       return $dividend / $divisor;
    10 }
    11 echo divide(12, 4); // 3
    12 echo divide(12); // 6
    13 // 仅接收 Request 类的实例 $request 作为参数
    14 function getReuestParams(Request $request) : array {
    15     return $request->only('name', 'email');
    16 }
    17 // 返回 void 类型
    18 $attribute = 2;
    19 function changeAttribute(string &$param, $value) : void {
    20     $param = $value;
    21 }
    22 changeAttribute($attribute, 5);
    23 echo $attribute; // 5

    PHP 逐渐引入了这些功能,如:5.1 版引入的数组类型作为参数,5.4 版引入的可调用类型(callable type),以及 7.1 版引入的 void 返回类型等。

    可选参数 VS 可空参数

    除了可选参数外,你还可以定义可空(nullable)参数,这意味着你可以定义一种可空参数类型。我们来看个例子:

     1 <?php
     2 function nullableParameter(?string $name)
     3 {
     4     return $name;
     5 }
     6 echo nullableParameter(null); // 不会返回任何东西
     7 echo nullableParameter('Nauman'); // Nauman
     8 echo nullableParameter(); // 致命错误
     9 function nullableParameterWithReturnType(?string $name) : string
    10 {
    11     return $name;
    12 }
    13 echo nullableParameter(null); // 致命错误,必须返回 string 类型
    14 echo nullableParameter('Nauman'); // Nauman
    15 function nullableReturnType(string $name) : ?string
    16 {
    17     return $name;
    18 }
    19 echo nullableParameter(null); // 致命错误,$name 应该是 string 类型
    20 echo nullableParameter('Nauman'); // Nauman

    显然,可空参数不是可选参数,你必须传递一个值或者是 null。我个人喜欢使用空值作为可选参数,但这取决于你的任务需求。

    总结

    从我开启职业生涯的时候我就使用 PHP 了,我真的很爱这门语言。在过去很长一段时间里,它都是开发 web 应用的不二之选。现在 7.x 版本又填补了许多高级特性和现代化应用的需求,并且提高了开发者的效率。这门语言正不断的发生改变,找出这些变化,并停止过去的写法,放弃你原来的习惯并自豪的使用这些新特性,让你的代码更易读易懂。 Happy coding :)

     

  • 相关阅读:
    oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件
    oracle 常用语句
    android udp 无法收到数据 (模拟器中)
    android DatagramSocket send 发送数据出错
    AtCoder ABC 128E Roadwork
    AtCoder ABC 128D equeue
    AtCoder ABC 127F Absolute Minima
    AtCoder ABC 127E Cell Distance
    CodeForces 1166E The LCMs Must be Large
    CodeForces 1166D Cute Sequences
  • 原文地址:https://www.cnblogs.com/a609251438/p/11836834.html
Copyright © 2011-2022 走看看