文章目录
一、PHP基础
1、php 基本格式,注释,输出
- 注释有多行注释和单行注释,多注释使用
/**/
,单行使用//
或#
, 与 C++ 的一样 - 输出使用
echo '输出内容';
- 一般格式都是
<?php ?>
,但是最后的?>
可以不写,但每一行内容都需要使用分号;
做分隔符,否则代码会报错
<?php
# 这是一个单行注释
// 单行注释
/* 多行注释
* 多行注释
*/
echo 'Hello world!';
2、变量和常量
2.1 变量
-
变量的定义:使用 ‘$’ 进行定义,如 $a;
-
变量的赋值:在定义变量的时候可以直接进行赋值,如 $a = 1;
-
变量的删除:php 中变量不使用的时候是可以进行删除的,使用 unset(变量名) 函数进行删除,如 unset($a)
-
变量的命名规则:
a. 必须以 $ 符号作为开头
b. 变量名由字母,下划线,数字组成,但开头不能是数字
c. php 中允许使用中文变量,但不推荐使用:如 $姓名 = ‘张三’; -
预定义变量:也就是提前定义的变量,是由系统定义的,用来存储许多需要用到的数据,预定义变量都是数组
- 可变变量:一个变量保存的值刚好是另外一个变量的名字,那么可以直接使用这个变量访问另一个变量的值,只需要在变量名前再加上一个 $ 符号即可
- 变量传值:传值也就是给变量赋值,变量的传值有两种,一种是值传递,一种是引用传递
【举例】
<?php
// 定义变量:
$num1 = 3;
$num2 = 9;
$str = 'Hello';
echo $num1, '   ', $num2, '   ', $str;
echo '<hr/>';
// 可变变量:
$a = 1;
$b = "a";
echo $b, '   ', $$b;
echo '<hr/>';
// 预定义变量:
echo $_GET, '   ', $_ENV, '   ', $_SERVER;
2.2 常量
- 常量的命名规则:
- 常量的定义:常量的定义与变量相似,但常量必须传值,且常量的值是不能改变的
- 常用的系统常量:
- 常用的一些特殊常量:系统魔术常量,随着环境的改变而改变
【举例】
<?php
// 定义常量:
define("PI", 3.14);
define('-_-', 'smile');
const E = 2.71828;
echo PI, '   ', E, '   ';
echo constant('-_-');
echo '<hr/>';
// 常用的系统常量:
echo PHP_VERSION, '   ', PHP_INT_MAX, '   ', PHP_INT_SIZE;
echo '<hr/>';
// 魔术常量:
echo __DIR__, '<br/>', __FILE__, '<br/>', __LINE__;
3、数据类型
3.1 数据类型介绍
- 基本数据类型:
- 复合数据类型:
- 特殊数据类型:
3.2 类型判断、类型转换
- 类型判断:
- 类型转换:将数据类型转换为需要的类型,php 中有两种转换方式
- 在类型转换中,比较多的是转换为 bool 类型和数值类型:
4、 内容补充:
【举例】
<?php
// 定义变量:
$str1 = '1.3abc';
$str2 = '1.1.1abc';
$str3 = 'abc12';
$str4 = '_123';
$num = 11;
// 判断数据类型:
var_dump(is_int($num), is_string($num));
echo '<br/>';
var_dump($str3, $num); // var_dump() 返回的内容由变量数据类型和变量值组成,即返回 int(123)
echo '<hr/>';
// 类型转换:
// 自动转换:
$result1 = $str1 + $num; // 系统自动识别,转换为需要的数据类型
var_dump($result1);
echo '<br/>'; // 这里会将数据全部提取出来,所以得到的是浮点型
// 强制转换:
$result2 = (int)$str1 + $num; // 强制转换的内容,所以得到的内容是整形
var_dump($result2);
echo '<hr/>';
// 字符串的转化规则:
echo (int)$str3, '  ', (int)$str4, '<br/>'; // 开头是字母或字符,转化结果为 0
echo (float)$str2, '<hr/>'; // 将第二个小数点前的数值提取出来
// gettype(), settype() 函数:
echo gettype($str1), '  ', gettype($num);
echo '<br/>';
var_dump($num); // 先输出变量之前的数据类型
echo '   ';
settype($num, 'string'); // 直接改变了变量的数据类型
var_dump($num);
3.3 进制转换
1.十进制转二进制:decbin()
2.十进制转八进制:decoct()
3.十进制转十六进制:dechex()
- 将其它类型的进制转换为十进制的时候只需要将函数反过来即可,如二进制转十进制 bindec()
- 定义整形的时候:二进制前面用 0b 开头(如 ob110),八进制用 0 开头(如 0120),十六进制用 0x 开头(如 0x120)
4、 两个函数的使用介绍:
- empty() : 判断数据的值是否为“空”(空不是NULL), 如果为空返回 true, 否则返回 false
- isset() : 判断数据存储的变量本身是否存在,存在返回 true, 否则返回 false
【举例】
<?php
// 定义不同进制类型的整形:
$a = 12; // 十进制
$b = 0b1010; // 二进制
$c = 0120; // 八进制
$c = 0x110; // 十六进制
// 进制转换:
// 1、十进制转换为二进制
echo decbin(10), '<br/>';
// 2、十进制转换为八进制
echo decoct(10), '<br/>';
// 3、十进制转换为十六进制
echo dechex(10), '<br/>';
// 4、二进制转换为十进制
echo bindec($b), '<hr/>';
// empty(), isset() 函数的使用:
$t;
var_dump(empty($a), empty($t)); // $a 不为空,返回false, $t 为空,返回true
echo '<br/>';
var_dump(isset($t)); // 变量存在,返回true
unset($t);
var_dump(isset($t)); // 变量删除,返回false
3.4 运算符
1.算术运算符:+ - * /
2.比较运算符:> >= < <= == != === !==
- === : 表示全等于,包括数据大小和数据类型
- !== : 表示不全等于,只有大小或类型不同
3.逻辑运算符:&& || !, 分别表示 与 或 非
4.连接运算符:
- . : 符号是一个小数点,表示将两个字符串连接在一起
- .= : 复合运算,将符号左右两边内容连接起来,然后再赋值给左边的变量
5.错误抑制符:@
- 在一些提前可预知的错误前加上 @ 符号,可以避免代码直接报错
6.三目运算符:表达式1 ? 表达式2 : 表达式3
- 表达式1 为条件表达式,2 和 3 为赋值表达式
- 如 $max = $a > $b ?$a : $b;
7.自操作运算符:++ --, 有前置和后置两种
- 类似的还有:+= -= *= /= %=
- 注意:使用自操作运算符时,符号右边要看成一个整体
- 如 $a -= $b - 1, 等价于 $a = $a - ($b - 1)
【举例】
<?php
// 运算符:
// 算术运算符:
$a = 1;
$b = 3;
echo $a + $b, '<hr/>';
// 比较运算符:
var_dump(123 == '123'); // 数据值相等,返回true
var_dump(123 === '123'); // 数据值相等,但类型不同,返回false
echo '<hr/>';
// 连接运算符:
$c = 'abc';
$d = 123;
echo $c . $d, '<br/>';
echo $c .= $d, '<hr/>';
// 错误抑制符:
echo @(123 / 0), '<hr/>'; // 除数是 0, 但此时不会报错
// 三目运算符:
$max = 3 > 0 ? 10 : 1; // 判断条件成立,所以将表达式2赋值给变量max, 即 max = 10
echo $max, '<hr/>';
// 自操作运算符:
$e = 10;
echo $e++;
二、分支结构、循环结构
1、分支结构
1.1 if 分支
- 基本格式如下,需注意
elseif
是连在一起写的
<?php
// if 分支:
$day = 'Monday';
if ($day == 'Sunday') {
echo 'Today is Sunday';
} elseif ($day == 'Saturday') {
echo 'Today is Saturday';
} else {
echo 'Monday';
}
1.2 switch 分支
switch(表达式)
,表达式需要是一个具体的值或者能够获得一个具体的值,基本使用如下:
<?php
// switch 分支:
$a = 2;
switch ($a) {
case 1:
echo 1;
break;
case 2:
echo 2;
break;
default:
echo 'error';
break;
}
2、循环结构
2.1 for 循环
- 格式如下:
<?php
// for 循环
for($i = 1;$i <= 10;$i++){
echo $i, ' ';
}
2.2 while, do-while 循环
<?php
// while 循环:
$i = 0;
while ($i <= 10) {
echo $i++, ' ';
}
echo '<hr/>';
// do-while 循环:
do {
echo $i--, ' ';
} while ($i > 0);
2.3 循环控制
- 通过
break
和continue
进行循环控制,使用的方式与 C++ 一致,但在 PHP 中可以使用break 2
和continue 2
的方式进行多层次循环体的控制,即数字是多少就能控制多少层的循环体
三、文件包含、函数、错误类型简介
1、文件包含
- 文件包含的作用:实现代码的共享,相当于 C++ 中的导入头文件,Python 中导入包
- 文件包含的四种形式:使用的格式 include ‘文件名’;
- include 和 require 的区别:
2、函数
2.1 函数定义、参数
- 函数的定义使用 function 关键字定义,结构为:
function 函数名(参数){
//代码段
}
- 说明:
- 引用传递:
- 函数返回值:
- 作用域:全局变量,局部变量,超全局变量
- 静态变量:
- 可变函数:
【举例】
<?php
// 函数定义
function hello()
{
echo 'Hello world!', '<br/>';
}
hello();
// 引用传递参数
function sum(&$num1, $num2)
{
$num1 += $num2;
}
$a = 1;
$b = 2;
sum($a, $b); // 不使用引用传参的话,不会改变变量值
echo $a, '<br/>';
// return 返回函数值
function plus($num1, $num2)
{
return $num1 + $num2;
}
echo plus(2, 2), '<br/>';
// 获取全局变量
$str = "Hello";
echo $str, ' ';
function get_var()
{
global $str; // 获取全局变量后能够更改值,但一般不会这么做,而是通过使用变量进行操作
$str = 'World';
}
get_var();
echo $str, '<br/>';
// 静态变量
function sta()
{
static $index = 1;
echo $index++, ' '; // 可以用来统计函数被调用了多少次
}
sta();
sta();
sta();
echo '<br/>';
// 可变函数
function sys_func($user_func, $num) // 定义一个模拟的系统函数
{
return $user_func($num);
}
function user_func($num) // 定义一个用户自定义函数,用来返回一个数的平方
{
return $num * $num;
}
echo sys_func('user_func', 4); // 传入的第一个参数是用户自定义函数的名字
2.2 常用的系统函数
- 关于输出的函数补充:
- 时间函数:
- 关于数学的函数:
- 有关函数的函数:
【举例】
<?php
// 输出函数补充:
print 'Hello world<br/>'; // 输出的内容可以不添加括号
echo print(''); // 能够返回 1
echo '<br/>';
print_r('Hello world<hr/>'); // 与var_dump 一样,但不会输出数据类型
// 关于时间的函数:
echo date('Y 年 m 月 d 日 H:i:s'), '<br/>'; // 输出当前时间
echo date('Y 年 m 月 d 日 H:i:s', 2), '<br/>'; // 按照指定格式输出某一时间戳
echo time(), '   ', microtime();
echo '<hr/>';
// 有关数学的函数:
echo max(12, 11, 13, 45), '  ', min(12, 11, 13, 45), '<br/>'; // 获取最大值和最小值
echo rand(1, 10), '  ', mt_rand(1, 10), '<br/>'; // 获取一个随机数
echo sqrt(2), '<hr/>'; // 开根号
// 有关函数的函数:
function display($a, $b)
{
echo func_get_arg(0), '<br/>';
echo func_get_args(), '<br/>';
echo func_num_args();
}
display(1, 2, 3, 4);
3、错误类型简介
3.1 错误类型分类
1.语法错误(Parse error) :
- 用户书写的代码不符合 PHP 语法规范,代码在编译的过程中不通过,代码不会执行
2.运行错误(runtime error) :
- 代码编译通过,但在执行的过程中出现一些条件不满足导致的错误
3.逻辑错误 :
- 写代码的时候不够规范,出现一些逻辑性错误,导致代码正常执行,但不能得到想要的结果
3.2 错误提示
- 所有看到的错误代码在 PHP 中都被定义成系统常量,可以直接使用
1.系统错误:
E_PARSE : 编译错误,代码不会执行
E_ERROR : fatal error, 致命错误,会导致代码不能正常执行,在出错的位置断掉
E_WARNING : warning, 警告错误,不会影响代码执行,但可能得到预想不到的结果
E_NOTICE : notice, 通知错误,不会影响代码执行
2.用户错误: E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用到的错误代号,系统不会用到
3.其它错误: E_ALL
代表所有错误,通常在进行错误控制的时候使用比较多,一般在开发过程中使用
四、字符串、数组
1、字符串
1.1 字符串的定义
1、使用单引号或双引号定义,用引号适合定义一些比较短的或者没有结构要求的字符串
2、使用 nowdoc /heredoc 定义字符串:适合定义长的,有结构要求的字符串
- nowdoc : 定义没有单引号的单引号字符串
- heredoc : 定义没有双引号的双引号字符串
3、结构化定义字符串的规则:
a. 上边界符后面不能有任何内容,包括空格
b. 下边界符必须顶格写,且后面只能跟分号,不能有别的内容
c. 上下边界符名字需要相同,且下边界符不能有引号
d. 结构化定义字符串内部(即边界符之间的内容)的所有内容都是字符串本身
nowdoc /heredoc
定义字符串的结构
// nowdoc
$str1 = <<<'边界符'
// 字符串内容
'边界符';
// heredoc
$str2 = <<<边界符
// 字符串内容
边界符;
【举例】
<?php
// nowdoc
$str1 = <<<'info'
My name is kele,
how are you?
info;
// heredoc
$str2 = <<<info
My name is kele,
how are you?
info;
var_dump($str1);
echo '<br/>';
var_dump($str2);
1.2 字符串转义和长度统计
- 字符串的转义
1、常用的转义字符:
\' : 在单引号字符串中显示单引号
\" : 在双引号字符串中显示双引号
\r : 代表回车,回到当前行的首位置
\n : 换行,在浏览器中不会识别 \n, 要看到换行的效果需要查看网页源码
\t : 相当于 tab 键
\$ : 可以用来输出变量
2、 单引号定义的字符串内容中只能够识别 \'
双引号定义的字符串内容中不能识别 \', 但其它转义字符都能识别
双引号内容能识别 $ 符号,所以在双引号定义的字符串中能够解析变量内容,但单引号不能
3、 双引号中变量识别规则:
变量本身和变量后面的内容要能够区分,保证变量的独立性,否则代码会报错,可以使用空格分开,如 $a = "ab $a cd";
可以使用变量专业标识符区分,即给变量加上一组大括号,如 $a = "ab {$a} cd";
- 字符串的长度统计
1、使用基本函数 strlen(), 能够得到字符串的长度,以字节为单位
2、多字节字符串长度:
包含中文长度,需要应用到 mbstring 扩展(mb: Multi Bytes)
a. 加载 mbstring 扩展:
- 找到 php.ini 配置文件,然后搜索 mbstring
- 找到 extension=php_mbstring.dll 配置文件
- 将文件名前面的分号删除然后保存文件
- 补充:没有分号表示此扩展文件是打开的,分号表示关闭
b. 加载扩展文件后需要重新启动 Apache, 然后就能使用 mb 扩展带来的函数
c. 使用 mb_strlen(字符串, 字符集) 函数统计字符串长度,还能给定字符集类型进行统计,如 mb_string($a, 'gbk')
2、数组
2.1 数组的定义和遍历
- 数组定义
1、 使用 array 关键字定义:变量 = array(元素1, 元素2...);
如 $a = array(1, 2, 3);
2、 使用中括号包裹数据:变量 = [元素1, 元素2...];
如 $a = [1, 2, 3, 4];
3、 隐形定义数组:给变量添加一个中括号,系统将变量自动转化为数组
如 $a[] = 1; $a[2] = 2; 下标可以不添加,系统默认从0开始,也可以手动添加,下标可以是数字和字符串等
4、 PHP 数组的特点:
a. 下标可以是整数下标和字符串下标。整数下标用来索引数组,字符串下标用来关联数组
b. 不同类型的下标可以混合使用(混合数组)
c. 数组元素的顺序以放入顺序为准,和下标无关
d. 数字下标的自增长特性:从0开始增长,但如果手动添加更大的下标,则后面的下标从最大值 +1 开始计算
如:$a = array(1, 2); $a[10] = 10;
==> 前两个对应的下标为 0, 1, 第三个开始的下标从 10 开始计数
e. 特殊值下标自动转换: true 转为 1, false 转为 0, NULL 转为 "" (空字符)
f. php 中数组没有长度和数据类型的限制,存储的内存在堆区
- 多维数组的定义(二维数组)
<?php
// 同时定义值和对应的下标,使用 => 符号进行定义,多维数组嵌套和python中列表使用类似
$info = array(
array('name' => 'Mary', 'age' => 18),
array('name' => 'Jack', 'age' => 20)
);
- 数组遍历(foreach 遍历)
1、 基本格式为:
foreach(数组变量 as 下标 => 值){
// 通过下标访问元素的值即可
}
2、 使用 foreach 遍历的过程中,下标和值都是自己定义的变量,其中下标变量可以不用定义,可以直接定义变量值进行访问即可
foreach(数组变量 as 值){
// 直接输出值的内容
}
3、 两种访问方式根据需要进行选择即可,一般多维数组使用第一种方式获得每组值对应的下标,然后通过下标继续访问即可
【举例】
<?php
// 数组
// 1、定义数组
$a = array(1, 2, 3, 'hello');
$b = [1, 2, 3, 4];
$c[] = 'hello';
$c[10] = 'Mary'; // 添加值
$c[] = 12;
echo '<pre/>'; // 作用是与格式化文本,让输出内容看起来比较清晰
print_r($a);
print_r($b);
print_r($c);
echo '<hr/>';
// 2、定义多维数组
$info = array(
array('name' => 'Mary', 'age' => 18),
array('name' => 'Jack', 'age' => 20),
array('name' => 'Lucy', 'age' => 19)
);
print_r($info);
echo '<hr/>';
// 3、 数组循环遍历
foreach ($info as $value) { // 一次循环获得一维数组值
foreach ($value as $k => $v) { // 二次循环获得二维数组值
echo $k, ' : ', $v, '   '; // 循环一次获得一个下标对应的内容
}
echo '<br/>';
}
echo '<br/>';
foreach ($info as $value) {
echo 'name : ', $value['name'], '   ', 'age : ', $value['age'], '<br/>';
}
echo '<br/>';
2.2 数组相关函数
1、 排序函数:按照 ASCII 码进行比较排序
sort() : 顺序排序,原来的下标不会改变,只针对值进行排序
rsort() : 逆序排序
asort() : 顺序排序,针对值进行排序,但每个值对应的下标也会随着一起改变
arsort() : 逆序排序
ksort() : 顺序排序,针对下标的大小进行排序,每个下标对应的值也会一同改变
krsort() : 逆序排序
shuffle() : 随机打乱数组元素
2、 指针函数:也就是针对下标进行的操作
reset() : 重置指针,将数组指针回到首位
end() : 重置指针,将数组指针指到最后一元素
next() : 指针下移,取得下一个指针元素的值
prev() : 指针上移,取得上一个元素的值
current() : 获取当前指针对应的元素值
key() : 获取当前指针对应得到下标值
【注意】next() /prev() 会移动指针,可能导致指针移动到最前或最后(此时离开数组),导致数组不能使用
通过 next /prev 不能回到正确的指针位置,只能通过 reset() /end() 进行指针重置
【举例】
<?php
// 数组排序
echo '<pre/>'; // 格式化输出文本
$a = [6, 8, 14, 3, 2, 39, 87, 23];
print_r($a);
// sort() 排序
sort($a);
print_r($a);
// asort() 排序
asort($a);
print_r($a);
// ksort() 排序
$b = array(1 => 1, 5 => 4, 2 => 2, 3 => 12);
print_r($b);
ksort($b);
print_r($b);
// 指针函数
$c = [17, 4, 20, 9, 18, 3];
echo 'value', ' ', 'key', '<br/>';
echo current($c), ' ', key($c), '<br/>';
echo next($c), ' ', key($c), '<br/>';
echo end($c), ' ', key($c), '<br/>';
echo prev($c), ' ', key($c), '<br/>';
echo reset($c), ' ', key($c), '<br/>';
2.3 简单的算法排序
- 冒泡排序、选择排序、插入排序、快速排序
<?php
// 冒泡排序
function bubble_sort(&$array)
{
for ($i = 0, $len = count($array) - 1; $i < $len; $i++) {
for ($j = 0; $j < $len - $i; $j++) {
if ($array[$j] > $array[$j + 1]) {
$t = $array[$j];
$array[$j] = $array[$j + 1];
$array[$j + 1] = $t;
}
}
}
}
// 选择排序
function select_sort(&$array)
{
for ($i = 0, $len = count($array); $i < $len; $i++) {
$min = $i; // 记录最小下标
for ($j = $i + 1; $j < $len; $j++) {
if ($array[$min] > $array[$j]) {
$min = $j;
}
}
// 交换下标对应的值
if ($min != $i) {
$t = $array[$i];
$array[$i] = $array[$min];
$array[$min] = $t;
}
}
}
// 插入排序
function insert_sort(&$array)
{
$len = count($array) - 1;
for ($i = 1; $i < $len; $i++) {
$t = $array[$i];
$flag = false;
for ($j = $i - 1; $j >= 0; $j--) {
if ($array[$j] > $t) {
$array[$j + 1] = $array[$j]; // 将大的数据和小的交换位置
$flag = true; // 标志存在顺序不对的下标
} else {
break;
}
}
// 将数值比较小的数据插入到对应的位置
if ($flag) {
$array[$j + 1] = $t;
}
}
}
// 快速排序:使用的是递归思想
function quick_sort($array)
{
$len = count($array);
if ($len <= 1) // 只有一个元素,直接返回
return $array;
$min = $max = array(); // 定义两个数组,用来储存比较大的元素和小的元素
for ($i = 1; $i < $len; $i++) {
// 一般以第一个元素最为参照,大于第一个元素的值放入 max 数组中,小于的放入 min 数组中
if ($array[$i] < $array[0]) {
$min[] = $array[$i];
} else {
$max[] = $array[$i];
}
}
// 使用递归不断分配排序元素
$min = quick_sort($min);
$max = quick_sort($max);
// 合并数组,array_merge() 的作用是合并数组元素,传入函数的参数只能是数组
return array_merge($min, (array)$array[0], $max);
}
$a = [4, 7, 2, 9, 1, 0, 3, 23, 11];
echo '<pre/>';
print_r($a);
echo '<hr/>';
// bubble_sort($a);
// select_sort($a);
// insert_sort($a);
// print_r($a);
// $k = quick_sort($a);
// print_r($k);