1.函数声明
function 函数名([类型] $值形参名, [类型] $默认值形参名 = 值, [类型] &$引用形参, [类型] ...$剩余数组形参): [返回类型] {
//函数体
}
2.函数分类
2.1全局函数
名称 | 修饰符 |
全局函数 | —————— |
2.2成员方法
名称 | 修饰符 |
静态方法(类) | static |
实例方法(类) | —————— |
2.3局部函数
名称 | 修饰符 |
嵌套函数 | —————— |
3.可变(Variable)函数名
函数、静态方法、实例方法的名称可以通过返回值为字符串类型的表达式动态指定。
如果一个表达式后有圆括号,PHP 将寻找与此表达式的返回值同名的函数,并且尝试执行它。
//可变函数名(注意:($变量名)()可省略外围的圆括号,简写为$变量名())
(表达式)();
//可变静态方法名(注意:类::($变量名)()可省略外围的圆括号,简写为类::$变量名())
类::(表达式)();
//可变实例方法名(注意:$对象->($变量名)()可省略外围的圆括号,简写为$对象->$变量名())
$对象->(表达式)();
//表达式也支持可调用(callable)类型中的数组语法
class Foo
{
static function bar()
{
echo "bar\n";
}
function baz()
{
echo "baz\n";
}
}
$f1 = array("Foo", "bar");
$f1();
$f2 = array(new Foo, "bar");
$f2();
$f3 = array(new Foo, "baz");
$f3();
4.形参分类
注意:引用形参同样支持 默认值引用形参 和 剩余数组引用形参。
名称 | 修饰符 |
值形参 | —————— |
默认值形参 | —————— |
引用形参 | & |
剩余数组形参 | ... |
5.实参传递方式
值实参的数量必须大于等于值形参的数量,多余的实参会被忽略或者被传递给剩余数组参数(如果有的话)。
实参的类型与默认值形参的类型无需相同,但需要注意的是传递 null
实参不会赋予默认值。
实参的传递不仅支持按位置从左往右依次传递方式,还支持按命名传递方式。当命名实参与位置实参混合使用的时候,命名实参必须在位置实参之后。
//按命名传递方式(形参名前无美元$符号)
函数名(位置实参1, 命名形参名2: 命名实参2);
实参的传递不仅支持按值传递方式,还支持按引用传递方式。
5.1按值传递
默认情况下,实参的传递是按值传递的,所以在函数的内部更改形参的值并不会更改对应函数外部的实参的值。
5.2按引用传递
如果想要函数的一个参数总是按引用传递,可以在函数声明中该参数的前面加上符号 &
:
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str;
//输出
This is a string, and something extra.
6.返回方式
函数的返回方式不仅支持按值返回方式,还支持按引用返回方式。
6.1按值返回
默认情况下,函数是按值返回的。
6.2按引用返回
从函数返回一个引用,必须在函数声明和赋予返回值给一个变量时都使用引用运算符 &
:
function &returns_reference()
{
return $someref;
}
$newref =& returns_reference();
7.返回值
参见 return
语句。
8.调用方式
//无实参
函数名();
//有实参
函数名(实参);
9.取消函数声明
PHP 不支持取消定义或者重定义已声明的函数。
10.嵌套函数
function foo()
{
function bar()
{
//语句;
}
}
11.递归函数
递归函数是一种调用自己的函数。
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
12.魔术(Magic)方法
魔术方法是一种特殊的方法,当在对象上执行某些操作时,它会覆盖 PHP 的默认行为。
__construct()
__destruct()
__call()
__callStatic()
__get()
__set()
__isset()
__unset()
__sleep()
__wakeup()
__serialize()
__unserialize()
__toString()
__invoke()
__set_state()
__clone()
__debugInfo()
13.匿名(Anonymous)函数
匿名(Anonymous)函数,也称为闭包(Closure),允许声明没有名称的函数。
//用于变量的值的时候,匿名函数表达式会被转换为Closure类的实例。
//非静态
$变量名 = function (形参) {
//函数体
};
//静态
$变量名 = static function (形参) {
//函数体
};
//调用匿名函数
$变量名(实参);
//用于回调函数
//非静态
function (形参) {
//函数体
}
//静态
static function (形参) {
//函数体
}
14.箭头(Arrow)函数
箭头(Arrow)函数 是一种更加简洁的 匿名函数 的语法。
//用于变量的值的时候,箭头函数表达式会被转换为Closure类的实例。
$变量名 = fn (形参) => 表达式;
//用于回调函数
fn (形参) => 表达式
15.First class callable语法
在 PHP < 8.1.0,我们可以使用 Closure::fromCallable()
静态方法 或 CallableExpr(...)
将一个回调函数转换为一个 Closure
类的对象。
public static Closure::fromCallable(callable $callback): Closure
CallableExpr(...)
//示例
$f7 = 'strlen'(...);
$f8 = [$obj, 'method'](...);
$f9 = [Foo::class, 'staticmethod'](...);
注意:(...)
是语法的一部分,而不是省略的意思。
从 PHP ≥ 8.1.0,First class callable 语法在 CallableExpr(...)
语法的基础上作了升级,比之前更加地简洁,就像正常函数或方法调用一样,只不过多了 ...
。
//普通函数
$f1 = Closure::fromCallable('strlen');
$f1 = strlen(...);
class Foo {
public static function staticmethod() {
echo "in static";
}
public function method() {
echo "in instance";
}
public function __invoke() {
echo "in invoke";
}
}
$obj = new Foo();
$classStr = 'Foo';
$staticmethodStr = 'staticmethod';
$methodStr = 'method';
//静态方法
$f2 = Closure::fromCallable('Foo::staticmethod');
$f2 = Foo::staticmethod(...);
$f3 = Closure::fromCallable(array($classStr, $staticmethodStr));
$f3 = Closure::fromCallable(array($obj, $staticmethodStr));
$f3 = $classStr::$staticmethodStr(...);
//实例方法
$f4 = Closure::fromCallable(array($obj, 'method'));
$f4 = $obj->method(...);
$f5 = Closure::fromCallable(array($obj, $methodStr));
$f5 = $obj->$methodStr(...);
//实现了__invoke()方法的类的对象
$f6 = Closure::fromCallable($obj);
$f6 = $obj(...);
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/28877.html