怎样定义一个正确函数,怎么正确调用一个函数

问:怎么样正确定义一个函数呢?

答:是的,定义一个函数很简单,但是正确定一个函数这就有道道了。首先说一下我们最常见的两种形式:(注意是没有访问限制这么一说的)

Function name(){

//code

}

Function name($arg1, $arg2){

//code

}

这两种都是我们常见的,区别就在于有没有参数。是的,参数是函数的主要区别。我们知道php是一种弱类型语言,所以在函数定义上和强类型语言有着明显的差别,比如就没有函数重载,主要原因就是参数的类型可以多种,而不像强类型语言那样对于参数的每一个类型,都要写一个对应的函数。所以php函数中的参数天生就能接纳不同类型的参数,而伪类型就是用来表达有多种类型的意思,目前常用的伪类型有mixed,number,callback这几个。如果想表达参数接受多种类型就可以使用伪类型,直接标记在说明文档中即可。至于php函数参数的类型要求,事实上php中所有数据类型都可当做函数参数--标量,复合类型,null,资源型,以及引用型(即&)都可以。

这里我们先就参数个数来聊一下不同函数的定义差异。

  • 没有参数直接空括号就行,这个没有什么异议。
  • 我们主要对有参数的进行辨别。

如果设定了参数,且没有对应默认值的,如果调用时不传递,会发生致命错误

在实际函数调用的时候,严禁间隔参数(用两个,空出来)表达故意不传该参数,这种会直接报错

并且php的实参在传递过程是顺序传递的,不支持指定参数名传递。(框架内支持指定参数名传值,一般都是通过反射机制来实现

我们先从有没有对参数类型进行限制。这里有一个规定在php中,就是在php7之前是不允许对标量(整形,浮点型,字符串,布尔型)进行限制,trait也不行。可以对类,接口,对象实例(self),数组,回调进行限制。可以通过使用默认值null添加对null的兼容。

如果对函数参数进行了类型限制,若传的类型不一致,会导致致命错误。

 

关于参数个数不足的问题总结起来就一句话,如果某个参数在调用时没有参数(不管是传值还是默认值),那么一定会报错。理论上默认值是放在任何位置都行,鉴于调用方法和使用习惯,推荐将不带默认值的参数放左边,带默认值的放不带默认值的参数右边。不带默认参数的必须得传值,如果在必传值的参数列表中夹杂着默认值,也就意味着默认值无意义了,因为它用不着了,它也必须传值了。

默认值是解决实参数量少于形参数量的,还一种是实参数量大于形参数量的。Php函数是无条件接受所有实参的并按照顺序赋值给形参的,那剩下的怎么办?的确,他们没有像那些排在前面的参数一样,有名有姓。不过他们比较幸运的是,所有的实参都有同一个归宿,用func_get_args()获取所有的实参放到一个数组里面。这样就能处理这些参数了。

 

这里我们要对函数参数的特殊类型单独说一下,引用型就不说了,说一下参数是回调类型的,也就是参数是一个函数或者方法的这种情况。为什么要传一个函数功能体给一个函数呢?很显然,函数功能不全,需要外部帮助嘛。那帮助的方法有哪些呢,我们来说一下。首先我们要知道如何调用一个函数,如果知道函数的名字直接带上括号和需要的参数直接调用就可以。是的,就是这么简单,这有一个前提就是知道函数名,这就是个字符串啊,所以这样回调就很easy了,直接把函数名传给函数当参数(callback是个伪类型,这样实际就是string),然后在函数内就可以使用变量函数(如果你不知道函数变量是啥,自行百度吧)了。如果你想在在提供函数名的时候一并提供参数,有个专门的函数叫call_user_func_array()这玩意本身就是一个回调函数,接受两个参数,第一个是函数名称字符串,第二个是参数数组,这个数组会按顺序传给回调,至于个数最好能一样,超了没关系,少了可能就出问题了。这两除了参数问题区别,也可以从发起者来看区别。变量函数是人启动的,call_user_func_array()是系统启动,有自动和手动的区别。下面我们再来说一下没有函数名字的咋办?一样,还是通过变量函数来完成,本质就是将无名函数(匿名函数或叫闭包)传给形参,然后在函数体内就形成了变量函数,剩下的就是变量函数的那一套了。所以直接将整个函数定义传给函数就行,如果你觉得样式不好看,可以先付给一个变量(实际这就是函数变量了),然后再传给形参就行了。

 

这里提到了call_user_func_array()这个函数,其实它的作用很大,提到他不得不提另一个函数call_user_func(),他俩是兄弟俩,很容易迷糊,所以放一起让大家有所区分。

对于普通的函数来说

Call_user_func()函数参数数量不定,这取决于回调函数的参数个数。不过有个硬指标就是,第一个参数必须是函数名称,剩下的参数列表和回调函数的参数列表是一样的

Call_user_func_array()函数的区别就是换了种方式传参数。他只有两个参数

第一个参数是函数的名称,第二个参数是回调函数的参数数组

 

调用类的方法(包括静态方法实例对象方法

Call_user_func()函数对第一个参数变化,别的没有变化,就是方法名。有两种形式,第一种是字符串(类名::方法名),不用说就知道这是对静态方法的调用。另一种是数组形式,数组包含两个元素,第二个是方法名,如果是对象方法,第一个就是对象,如果是静态方法,第一个就是类名这里要对数组形式的使用类名调用方法的形式进行一下提醒,他一般是用来调用静态方法的,如果用在非静态上,5.3之前是没问题的,因为php会把它当做静态的方法,5.3之后就会出现strict错误了(这个和重写子类方法参数个数不一致的错误级别一样),但可以通过忽略级别隐藏。

Call_user_func_array()函数就是和之前一样,只是改变了参数的传递方式,以数组的形式传递了。

 

这样关于怎样定义一个正确函数,以及怎么调用一个函数,甚至怎么回调函数和类中方法也讲完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值