1.函数声明
函数在类中被称为方法(method)。
function [&]函数名称([类型]参数名称, [类型]默认值参数名称 = 值, [类型]&引用参数名称, [类型]...可变参数名称): [返回类型]
{
//函数体;
}
2.函数分类
2.1全局函数
名称 | 修饰符 |
全局函数 | —————— |
2.2成员函数
名称 | 修饰符 |
---|---|
静态方法 | 用 static 修饰 |
实例方法 | 无 static 修饰 |
2.3局部函数
名称 | 修饰符 |
嵌套函数 | —————— |
3.参数分类
名称 | 修饰符 |
参数 | —————— |
默认值参数 | —————— |
引用参数 | 用 & 修饰 |
可变数量参数 | 用 ... 修饰 |
4.参数传递方式
实参的数量需与形参的数量相同,虽然有时候看似没赋予实参,实际上是提供了 null
值或类型的默认值或其它值,总之必须有值。
实参的类型需与形参的类型兼容,所谓兼容指的是比如存在继承关系。
实参的传递不仅支持按位置从左往右依次传递方式,还支持按命名传递方式。
//按命名传递
方法(参数名称1: 实参1, 参数名称2: 实参2)
<?php
// 按位置传递
array_fill(0, 100, 50);
// 按命名传递
array_fill(start_index: 0, count: 100, value: 50);
?>
实参的传递不仅支持按值传递方式(传递的是副本),还支持按引用传递方式(传递的是内存地址)。
参数类型 | 参数传递方式 | 描述 |
值类型 | 按值传递 | 对方法内的局部变量的修改不会反应到方法外。 |
值类型 | 按引用传递 | 对方法内的局部变量的修改会反应到方法外。 |
引用类型 | 按值传递 | 对方法内的局部变量的修改会反应到方法外,新对象存储在新内存地址。 |
引用类型 | 按引用传递 | 对方法内的局部变量的修改会反应到方法外,新对象存储在老内存地址。 |
5.返回方式
5.1按值返回
PHP语言默认支持按值返回。
5.2按引用返回
如需从函数返回一个引用,必须在函数声明和将返回值赋值给一个变量时都使用引用运算符 &
:
<?php
function &returns_reference()
{
return $someref;
}
$newref = &returns_reference();
?>
6.可变函数
PHP 支持可变函数的概念。如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数。
可变函数可以用来实现包括回调函数,函数表在内的一些用途。
<?php
function foo()
{
echo "In foo()<br />\n";
}
function bar($arg = '')
{
echo "In bar(); argument was '$arg'.<br />\n";
}
// 使用 echo 的包装函数
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // 调用 foo()
$func = 'bar';
$func('test'); // 调用 bar()
$func = 'echoit';
$func('test'); // 调用 echoit()
?>
7.递归函数
一个函数可以指向并调用自身,便形成了递归。
function recursion($a)
{
if ($a < 20) {
echo "$a\n";
recursion($a + 1);
}
}
8.匿名函数
匿名函数(Anonymous functions),也叫闭包函数(closures),匿名函数目前是通过 Closure
类来实现的。
//匿名函数
function (参数名称) {
函数体;
}
//静态匿名函数
static function (参数名称) {
函数体;
}
9.箭头函数
箭头函数是一种更简洁的 匿名函数 写法。箭头函数也是 Closure
类的实现。
fn (参数名称) => expr
10.魔术(Magic)方法
PHP将所有以 __
(两个下划线) 开头的类方法保留为魔术方法。所有的魔术方法都必须声明为 public
。
__construct() __destruct() __call() __callStatic()
__get() __set() __isset() __unset()
__sleep() __wakeup() __serialize() __unserialize()
__toString() __invoke() __set_state() __clone()
__debugInfo()
11.final方法
final
关键字加在方法前面可以防止父类方法被子类方法覆盖。
除了构造函数之外,private
方法不能声明为 final
。
class A
{
final function operation()
{...}
}
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/4946.html