1.8PHP语言的函数(Function)

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 类来实现的。

//用于变量的值的时候,匿名函数表达式会被转换为Closure类的实例。
//非静态
$变量名 = function (形参) {
    //函数体
};

//静态
$变量名 = static function (形参) {
    //函数体
};

//调用匿名函数
$变量名(实参);
//用于回调函数
//非静态
function (形参) {
    //函数体
}

//静态
static function (形参) {
    //函数体
}

14.箭头(Arrow)函数

箭头(Arrow)函数 是一种更加简洁的 匿名函数 的语法。

箭头函数是通过 Closure 类来实现的。

//用于变量的值的时候,箭头函数表达式会被转换为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

(0)
上一篇 2023年6月7日
下一篇 2023年6月9日

相关推荐

  • 2.11PHP语言的可见性(Visibility)

    PHP 语言的可见性支持 public 、protected 、private 修饰符。 可见形修饰符支持 静态属性、实例属性、常量、静态方法、实例方法、构造函数、析构函数 等成员。 没有声明可见性修饰符的成员是隐式的 public。 声明为 public 的成员可以在任何地方访问。声明为…

    PHP语言教程 2023年7月11日
    0310
  • 1.7PHP语言的常量(Constant)

    1.常量声明 1.1define()函数声明方式 使用 define() 函数声明常量,值可以为任意表达式。 1.2const关键字声明方式 使用 const 关键字声明常量,值只可以为 标量类型(int, float, bool, string)表达式 或者 包含元素只为标量类型(int, flo…

    PHP语言教程 2023年6月7日
    0260
  • 2.8PHP类型之可调用(Callable)

    可调用(callable)类型表示回调函数。 1.回调函数声明 回调函数声明无需特殊的语法。 回调函数支持 普通函数、匿名函数、箭头函数、静态方法、实例方法、任何实现了 __invoke() 方法的类的对象。 2.传递回调函数 传递方式 语法 字符串 ” 数组 array() 或 [] 变量 $变量名 回调函数 传递…

    PHP语言教程 2023年7月8日
    0270

发表回复

登录后才能评论