【PHP】函数
这篇文章是PHP总复习 Advent Calendar的第5天文章!
我本打算写一下关于类型的内容,但是已经有人非常详细地解释过了!关于PHP的类型和类型安全(从PHP7开始的PHP编程)。
在这个问题中,我们将讨论函数,它是指在何种情况下我们需要意识到“型”的存在!如果您已经对用户定义函数的概述有所了解,可以直接跳过这部分!笑
函数是什么?
变量是用来存放值的容器,而函数是用来将多个处理步骤整合起来的东西。
有预先提供的”内置函数”和自己定义的”用户定义函数”。
如何使用和编写函数
内置函数。
例如,对于isset()函数来说。PHP手册
$result = isset($name);
这个函数用于检查$name是否已设置,并返回布尔类型的true或false。
将传递给函数的值(这里是$name)称为“参数”,返回的值称为“返回值(或称为回值)”。
通过以上写法,返回值将存储在$result中。
由于在这里返回值是布尔类型,因此在下一步处理中
// もしtrueだったら
if ($result) {
・・・
}
那就是可以继续进行这个处理的意思对吧。
有许多内置函数,如isset()、substr()、explode()等等,以至于无法全部记住。
在使用之前,不是记住它们,而是通过查看PHP手册等来检查参数和返回值类型。
用户自定义函数
自己编写的函数也具有“参数”和“返回值”的概念。它会执行一些操作并返回结果。
基本写作技巧
<?php
// greetingという名前をつけた関数
function greeting($name) {
$message = 'Hello, '. $name. '!'; // 処理
return $message; // 結果を返す
}
$message = greeting('Tom');
echo $message; // 'Hello, Tom!'
<?php
// greetingという名前をつけた関数
function greeting($name) {
$message = 'Hello, '. $name. '!'; // 処理
return $message; // 結果を返す
}
$message = greeting('Tom');
echo $message; // 'Hello, Tom!'
当函数返回结果时,处理将在此处结束。
<?php
function greeting($name) {
$message = 'Hello, '. $name. '!';
return $message;
$message .= 'Nice to meet you.'; // この部分は実行されない
}
$message = greeting('Tom');
echo $message; // 'Hello, Tom!'
顺便说一句,刚开始作为初学者时理解起来很困难,函数内部的$message变量和返回值的$message是不同的。
函数内部的变量是局部作用域(仅在函数内部可引用)。
<?php
function greeting($name) {
$message = 'Hello, '. $name. '!';
return $message;
}
$greeting = greeting('Tom');
echo $greeting; // 'Hello, Tom!'
echo $message; // 宣言されていないのでエラーになる
如果您对此内容不太理解,请参考变量作用域的部分!
传递多个参数
在向函数传入多个参数的情况下,我们按照从左到右的顺序称之为第一个参数,第二个参数… 同样,调用函数时也要注意按照从左到右的顺序进行传递。
<?php
function greeting($time, $name) {
$message = 'Good '. $time. ', ' $name;
return $message;
}
$message = greeting('morning', 'Tom');
echo $message; // 'Good morning, Tom';
在这里,$time是第一个参数,$name是第二个参数。
返回一个数组的函数
您还可以使用数组来返回多个值。在这种情况下,返回值将被接收为list()或数组。
<?php
function children() {
return ['Tom', 'Bob', 'Emily'];
}
$children = children();
list($elder, $younger, $sister) = children();
echo $children[0]; // 'Tom'
echo $elder; // 'Tom'
没有返回值的函数
有时也可能没有返回值。
<?php
function greeting($name) {
$message = 'hello, '. $name. '!';
echo $message;
}
greeting('Tom'); // 'hello, Tom!'と表示される
在函数内使用”echo”函数来输出消息,所以即使不接收返回值也会有输出。
在评论中明确指定类型
由于无法确定用户自定义函数返回的值是什么,最好在注释中明确指定类型(称为PHPDoc)。
<?php
/**
* @param string $name
* @return string
*/
function greeting($name) {
$message = 'Hello, '. $name. '!';
return $message;
}
$message = greeting('Tom');
echo $message; // 'Hello, Tom!'
@param表示传入参数,@return表示返回值。PHP手册
关于注释的内容稍后将会整理!
模型宣言
而且,您可以声明参数的类型(类型提示)。(*请注意,在较旧版本的PHP中无法执行/行为不同)
<?php
function greeting(string $name) :string {
$message = 'Hello, '. $name. '!';
return $message;
}
在这种情况下,如果传递给$name的不是字符串类型,将会产生错误。
设置默认值为参数
我们可以为参数设置默认值。这在创建不会因为没有传入参数而导致错误的处理时非常有用。
<?php
function greeting($name = 'guest user') {
$message = 'Hello, '. $name. '!';
return $message;
}
echo greeting('Tom'); // 'Hello, Tom!'
echo greeting(); // 'Hello, guest user!'
为了防止意外错误的发生,重要的是要意识到类型!
用户自定义函数汇总
<?php
/**
* @param string $name
* @param array $date
* @return string
*/
function greeting(string $name = 'guest user', array $date) :string {
$message = 'Hello, '. $name. '!';
$message .= 'It's '. $date[0]. ' '. $date[1];
return $message;
}
$user = 'Tom';
$today = ['December', '5th'];
echo greeting($user, $today); // 'Hello, Tom!It's December 5th'
<?php
/**
* @param string $name
* @param array $date
* @return string
*/
function greeting(string $name = 'guest user', array $date) :string {
$message = 'Hello, '. $name. '!';
$message .= 'It's '. $date[0]. ' '. $date[1];
return $message;
}
$user = 'Tom';
$today = ['December', '5th'];
echo greeting($user, $today); // 'Hello, Tom!It's December 5th'
理解到这个程度真是太令人愉快了!
编写用户定义函数有很多种方法。
函数声明
这是介绍到目前为止的调用函数的写法。
<?php
function FUNCTION_NAME() {
// 処理
return VALUE;
}
FUNCTION_NAME();
函数名称不区分大小写。
匿名函数
从PHP5.3开始,可以使用匿名函数。匿名函数字面上就是没有名称的函数。
<?php
$greeting = function($name) {
$message = 'hello, '. $name. '!';
return $message;
}
echo $greeting('Tom');
同样可以将变量继承给匿名函数。
<?php
$time = 'morning';
$greeting = function($name) use ($time) {
$message = 'Good '. $time. ', '. $name;
return $message;
}
echo $greeting('Tom'); // 'Good morning, Tom'
在使用频率仅为一次的函数上,例如DB事务处理等,使用匿名函数可以防止代码冗长化。
当我刚开始学习编程的时候,由于不理解类型,常常遇到写了一些不明所以的代码然后产生错误。所以,强烈建议大家应该好好理解类型!现在能够进行类型声明了,感觉非常爽快呢( 厂˙ω˙ )厂