凡是过往,皆为序章

0%

PHP基础知识(四)

这篇文章总结php代码嵌套到html中所需的标签语法,还有php中函数的定义和使用。


标签语法

概念

标签语法,指当PHP代码嵌入到HTML中时,为了让PHP代码的结构更加符合HTML的规范而设定的语法结构。

  • PHP标签语法不是所有的结构都存在。

  • PHP标签语法只提供了两种针对{}的解决方案。

    • 分支标签:即当分支语法出现时,可以使用标签语法代替。
    • 循环标签:即当循环语法出现时,可以使用标签语法代替。
  • 标签语法规则

    • 当分支或循环的{出现时,使用冒号:代替。
    • 当分支或循环的}出现时,使用相应的end + 标记内容;代替。
  • PHP提供的标记语法

    • IF分支
    • switch分支
    • while循环
    • for循环
    • foreach循环
    • 语法格式:
      • 起始标记(if为例):if(条件表达式):
      • 结束标记(if为例):endif;

案例(九九乘法表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<title>九九乘法表</title>
</head>
<body>
<table>
<?php for ($i=1; $i <= 9; $i++):?>
<tr>
<?php for ($j = 1; $j < $i; $j++):?>
<td>
<?php echo "$j * $i = ".$j * $i;?>
</td>
<?php endfor;?>
</tr>
<?php endfor;?>
</table>
</body>
</html>

函数

定义方法:

1
2
3
4
function 函数名(参数){
函数体(代码块);
return 返回值;
}

使用方法:函数名(),即可。

return可以返回任何类型的数据。

默认值

如果实际传入的参数没有提供,则会使用默认值。

1
2
3
function f($num1 = 0,$num2 = 0){
...
}

变量的引用传递

1
2
3
function f($n1,&$n2){
...
}

注意:函数允许使用时实参对于形参,只是不用而已,但实参不能少于形参。

下面介绍函数的一些高级用法。

作用域

局部作用域(局部变量)

在其他结构(函数)内部定义的作用域。

全局作用域(全局变量)

未在其他结构(函数)内部定义的作用域。

超全局作用域(超全局变量)

即在脚本中的任意位置。

超全局变量:系统定义的预定义变量。

全局变量会自动吸纳到超全局``$GLOBALS`,可以利用超全局变量来保存数据,让数据不受作用域限制。

1
2
#此时是给超全局变量增加一个var元素,相当于定义了一个全局变量。
$GLOBALS['var'] = 'hello world';
1
2
3
4
5
6
7
<?php
$v1 = 1;
function f(){
//echo $v1;报错
echo $GLOBALS['v1'];//在函数体内使用超全局变量
}
f();

$GLOBALS会自动包含全局变量,同时还有以下超全局变量。

  • $_GET:自动接收GET提交的数据
  • $_POST:自动接收POST提交的数据
  • $_COOKIE:自动接收cookie数据
  • $_FILES:自动接收文件上传的数据
  • $GLOBALS:自己包含自己

一个特殊的关键字global

1
2
3
4
5
6
7
<?php
$v1 = 1;
function f(){
global $v1;
echo $v1;
}
f();

其含义是在函数内定义一个局部变量,并且与全局变量同名,处于“引用关系”,可以直接使用。

总结:$GLOBALS数组(变量)和global关键字都能实现:在局部作用域使用全局变量。

静态变量

概念:在函数内部定义,可以在函数多次调用时共用的局部变量

  • 使用static关键字修饰
  • 是在函数内部定义的局部变量
  • 在函数加载时初始化(只初始化一次)
  • 可以在同一个函数多次调用时共享数据的变化
1
2
3
4
5
6
7
8
9
function display(){
#记录函数被调用了多少次
$count1 = 0;
static $count2 = 0;
echo ++$count1,++$count2,'<br/>';
}

display();#11
display();#12

使用场景

  • 数据需要函数多次共享
  • 递归存储数据的时候

强制类型

PHP可以利用强类型来规范函数的输入(参数)和输出(返回值)

  • 强类型参数
  • 强类型返回值

强类型参数

在定义函数时给形参设定类型

  • 类型规范是PHP的8种类型

  • 强类型的作用

    • 实参必须是形参规定类型
    • 保护函数内部运行逻辑正确
    • 省区函数内部判定逻辑
    • 提升解析效率
  • 强类型语法

    1
    function 函数名(类型 变量名){}
    1
    2
    3
    function add(float $a,float $b){
    return $a + $b;
    }
  • 强类型的选择

    • PHP是弱类型语言,会自动转换类型,一般可以不用。
    • 不想在内部进行过多的逻辑判断,可以适用强类型参数进行限定。

强类型返回值

指在函数定义时就规定好函数的返回值类型

  • 强类型是PHP的8种类型

  • 强类型规定后,函数内部的返回值必须是指定类型

  • 想让强类型完全生效,需要提前声明

    • declare(strict_types = 1)
  • 强类型返回值语法

    1
    function 函数名():返回值类型{}
    1
    2
    3
    4
    5
    6
    7
    function is_int($n):bool{
    if(is_integer($n)){
    return TRUE;
    }else{
    return FALSE;
    }
    }

可变参数

PHP提供了一种对于参数不固定的处理方式

  • PHP在5.6以后提供了一种主动获取多余的实参的方式
  • 可以使用...符号实现数组数据的拆分

实例:求两个(或多个)数的和

1
2
3
4
5
6
7
8
9
10
#定义函数:多余的形参使用...$args保存
function my_sum($a,$b,...$args){
#2、$args会接受多出的参数($a和$b为固定参数)
#3、在函数内部可以使用$args访问多出的实参
$sum = $a + $b;
foreach($args as $v){
$sum += $v;
}
return $sum;
}

还可以将实参数组拆分构成多个数据

1
2
3
4
5
function my_sub($a,$b){
return $a = $b;
}
$arr = [10,4];
echo my_sub(...$arr);#输出6

获取所有参数的和

1
2
3
4
5
6
7
8
9
10
11
12
function sum(){
$num = func_get_args();//获取参数,是一个数组变量,保存在num中
$count = count($num);//计算数组个数,即参数个数
//$count = func_num_args();获取参数个数
$sum = 0;
for($i = 0;$i<$count;$i++) {
$sum+=$num[$i];
}
return $sum;
}
$sum = sum(1,2,3,4);
echo '可变参数和:'.$sum;

可变函数

即一个变量所保存的值刚好是另外一个函数的名字,那么可以通过变量直接访问函数

  • 变量的值是一个函数名(字符串)
  • 变量+()就可以当作函数名访问函数

示例

1
2
3
4
5
6
7
function display(){
echo 'hello world!';
}

$var = 'display';#变量名为一个函数的名字

$var();#即调用display()函数

实际运用:通常我们是将自定义的函数作为系统函数或者其他位置的回调函数(callback)使用

1
2
3
4
5
6
7
8
9
10
11
12
#取得一个数的绝对值
function jdz($n){
return $n < 0 ? -$n : $n;
}

#求两个数的绝对值的和
function sum_jdz($a,$b,$func){
#利用外部的$func函数(回调函数)来实现$a和$b的绝对值求和
return $func($a) + $func($b);
}

echo sum_jdz(-1,-1,'jdz');#输出2

匿名函数

  • 简单匿名函数
  • 回调匿名函数
  • 匿名函数闭包

简单匿名函数

即函数没有名字,使用变量保存函数的内存地址

1
2
3
4
5
6
变量 = function(){
函数体
return 返回值
};
#调用
变量();

回调匿名函数

指直接将匿名函数定义在函数的实参中,当作一个实参传递给形参

1
2
3
4
5
6
7
8
9
10
11
12
13
#求数组元素的所有立方
$arr = [1,2,3];
#定义一个函数:能够取得数组的所有立方
function my_cube($arr,$cube){
$list = [];#存储结果
foreach($arr as $value){
$list[] = $cube($value);#调用计算立方的函数
}
return $list;
}
#直接传一个匿名函数
$res = my_cube($arr,function($num){return $num ** 3;});
print_r($res);

匿名函数闭包

概念

闭包是一个定义在函数内,能都读取其他函数内部变量的函数(闭包函数)

  • 函数定义在某个函数内部
  • 内部函数是匿名函数
  • 内部函数访问外部函数的局部变量
    • 不能直接访问,访问需要使用use关键字
1
2
3
4
5
6
7
function outer($str){
$inner = function() use ($str){
echo $str;
};
$inner();
}
outer('hello world!');#输出hello world!

闭包函数可以返回给外部函数调用,这样可以使得闭包所占用的外部函数资源不被释放

1
2
3
4
5
6
7
8
function outer($str){
$inner = function($s) use ($str){
echo $str.$s;
};
return $inner;
}
$res = outer('hello');
$res('world');#输出helloworld

原理

  • 函数outer调用结束,没有释放内存
  • outer返回了一个内部闭包函数的引用,所以函数不会释放
  • $inner内部闭包函数引用了一个外部函数的局部变量,所以outer也不能释放$str
  • $res(‘world’)找到函数执行,并且应用了之前函数的局部变量$str,所以组合输出helloworld。

系统函数

常用的系统函数列表

1、常见输出类

  • echo:不需要使用括号
  • print_r:输出变量的结构
  • var_dump:详细打印变量的结构和数据
  • exit/die:输出消息并终止脚本执行

2、常见日期类

  • time:获取当前时间的时间戳(从格林威治时间1970年1月1日),精确到秒(一个整数)

  • date:按照指定格式输出时间,可以是当前时间也可以是指定时间戳

    1
    echo date("当前时间:Y-m-d H:i:s");
  • strtotime:将任何英文文本日期时间描述转换成时间戳

  • micotime:获取时间戳和微秒数(精度高),两个用法:

    • micotime(true):获取秒数,浮点型。
    • micotime(false):获取秒数,字符串型。默认不写参数为false。

3、数学类

  • max:获取多个数中最大值(可以实数组)
  • min:最小值
  • floor:舍去法取整(向下取整),获取不大于当前数值的最大整数
  • cell:进一取整(向上取整),获取不小于当前数值的最小整数
  • mt_rand:获取指定区间或者0到最大数之间的一个随机整数
  • round:根据指定小数位进行四舍五入
  • abs:绝对值
  • sqrt:开方
  • pow:幂次方的运算
  • rand、mt_rand:获取两个数之间的随机整数

4、字符串类

输出

print:输出一个字符串

print_r:输出较为详细的信息

var_dump:输出完整信息

字符串去除与填充

trim:消除字符串两端的空白字符或指定字符

ltrim:左边

rtrim:右边

str_pad:将一个字符串使用指定的字符填充到指定的长度

字符串连接与分割

implode:将一个数组的值连接起来组成一个字符串,可以指定连接的符号

join:同上

explode:将一个字符串使用指定的字符分割为一个数组

str_split:将一个字符串按指定的长度分割为一个数组

字符串截取

substr:获取一个字符串指定位置开始的指定长度的子串

strstr:获取一个字符串中某个指定字符首次出现的位置起,到最后结尾处的字符

strrchr:获取一个字符串中某个指定字符最后出现的位置起,到最后结尾处的字符

字符串替换

str_replace:将一个字符串中的指定字符替换为新字符。

substr_replace:将一个字符串中指定位置开始的指定个数的字符,替换为给定的新字符。

字符串长度与位置

strlen:获取字符串的字节长度。

strpos:获取一个字符串中某个子串首次出现的位置。

strrpos:获取一个字符串中某个子串最后一次出现的位置。

字符转换

strtolower:转换为小写

strtoupper:转换为大写

lcfirst:首字母小写

ucfirst:首字母大写

ucwords:所有单词的首字母大写

特殊字符处理

nl2br:将换行符转换为“<br />”标签字符

addslashes:将一个字符串中的特数字符进行反斜杠转义。

htmlspecialchars:将html中的特殊字符转换为html实体字符。

htmlsecialchars_decode:将实体字符转换为原本的字符。

5、数组类

max:获取数组中的最大值。

min:获取数组中的最小值。

count:获取数组的元素个数。

in_array:判断以恶数据是否在指定数组中。$b = in_array(数组,数据);结果为布尔。

range:生成某个范围的连续数组。例如range(3,6)得到数组array(3,4,5,6);

array_keys:取出所有键并放到一个索引数组中。

array_values:取出所有值并放到一个索引数组中。

array_push:将一个或多个数据放入一个数组的末端。

array_pop:将数组的最后一个单元删除,并返回该单元的值。

array_reverse:将数组反转。

数组的排序

sort:由低到高、rsort:由高到低、asort、arsort等。

数组的查找

in_array():在一个数组中找是否存在某个数据。

array_search():在数组中搜索给定的值,如果成功则返回相应的键名。

array_key_exists():检查给定的键名或索引是否存在于数组中。

~感谢你请我吃糖果~
-------------本文结束,感谢您的阅读,欢迎评论留言!-------------