百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

PHP从基础到入门(三)

wptr33 2025-03-02 19:15 15 浏览

本文章为连载文章PHP入门的第二篇

建议先阅读前篇文章:PHP从基础到入门(二)

函数

函数基础

函数的定义:

形式:

function 函数名 ( 【$形参1】 【,$形参2】 【,.... 】 ){

//函数体。。。。。。

}

说明:

1,定义时使用的形参,其实就是一个变量——只能在该函数内部使用的变量

2,形参作为变量,其名字是“自己定义”——自然应该遵循命名规范;

函数的调用:

函数名($实参1, $实参2, ..... );

说明:

1,实参应该跟要调用的函数的形参“一一对应”;

2,实参就是“数据值”,可能是直接值(比如5,”abc”),也可能是变量值(比如$v1)

函数调用详细过程

1,首先,将函数调用时的实参数据,传递(赋值)给函数的形参(变量);

2,程序的执行流程,进入到函数内部——此时可以认为是一个跟外界“隔离” 的“独立运行空间”。

3,在函数内部,按正常的流程顺序,执行其中的代码;

4,直到函数结束,则退出该运行空,而返回到原来调用函数的位置,继续执行后续代码!

5,如果在函数内部执行的过程中,有return语句,则也会立即终止函数,并回到函数调用位置。

数的参数问题

函数形参的默认值问题

我们可以给一个函数定义时的形参,赋值一个“默认值”,则这个函数调用的时候,该形参对应的实参,可以不给值。

函数形参的默认值,可以只给部分形参设置默认值,但设置默认值性的形参,都要放在“右边”(后边):

形参的传值问题

一句话:形参的传值问题,其实就是“变量之间的传值问题”:

其实无非就是实参变量,传值给形参变量的问题。

即:

此时,也同样有两种传值方式:

值传递:

这是默认值。如果没有特别设定,参数传值都是值传递。

引用传递:

需要在形参的前面加 &符号:

函数参数的数量问题

1,通常,函数调用时的实参数量,应该跟函数定义时的形参数量保持一致。

2,如果函数定义时,形参有默认值,则对应的实参就可以进行一定程度的省略:

注意:省略只能从右往左进行。

3,有一种定义和使用函数的特别形式(并不常见):它不定义形参,而实参任意给出。

其实,系统中也有类似的函数:,比如:

var_dump($v1);

var_dump($v1, $v2, $v3); //ok!

可见,该函数就可以接受任意个数的实参;

我们自己也可以定义这种函数。其实,这种函数,依赖的是以下3个系统函数来获取相应的信息,以得到实参数据的处理:

1: func_get_args(); //获取实参数据列表,成为一个数组

2: func_get_arg($i); //获取第$i个实参数据,$i从0开始算起;

3:func_num_args(); //获取实参的数量(个数)

下面就是例子:

函数的返回值问题

一个观念问题:

函数的返回值,不是语法规定,而是应用所需:需要就返回,不需要就无需返回。

返回值,一定是通过return语句!

形式:

function 函数名(....)

{

//。。。。。。

return XX数据;

}

注意:

return语句的作用,不管后面跟不跟数据值,都会立即终止函数的执行,返回到函数调用的位置并继续后续工作。

函数的其他形式:

可变函数

先想想可变变量:

$v1 =”abc”;

$abc = 123;

echo $$v1; //输出123,这就是所谓的可变变量。

可变变量:一个变量的名字还是一个变量!

可变函数:一个函数的名字是一个变量!

演示可变函数的一个灵活性使用:

匿名函数

匿名函数就是没有名字的函数。

有2种形式的匿名函数:

形式1:将一个匿名函数“赋值”给一个变量——此时该变量就代表该匿名函数了!

形式2:

是直接将一个匿名函数,当做“实参”来使用!——即调用“别的函数A”的时候,使用一个匿名函数来当做实参。自然,在该函数A中,也就应该对该匿名函数当做一个函数来用!

变量的作用域问题

变量的作用域,就是指:一个变量,在什么范围中可以使用的情况。

php中,有3中变量作用域:

局部作用域:

就是指一个函数的内部范围。

对应这样的变量,就称为“局部变量”;

超全局作用域:

就是指所有的代码范围。

对应这样的变量,就称为“超全局变量”;

其实只有系统预定义的几个:$_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_SESSION, $_COOKIE, $_FILES

全局作用域:

就是不在函数内部的范围——函数外部。

对应这样的变量,就称为“全局变量”;

通常,

1,全局范围不能访问局部变量;

2,局部范围不能访问全局变量;

3,函数内部的变量(局部变量),通常在函数调用执行结束后,就被“销毁”了。

4,但有一种局部变量,在函数调用结束后不被销毁:它叫做“静态变量”;

