1、PHP的值传递
<?php
namespace _0809;
//变量命名与js规则一样
//变量赋值
//1.默认:值传递
$username = '朱老师';
//更新
$myname = $username;
printf('$username=%s | $myname = %s',$username,$myname);
echo '<hr>';
//2.引用传递
//变量前:&取地址符,表示引用
//引用传递,会同步更新原始变量,因为你引用的是同一个变量.
//其实引用传递,并没有创建新变量,而是给原始变量,起了一个别名
//所以可以给同一个变量,起多个别名,是完全可以的,大家可以试试看.
$yourName = &$username;
$yourName = '张老师';
printf('$username=%s | $yourName = %s<br>',$username,$yourName);
上述运行结果:
2、PHP数据类型
<?php
namespace _0809;
//数据类型
//1.基本类型:不可再分
//数值类型:int(整形),float(浮点型)
$age = 20;
$price = 88.88;
//string
$username = 'admin';
//boolean
$isDel = true;
//-----------------------
//2.复合类型
//数组
$arr = [20, 'admin', true];
//对象
// class Demo{};
// $obj = new Demo();
//或者用匿名类的方式声明类
//new的时候要传参,参数会传递给构造函数
$obj = new class(15000)
{
public float $salary;
//!构造函数要用两个下划线+construct
public function __construct(float $salary)
{
//设置属性初始值
$this->salary = $salary;
}
};
echo gettype($obj);
echo '<br>';
echo $obj->salary .'<br>';
//null
//null:表示变量没有值
//三种情况为null
//1.赋值null,2.没赋值,3.被销毁unset()
$x = null;
$x = 123;
// unset($x);
echo gettype($x) . '<br>';
//资源类型
$f = fopen('demo1.php','r');
echo gettype($f) . '<br>';
//回调类型callback
//php用字符串来传递函数,所以可以以任何形式传递函数.
//所以回调函数不仅包括函数,还包括对象方法,静态类方法等.
//接收回调的函数很多,例如前面遇到的array_filter
function hello(string $name,float $salary): string
{
return 'Hello' . $name . ',工资是' . $salary;
};
echo hello('王老师',12345) . '<br>';
//也可以用回调的方式来执行
//echo call_user_func(函数名,参数列表) 调用用户的自定义函数
echo call_user_func('_0809\hello','张老师',56789) . '<br>';
//!在有命名空间的条件下会报这样一个错
//!Warning: call_user_func() expects parameter 1 to be a valid callback, function '
//!barber' not found or invalid function name in
//如果想不报错,需要在函数名前面加 命名空间名\
//命名空间就是在函数 方法前面拼接了命名空间的字符串 在函数的 hashtable里名字已经变成 命名空间拼接上 函数名
//call_user_func还支持数组传参_array
$params = ['张老师',56789];
echo call_user_func_array('_0809\hello',$params) . '<br>';
/**
* call_user_func(函数名,参数列表)
* call_user_func_array(函数名,[参数列表...])
* 哪怕只有一个参数,也尽量使用第二种
* 这个函数参数可以有三个来源
* 1.用户自定义的函数
* 2.对象方法
* 3.类方法/静态方法
*/
//如果这个函数来自对象方法
class Demo1{
public function hello(string $name):string
{
return 'Hello ,' . $name;
}
}
$obj = new Demo1;
//由于hello不是一个全局函数,是一个对象方法,所以要写道数组里[对象,对象中的方法]
echo call_user_func_array([$obj,'hello'],['刘老师']) . '<br>';
//如果这个函数来自:类方法(静态方法)
class Demo2
{
public static function hello(string $name): string
{
return 'Hello ,' . $name;
}
}
echo call_user_func_array(['_0809\Demo2','hello'],['王老师']) . '<br>';
上述运行结果:
3、PHP流程控制
<?php
namespace _0809;
//流程控制:分支
//单分支
$age = 25;
if($age >= 18){
echo '已成年,可以观看<hr>';
}
//双分支
if($age >= 18){
echo '已成年,可以观看<hr>';
}else{
//默认分支
echo '未成年,请在父母陪同下观看<hr>';
}
//双分支语法糖:三元运算符
//条件?true:false
echo $age >=18?'已成年,可以观看<hr>' : '未成年,请在父母陪同下观看<hr>';
//多分支
if($age >=18 && $age < 30){
echo "{$age}岁,彩礼能按揭吗?<hr>";
}else
if($age >=30 && $age < 45){
echo "{$age}岁,应该成个家了<hr>";
}else
if($age >=45 && $age<100){
echo "{$age}岁,房贷快还完了<hr>";
}else
if($age >=100 || $age<=0){
}
else{
echo "{$age}岁,我送你回家<hr>";
}
//多分支语法糖:switch
$age = 43;
switch ($age){
case $age >=18 && $age < 30 :
echo "{$age}岁,彩礼能按揭吗?<hr>";
break;
case $age >=30 && $age < 45 :
echo "{$age}岁,应该成个家了<hr>";
break;
default:
echo "{$age}岁,我送你回家<hr>";
}
/**
* 分支
* 1.单分支
* 2.双分支:三元
* 3.多分支:switch
*/
上述运行结果:
4、PHP循环
<?php
namespace _0809;
//循环的本质还是分支
$colors = ['red', 'green', 'blue'];
$i = 0;
echo '数组长度', count($colors), '<hr>';
$list = '<ul style="border:1px solid orange">';
//php中.是连接字符串用的,“.=”就是将等号后面的字符串加至变量str的尾部,
//那是一个循环,就是不停的为str变量增加字符串,直到条件为假。
if ($i < count($colors)) {
$list .= "<li>{$colors[$i]}</li>";
}
// $i +=1;
$i++;
if ($i < count($colors)) {
$list .= "<li>{$colors[$i]}</li>";
}
$i++;
if ($i < count($colors)) {
$list .= "<li>{$colors[$i]}</li>";
}
$i++;
$list .= '</ul>';
/**
* 循环三要素
* 1.$i = 0 初始化
* 2.$i < count($colors),循环条件
* 3.$i++,更新循环条件.否则进入到死循环
*/
$list .= '<ul style="border:1px solid">';
//1.$i = 0 初始化
$i = 0;
//2.$i < count($colors),循环条件
//while是入口判断
while ($i < count($colors)) {
$list .= "<li>{$colors[$i]}</li>";
//3.$i++,更新循环条件.否则进入到死循环
$i++;
}
$list .= '</ul>';
$list .= '<ul style="border:1px solid red">';
//1.$i = 0 初始化
$i = 0;
//2.$i < count($colors),循环条件
//do while是出口判断
//出口判断条件为false,也会执行一遍
do {
$list .= "<li>{$colors[$i]}</li>";
//3.$i++,更新循环条件.否则进入到死循环
$i++;
} while ($i < count($colors));
$list .= '</ul>';
$list .= '<ul style="border:1px solid green">';
for ($i = 0; $i < count($colors); $i++) {
// if($i>1){
// break;
// }
//break直接结束循环
//continue跳过某次循环,提前进入下一次
if ($i === 1) {
continue;
}
$list .= "<li>{$colors[$i]}</li>";
}
$list .= '</ul>';
echo $list;
上述运行结果:
5、PHP数组遍历
<?php
//数组遍历
namespace _0809;
//1.索引数组:键名默认是从0开始递增的正整数(键名是数值类型)
//完整的声明语法
//$colors = ['0'=>'red','1'=>'green','2'=>'blue'];
//也可以用默认的键名,不写键名
$colors = ['red','green','blue'];
print_r($colors);
printf('<pre>%s</pre>',print_r($colors,true));
//2.关联数组:键名是字符串(语义化)
$user = ['10'=>5,'1'=>'朱老师','20'=>88];
//因为默认是数值,所以不写引号也可以
$user = [10=>5,1=>'朱老师',20=>88];
print_r($user);
//也可以把索引换成有意义的字符串
$user = ['id'=>5,'name'=>'朱老师','score'=>88];
printf('<pre>%s</pre>',print_r($user,true));
echo $user['name'];
/**
* $arr[$key]
* $key:数值->索引数组
* $key:字符串->关联数组
*/
echo '<hr>';
//数组的遍历:while for
//数组的专用遍历语法:foreach
//foreach($arr as $key=>$value){...}
foreach($colors as $value){
echo $value . '<hr>';
}
foreach($colors as $key=>$value){
printf('[%s]=>%s <br>',$key,$value);
}
echo '<hr>';
foreach($user as $key=>$value){
printf('[%s]=>%s <br>',$key,$value);
}
echo '<hr>';
//二维数组
//因为从数据表中的查询结果,php用二维数组来表示
$user = [
0=>['id'=>5,'name'=>'朱老师','gender'=>0,'score'=>88],
1=>['id'=>6,'name'=>'张老师','gender'=>1,'score'=>56],
2=>['id'=>7,'name'=>'刘老师','gender'=>0,'score'=>78],
];
printf('<pre>%s</pre>',print_r($user,true));
//foreach + table 渲染到页面中
$table = '<table border="1" width="400" cellspacing="0",cellpadding="3" align="center">';
$table .= '<caption>用户信息表</caption>';
$table .= '<thead bgcolor="#ccc"><tr><th>ID</th><th>用户名</th><th>性别</th><th>年龄</th>';
$table .= '<tbody align="center">';
//遍历
foreach($user as $user){
// print_r($user);
$table .= '<tr>';
$table .= "<td>{$user['id']}</td>";
$table .= "<td>{$user['name']}</td>";
$table .= '<td>' . ($user['gender']?'女':'男') . '</td>';
$table .= '<td>' . $user['score'].'</td>';
$table .= '</tr>';
}
$table .= '</tbody>';
$table .= '</table>';
//打印表格到页面中
echo $table;
上述运行结果:
6、用二维数组来模拟数据表查询结果
<?php
namespace _0809;
//用二维数组来模拟数据表查询结果
$stus = [
['id' => 1, 'name' => '刘备', 'course' => 'js', 'score' => 83],
['id' => 2, 'name' => '关羽', 'course' => 'php', 'score' => 75],
['id' => 3, 'name' => '张飞', 'course' => 'js', 'score' => 52],
['id' => 4, 'name' => '孙权', 'course' => 'php', 'score' => 88],
['id' => 5, 'name' => '周瑜', 'course' => 'js', 'score' => 65],
['id' => 6, 'name' => '孔明', 'course' => 'php', 'score' => 53],
['id' => 7, 'name' => '赵云', 'course' => 'js', 'score' => 63],
['id' => 8, 'name' => '马超', 'course' => 'php', 'score' => 77],
['id' => 9, 'name' => '姜维', 'course' => 'js', 'score' => 93],
['id' => 10, 'name' => '黄忠', 'course' => 'php', 'score' => 41],
];
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>学生信息管理系统</title>
<style>
table {
border-collapse: collapse;
width: 360px;
text-align: center;
}
table th,
table td {
border: 1px solid #000;
padding: 5px;
}
table caption {
font-size: 1.3em;
}
table thead {
background-color: lightcyan;
}
.active {
color: red;
}
</style>
</head>
<body>
<table>
<caption>学生成绩表</caption>
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>课程</th>
<th>成绩</th>
</tr>
</thead>
<tbody>
<?php
//遍历数据表的内容,并渲染到页面中
//{=>:
//}=>endforeach,endfor
foreach ($stus as $stu) : ?>
<tr>
<!-- <td>
<?= $stu['id'] ?>
</td>
<td>
<?= $stu['name'] ?>
</td>
<td>
<?= $stu['course'] ?>
</td>
<td>
<?php echo $stu['score'] ?>
</td> -->
<?php if ($stu['score'] >= 70) : ?>
<td>
<!-- 短标签 -->
<?= $stu['id'] ?>
</td>
<td>
<?= $stu['name'] ?>
</td>
<td>
<?= $stu['course'] ?>
</td>
<td>
<?php echo $stu['score'] ?>
</td>
<?php endif ?>
</tr>
<?php endforeach?>
<?php
/**
* 流程控制的替代语法/模板语法
* 1.foreach -> endforeach
* 2.for -> endfor
* 3.if -> endif
* 4.switch -> endswitch
*/
?>
</tbody>
</table>
</body>
</html>
上述运行结果: