其实你并不懂如何定义一个 PHP 函数
<?php
function divide($dividend, $divisor){
return $dividend / $divisor;
}
echo divide(12, 4);
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');
现在,第二次调用这个函数将会抛出一个致命错误,指出其需要的参数必须是整数类型。你可以用不同的方式处理参数。
<?php
// 可选参数
function getName(string $firstName, string $lastName = ''){
return $firstName . ' ' . $lastName;
}
echo getName('Muhammad', 'Nauman'); // Muhammad Nauman
echo getName('Adam'); // Adam
function divide(int $dividend, int $divisor = 2){
return $dividend / $divisor;
}
echo divide(12, 4); // 3
echo divide(12); // 6
// 仅接收 Request 类的实例参数 $request
function getReuestParams(Request $request){
return $request->only('name', 'email');
}
在定义的时候,将可选参数或带默认值的参数作为最后一个参数。
PHP 7.1 也给可迭代数据介绍了一种伪类型。它能接收任何可迭代的数据。
上图是使用了 iterable
数据类型的函数。
现在通过代码,我们可以控制的更多了,不是吗?没错,确实如此!
函数与它们的返回值
正如你可以控制传递给指定函数的参数类型一样,你也可以控制函数的返回值类型。它能确保你的函数总是返回同一个数据类型,并且不会崩溃。我们改变一下上面的代码:
<?php
// 可选参数
function getName(string $firstName, string $lastName = '') : string {
return $firstName . ' ' . $lastName;
}
echo getName('Muhammad', 'Nauman'); // Muhammad Nauman
echo getName('Adam'); // Adam
function divide(int $dividend, int $divisor = 2) : int {
return $dividend / $divisor;
}
echo divide(12, 4); // 3
echo divide(12); // 6
// 仅接收 Request 类的实例 $request 作为参数
function getReuestParams(Request $request) : array {
return $request->only('name', 'email');
}
// 返回 void 类型
$attribute = 2;
function changeAttribute(string &$param, $value) : void {
$param = $value;
}
changeAttribute($attribute, 5);
echo $attribute; // 5
PHP 逐渐引入了这些功能,如:5.1 版引入的数组类型作为参数,5.4 版引入的可调用类型(callable type),以及 7.1 版引入的 void 返回类型等。
可选参数 VS 可空参数
除了可选参数外,你还可以定义可空(nullable)参数,这意味着你可以定义一种可空参数类型。我们来看个例子:
<?php
function nullableParameter(?string $name)
{
return $name;
}
echo nullableParameter(null); // 不会返回任何东西
echo nullableParameter('Nauman'); // Nauman
echo nullableParameter(); // 致命错误
function nullableParameterWithReturnType(?string $name) : string
{
return $name;
}
echo nullableParameter(null); // 致命错误,必须返回 string 类型
echo nullableParameter('Nauman'); // Nauman
function nullableReturnType(string $name) : ?string
{
return $name;
}
echo nullableParameter(null); // 致命错误,$name 应该是 string 类型
echo nullableParameter('Nauman'); // Nauman
显然,可空参数不是可选参数,你必须传递一个值或者是 null
。我个人喜欢使用空值作为可选参数,但这取决于你的任务需求。
总结
从我开启职业生涯的时候我就使用 PHP 了,我真的很爱这门语言。在过去很长一段时间里,它都是开发 web 应用的不二之选。现在 7.x 版本又填补了许多高级特性和现代化应用的需求,并且提高了开发者的效率。这门语言正不断的发生改变,找出这些变化,并停止过去的写法,放弃你原来的习惯并自豪的使用这些新特性,让你的代码更易读易懂。 Happy coding
其实你并不懂如何定义一个 PHP 函数的更多相关文章
- 035-PHP简单定义一个闭包函数
<?php /* + 什么是闭包函数?即一个函数内部,包含了1-N个匿名函数, + 用处是可以做局部数据缓存与实现封装(有点类似class) */ # 函数内部,定义一个匿名函数,即可称为闭包函 ...
- 034-PHP简单定义一个匿名函数
<?php /* 简单定义一个匿名函数 */ # 把匿名函数赋值给一个变量,也叫临时函数 $demo = function ($txt) { echo $txt; }; # 调用测试下 $dem ...
- CREATE FUNCTION - 定义一个新函数
SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...
- Python定义一个函数
Python函数:实现某种功能的代码段 定义一个函数需要遵循的规则: 1.使用 def 关键字 函数名和( ),括号内可以有形参 匿名函数使用 lambda 关键字定义 2.任何传入参数和自变量必须放 ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- 用二分法定义平方根函数(Bisection method Square Root Python)
Python里面有内置(Built-in)的平方根函数:sqrt(),可以方便计算正数的平方根.那么,如果要自己定义一个sqrt函数,该怎么解决呢? 解决思路: 1. 大于等于1的正数n的方根,范围 ...
- Python元类实践--自己定义一个和collections中一样的namedtuple
大家可能很熟悉在collections模块中有一个很好用的扩展数据类型-namedtuple. 如果你还不知道这个类型,那么请翻看标准手册. 我利用元类轻松定义一个namedtuple. 先把代码贴上 ...
- 用CIL写程序:定义一个叫“慕容小匹夫”的类
前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...
- java怎么定义一个二维数组?
java中使用 [][] 来定义二维数组 定义数组时也可同时初始化下面是一些例子float[][] numthree; //定义一个float类型的2维数组numthree=new float[5][ ...
随机推荐
- 使用python UIAutomation从QQ2017(v8.9)群界面获取所有群成员详细资料,
首先安装pip install uiautomation, 运行本文代码.或者下载https://github.com/yinkaisheng/Python-UIAutomation-for-Wind ...
- Vue自定义插件方法大全
新年第一天首先祝大家新年快乐,心想事成! 1.利用根实例构造函数的原型 //在构造函数的原型链上添加自定义属性 Vue.prototype.test = 'pomelo' //在其他组件中调用 con ...
- Redis+Restful 构造序列号和压力测试【原创】
[本人原创],欢迎交流和分享技术,转载请附上如下内容:如果你觉得这篇文章对你有帮助,请记得帮我点赞, 谢谢!作者:kevin[转自]http://www.cnblogs.com/itshare/ 很多 ...
- MySQL 中添加列、修改列以及删除列
ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:); 删除列:alte ...
- Orcle查询优化改写-----给查询结果排序
1.按照子串排序 2.translate
- 记一次sqoop同步到mysql
工作中需要用到将hive的数据导一份到mysql中,需求是这样的:hive每天会产生一份用户标签(tag)发生变化的结果表user_tag,这份结果同步到mysql中,并且保持一份全量表,存储当前用户 ...
- MaxPooling的作用
maxpooling主要有两大作用 1. invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)2. 保留主要的特征同时减少参数(降 ...
- 海外仓系统 COD货到付款到付功能
全球还有很多国家买家网购选择货到付款方式,例如东南亚的越南.泰国.印度尼西亚,中东的阿联酋.沙特等国家.在这些国家建立海外仓需要需要具备COD货到付款功能,麦哲伦海外仓系统已经支持COD货到到付结算相 ...
- JavaScript(第二十三天)【事件入门】
JavaScript事件是由访问Web页面的用户引起的一系列操作,例如:用户点击.当用户执行某些操作的时候,再去执行一系列代码. 一.事件介绍 事件一般是用于浏览器和用户操作进行交互.最早是IE和 ...
- Java的暑期作业
Java暑期作业 一.<恶意>读书笔记 <恶意>是日本作家东野圭吾写的推理小说之一.看完后不禁为东野先生的奇特的写作手法以及书中所展现的人性的丑恶所震撼.我认为这本书相较< ...