php之函数
scope(空间)
unpack (解压)
Traversable (穿越)
performance(性能)
experiment (检验)
properties (属性)
trailing (尾随)
function(函数)
用户自定义函数
一个函数可由以下的语法来定义:
任何有效的PHP代码都有可能出现在函数内部,甚至包括其他函数和类定义。
函数名和PHP中的其他标识符命名规则相同。
函数无需再调用之前被定义,除非是函数是有条件被定义时。
当一个函数是有条件被定义时,必须在调用函数之前定义。
PHP中的所有函数和类都具有全局作用域,可以定义在一个函数之内而在之外调用,反之亦然。
PHP不支持函数重载,也不可能取消定义或者重定义已声明的函数。
Note:函数名是大小写无关的,不过在调用函数的时候,使用其在定义时相同的形式是个好习惯。
PHP的函数支持可变数量的参数和默认参数。参见func_num_args(),func_get_arg()和func_get_args()。
在PHP中可以调用递归函数。
Note:但是哟啊避免递归函数/方法调用超过100-200层,因为可能会使堆栈崩溃从而使当前脚本终止。无线递归可视为编程错误。
函数的参数
通过参数列表可以传递信息到函数,即可以逗号作为分隔符的表达式列表。参数是从左向右求值的。
PHP支持按值传递参数(默认)。通过引用传递参数以及默认参数。也支持可变长度参数列表。
通过引用传递参数以及默认参数。也支持可变长度参数列表。
默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望
允许函数修改它的参数值,必须通过引用传递参数。
如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加个符号&:
默认参数的值
函数可以定义C++风格的标量参数默认值,
PHP还允许使用数组array和特殊类型null作为默认参数,
默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等。
注意当时用默认参数时,任何默认参数必须方在任何非默认参数的右侧;否侧,
函数将不会按照预期的情况工作。
Note:自PHP5起,传引用的参数也可以有默认值。
类型声明:
Note:在PHP5中,类型声明也被称为类型提示。
类型声明允许函数在调用时要求参数为特定类型。如果给出的值类型不对,那么将会产生一个错误:在PHP5中,
这将是一个可恢复的致命错误,而在PHP7中将会抛出一个TypeError异常。
为了制定一个类型声明,类型应该加到参数名前。这个声明可以通过将参数的默认值设为null来实现允许传递null。
valid types
type description php version
Class/interface naem the parameter must be an instanceof the given
class or interface name. php5.0.0
self the parameter must be an instanceof the same class
as the one the method is defined on. this can only be
used on class and interface methods. php5.0.0
array The parameter must be an array php5.1.0
callable the parameter must be a valid callable php5.4.0
bool the parameter must be a boolean value. php 7.0.0
float the parameter must be a floating point value php7.0.0
int The parameter must be an integer php7.0.0
string the parameter must be a string php7.0.0
Warnming Aliases for the above scalar types are not supported。Instead,they are treated as class or
interface names,for example,using Boolean as a parameter or return type will require an argument or
return value thant is an instanceof the class or interface boolean,rather than of type bool:
严格类型:
默认情况下,如果能做到的话,PHP将会强迫错误类型的值转化为函数期望的标量类型。
例如,一个函数的一个参数期望是string,但传入的是int,最终函数得到的将会一个string类型的值。
可以基于每个文件开启严格模式。在严格模式下,只有一个与类型声明完全相符的变量才会被接受,否则将会抛出
一个TypeError。唯一的一个例外是可以将int传给一个期望float的函数。
使用declare语句和strict_types声明来启用严格模式:
Caution(警告):启用严格模式同时也会影响返回值类型声明。
Note:
严格类型适用于在启用严格模式的文件内的函数调用,而不是在那个文件内声明的函数。一个没有启用
严格模式的文件内调用了一个在启用严格模式的文件中的定义的函数,那么将会遵循调用的偏好(弱类型),
而这个值将会被转换。
严格模式一定在函数被调用的地方声明。
Note:
严格类型仅用于标量类型声明,也正式因为如此,这需要PHP7.0.0或者更新版本,因为标量类型声明也是在哪个版本中添加的。
可变数量的参数列表:
PHP在用户自定义函数中支持可变数量的参数列表。在PHP5.6及以上的版本中,由...语法实现;
在PHP5.5及更早版本中,使用函数func_num_args(),func_get_arg(),和func_get_args()。
... in php 5.6+
in php5.6 an later,argument lists may include the ... token to denote that the function accepts a
variable number of arguments. the arguments will be passed into the given variable as an array;for example:
Using ... to access variable arguments
You can also use ... when calling functions to unpack an array or Traversable variable or literal into the argument lists;
Using ... to provide arguments
You may specify normal positional argumens before the ... token。In this case,only the trailing argumens that
don't match a positional argumen will be added to the array generated by ...
it is also possible to add a type hint before the ... token, if this is present,then all arguments captured by ... must
be objects of the hinted class.
①:Type hinted variable arguments
Older versions of PHP
No specia syntax is required to note that a function is variadic;however access to the function's arguments must
use func_num_args(),func_get_arg()和func_get_args()。
The first example above would be implemented as follows in php5.5 and earlier;
User Contributed Notes :
To experiment on performance of pass-by-reference and pass-by-value, I used this scipt。
Conclusions(结论) are below。
Conclusions:
1、PHP is already smart about zero-copy / copy-on-write。A function call does NOT copy the data
unless it needs to;the data is
A function's argument that is an object, will have its properties modified by the function although you don't
need to pass it by reference。
This is different for arrays:
You can use a class constant as default parameter。
You can pass a function as an argument too.
If you use ... in a function's parameter list, you can use it only once for obvious reasons.
Less obvious is that it has to be on the LAST parameter; as the manual puts it:
You may specify normal positional arguments before the ... token
返回值:
值通过使用可选的返回语句返回。可以返回包括数组和对象的任意类型。
返回语句会立即中职函数的运行,并且将控制权回调该函数的代码行。
Note:
如果省略了return,则返回值为null。
return的使用
函数不能返回多个值,但可以通过返回一个数组来得到类型的效果。
//返回一个数组以得到多个返回值。
//从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&:
//可变函数
php支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,
并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。
可变函数不能用户例如echo,print,unset(),isset(),empty(),include,require以及类似的语言结构。
需要使用自己的包装函数来将这些结构用作可变函数。
也可以用可变函数的语法来调用一个对象的方法。
当调用静态方法时,函数调用要比静态属性优先:
匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况
匿名函数目前是通过 Closure 类来实现的
闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。 PHP 7.1 起,不能传入此类变量: superglobals、 $this 或者和参数重名。
//Inherited variable's value is from when the function is defined,
//not when called
这些变量都必须在函数或类的头部声明。 从父作用域中继承变量与使用全局变量是不同的。
全局变量存在于一个全局的范围,无论当前在执行的是哪个函数。
而 闭包的父作用域是定义该闭包的函数(不一定是调用它的函数)。示例如下:
as of 7.0,you can use IIFR by wrapping your anonymous function with ()
php之函数的更多相关文章
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- C++对C的函数拓展
一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- JS核心系列:浅谈函数的作用域
一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...
- C++中的时间函数
C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
随机推荐
- linux每日命令(18):whereis命令
whereis命令用于查找文件. 该指令会在特定目录中查找符合条件的文件.这些文件应属于原始代码.二进制文件,或是帮助文件. 该指令只能用于查找二进制文件.源代码文件和man手册页,一般文件的定位需使 ...
- SAP BW 数据库表命名规则
SAP BW 数据库表命名规则 已有 315 次阅读2012/6/8 15:55 |系统分类:专业内容| SAP, 命名, 数据库表 Namings for Cube: /BI<C OR DIG ...
- 【Java】分布式RPC通信框架Apache Thrift 使用总结
简介 Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于th ...
- Android开发(十五)——ListView中Items的间距margin
ListView中Items没有margin 参考:http://www.cnblogs.com/xitang/p/3677528.html
- STM32云平台连接培训20180814
MQTT基于TCP,发布订阅模式,一对多,多对一,TCP需要client主动建立connect,server发送connectack CoAP基于UDP,请求/应答模式,数据量也相对HTTP要小 HT ...
- Amazon
刚接到Recruiter电话,说恭喜,feedback都非常好. 心里大石落地,FLAG / UAT终于完成一家. 接下来就要加倍努力冲刺其他公司了. Mark: (入职以后一定要去地里补发一波面经, ...
- Android调用相机拍摄照片并显示到 ImageView控件中
在前面的一篇文章中曾介绍过简单的开启相机照相功能,详见 Android简单调用相机Camera功能,实现打开照相功能 ,这一次就会将前面拍摄的照片显示到ImageView中,形成一个完整的效果 看实例 ...
- 在win10企业版x64下使用curl命令
一.curl命令介绍 curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 详情查看百度百科 ...
- Java知多少(9) import及Java类的搜索路径
如果你希望使用Java包中的类,就必须先使用import语句导入. import语句与C语言中的 #include 有些类似,语法为: import package1[.package2…].c ...
- (笔记)Linux内核学习(二)之进程
一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器. 内核调度的对象是线程而不是进程.对 ...