使用形式:

function 函数名 (....){

static $变量名 = 初始值; //这就是静态变量!

。。。。。。

}

如果在局部作用域使用(访问)全局变量?(常见需求)

有2种做法:

做法1:

使用global关键字来实现:

做法2:

使用$GLOBALS超全局变量来实现:

但,如果我们对$GLOBALS变量的某个单元(也即下标)进行unset,则其就会完全对应销毁该变量。

这是因为,$GLOBALS对全局变量的使用可以看做是全局变量的另一种语法形式而已,而不是“引用关系”,举例如下:

有关函数的系统函数:

function_exists():判断一个函数是否被定义过。其中使用的参数为“函数名”:

func_get_arg($i): 获取第i个实参值

func_get_args(): 获取所有实参(结果是一个数组)

func_num_args(): 获取所有实参的个数。

其他系统函数:

自己会查,并需要去查:

字符串函数:

输出与格式化:echo , print, printf, print_r, var_dump.

字符串去除与填充:trim, ltrim, rtrim, str_pad

字符串连接与分割:implode, join, explode, str_split

字符串截取:substr, strchr, strrchr,

字符串替换:str_replace, substr_replace

字符串长度与位置: strlen, strpos, strrpos,

字符转换:strtolower, strtoupper, lcfirst, ucfirst, ucwords

特殊字符处理:nl2br, addslashes, htmlspecialchars, htmlspecialchars_decode,

时间函数:

time, microtime, mktime, date, idate, strtotime, date_add, date_diff, date_default_timezone_set, date_default_timezone_get

· 数学函数:

max, min, round, ceil, floor, abs, sqrt, pow, round, rand

有关函数的编程思想

递归思想——递归函数

递归函数,就是:在一个函数内部调用它自己的函数!

先考察一个最简单的函数:

function f1( $n ){

echo $n;

$n++;

f1( $n );

}

f1(1);

从这个简单的函数可以看出,该函数调用是“永无止境”的(没完没了),最终会将内存消耗完毕。

显然,这不是一个正常的做法!

实用的递归函数是:能够控制这个调用的过程中,会在某个时刻(条件下)停下来!

实例演示:

求5的阶乘。

数学上,有这样两个有关阶乘的基本规则:

1,n的阶乘,是n-1的阶乘,乘以n的结果。

2, 1的阶乘是1;

现在,假设,有一个函数,该函数“能够”计算n的阶乘。

function jiecheng( $n ){

//.....

}

$v1 = jiecheng(8); //结果应该是8的阶乘

$v2= jiecheng(5); //结果应该是5的阶乘

递归思想总结:

当面对一个“大问题”,该大问题可以经由该问题的同类问题的“小一级问题”而经过简单计算获得,而且,可以获知(已知)这类问题的“最小一级问题”的答案。则,此时就可以使用递归方法来解决该问题。

则此时该函数的基本模式是:

function digui( $n ){

if(是最小一级){

return 已知的答案;

}

$jieguo = 对 digui($n-1) 进行简单运算;

return $jieguo;

}

课间练习:

以下数列:1, 1, 2, 3, 5, 8, 13, .......

说明:

第1项是1,第2项也是1(都是已知);

其他项,是其前两项的和;

求:第20项;

function shulie( $n ){ //把n理解地第几项;

if( $n== 1 || $n == 2 ){

return 1;

}

$jieguo = shulie($n-2) + shulie($n-1);

return $jieguo;

}

$v1 = shulie( 20) ;

递归思想图示:

递推(迭代)思想

也同样思考这个问题:

求5的阶乘:

先演示最初级的做法:

将上述代码,使用一个变量,也同样能完成:

然后,将上述代码的规律性体现出来——就是使用循环:

然后,将该语句,再次进行转换,使用递推思想中的2个观念:前一个答案,后一个答案:

递推总结:

如果要求一个“大问题”,且该问题有如下2个特点:

1,已知该问题的同类问题的最小问题的答案。

2,如果知道这种问题的小一级问题的答案,就可以轻松求得其“大一级”问题的答案,并且此问题的级次有一定的规律;

则此时就可以使用递推思想来解决该问题,代码模式为:

$qian = 已知的最小一级问题的答案;

for( $i = 最小一级的下一级; $i <= 最大一级的级次; ++$i){

$jieguo = 对 $qian 进行一定的计算,通常需要使用到$i;

$qian = $jieguo;

}

echo “结果为:” . $jieguo;

递推思想图示:

通常,如果一个问题,既能使用递归算计解决,又能使用递推算法解决,则应该使用递推算法。

下面用递推思想来完成刚才的数列题:

以下数列:1, 1, 2, 3, 5, 8, 13, .......

求第20项:

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...