开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1311|回复: 0
收起左侧

[PHP相关教程] PHP - 函数

[复制链接]
发表于 2020-7-15 18:56:00 | 显示全部楼层 |阅读模式   山东省德州市

函数

1. 语法

函数是实现代码复用的重要方式,在所有编程语言中均如此

function 函数名称(类型: 参数列表): 返回值类型
{
    // 函数体
    return 返回值;
}
序号 名称 描述
1 function 声明函数
2 函数名称 符合 PHP 标识符命名规范,不区分大小写
2 参数列表 零个或多个接收外部传入到函数的变量
2 {... 创建出一个封闭的函数作用域
2 函数体 由零个可多个合法的 PHP 语句组成
2 return 值 将执行结果返回函数调用者[可选]
2 ...} 函数执行结束,如果没有return,则返回null

function getPrice(int $a , int $b) : int
{
    $c = $a+$b;
    return $c;
}
echo getPrice(2,3);
 //上面限定了参数和返回值类型int 那么只能返回int
 // 如 echo grtPrice(2.2,3.3) 只计算整数部分2+3 设置为float即可计算小数

2. 类型

序号 类型 语法 描述
1 自定义函数 function getName(){...} 用户根据业务需求创建
2 系统函数 substr(), count()... 也叫预定义函数,不必声明直接调用
3 可变函数 $funcName(); 函数名使用变量表示
4 匿名函数 $f = function (){...} 也叫"闭包"或"函数表达式",常用做回调处理

上面的示例 即为自定义函数

2.2 系统函数

常用系统函数https://www.php.cn/blog/detail/20906.html

是由 PHP 系统提供给用户用的,不需要用户去创建的函数

// 系统函数
$str = '我爱你中国,亲爱的母亲';
// 截取字符串
echo mb_substr($str , 0 , 7);   //输出 我爱你中国,亲
//某字符串出现次数
echo substr_count($str ,'爱');  //输出 2

2.3 可变函数

function rice(int $a , int $b)
{
      echo $a+$b;
}
rice(2,3);
echo '<hr>';
// 可变函数,将函数名赋值为一个变量的值
$get = 'rice';
$get(5,6);
echo '<hr>';

跟可变变量一样

2.4 匿名函数

// 匿名函数
// 声明一个折扣率
$discount = 0.8;
// 匿名函数结束必须要有‘;’ 因为他现在是一个赋值语句、用use() 访问外部变量
$Amont = function(float $money, int $num) use ($discount) :float
{
   $amount = $money * $num;
   return $amount >= 2000 ? $amount * $discount : $amount ;

};

echo $Amont(100,20); //输出 1600

3. 返回值

  • 函数必须要有返回值
  • 函数必须是遵守单值返回原则
序号 场景 描述
1 return 可以返回任何类型的值,包括函数类型
2 return 遇到}也会返回, 默认返回null
  • 如果需要返回多个值,可以通过以下手段
序号 返回值类型 描述
1 string 字符串拼接
2 array 数组
3 json JSON 字符串
4 serialize 序列化字符串

json 跟 serialize 的区别

(1)serialize 主要用于 php 的序列化,存储到文件或者数据库中,json_encode 也是序列化,但是 主要用于与其他语言比如 js 进行交互使用,对于传输来说,json 有许多优点。

(2)在显示上,serialize 序列化的字符串包含额外的内容,这是值的类型和长度的编码

(3)在进行 json_decode 解码的时候需要注意,如果是序列化的数值型数组,那么 json_decode 可以还原为原来的数组(数值型数组哦),但是,如果序列化的是关联数组(或者对象),那么由于 json_decode 无法判断是关联数组还是对象(我们可以理解为这两个长的像无法区分),所以 json_decode 会默认还原解析为 stdclass 的对象,如果加了 true 才解析为关联数组

(4)json_encode 不能序列化对象的成员方法,代码如下:

serialize 序列化之后,反序列化的数据,可以重新调用成员方法,但是 json_decode 不行,会报错,具体可以测试、

(5)__sleep__wakeUp 魔术方法

  • 当一个对象被序列化,PHP 会调用 __sleep 方法(如果存在的话,并且进行操作,比如对变量赋值). 在反序列化一个对象后,PHP 会调用 __wakeup 方法. 这两个方法都不接受参数.__sleep 方法必须返回一个数组,包含需要序列化的属性. PHP 会抛弃其它属性的值. 如果没有 __sleep 方法,PHP 将保存所有属性.
  • 在程序执行前,serialize() 函数会首先检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用, 然后才执行序列化操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组(必须返回。与之相反,unserialize()会检查是否存在一个__wakeup 方法。如果存在,则会先调用 __wakeup 方法,例如可以用于数据库的重新连接

json 和序列化,使用时需要进行解码操作


// 字符串拼接 用 ‘.’ 拼接  ""双引号可以解析里面的变量

function getSum($a,$b)
{
   return "$a * $b =" . $a*$b ;
}

echo getSum(5,6);   //输出 5 * 6 = 30
// 数组返回

function tianqi(): array
{
    return ['city'=>'北京','today'=>'星期一','date'=>'2020年4月21日14:48:00'];
}

$tianqi = tianqi();

echo $tianqi['city'];  //输出 北京

echo '<hr>';

// 转为匿名函数

$tianqi  = function (): array
{
    return ['city'=>'北京','today'=>'星期一','date'=>'2020年4月21日14:48:00'];
};

// $tianqi = tianqi();

// echo $tianqi['city'];
# 这个地方会报错,提示不能将闭包类型的对象用作数组。
echo $tianqi()['city'];
#这样写才是对的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表