0
点赞
收藏
分享

微信扫一扫

[PHP学习] 从零开始 一篇文章快速认识PHP的基本使用

敬亭阁主 2022-03-21 阅读 108

文章目录

一、PHP基础

1、php 基本格式,注释,输出

  • 注释有多行注释和单行注释,多注释使用 /**/ ,单行使用 //# , 与 C++ 的一样
  • 输出使用 echo '输出内容';
  • 一般格式都是 <?php ?> ,但是最后的 ?> 可以不写,但每一行内容都需要使用分号 ; 做分隔符,否则代码会报错
<?php

# 这是一个单行注释
// 单行注释

/* 多行注释
 * 多行注释
 */

echo 'Hello world!';

2、变量和常量

2.1 变量

  1. 变量的定义:使用 ‘$’ 进行定义,如 $a;

  2. 变量的赋值:在定义变量的时候可以直接进行赋值,如 $a = 1;

  3. 变量的删除:php 中变量不使用的时候是可以进行删除的,使用 unset(变量名) 函数进行删除,如 unset($a)

  4. 变量的命名规则:
    a. 必须以 $ 符号作为开头
    b. 变量名由字母,下划线,数字组成,但开头不能是数字
    c. php 中允许使用中文变量,但不推荐使用:如 $姓名 = ‘张三’;

  5. 预定义变量:也就是提前定义的变量,是由系统定义的,用来存储许多需要用到的数据,预定义变量都是数组

  1. 可变变量:一个变量保存的值刚好是另外一个变量的名字,那么可以直接使用这个变量访问另一个变量的值,只需要在变量名前再加上一个 $ 符号即可
  1. 变量传值:传值也就是给变量赋值,变量的传值有两种,一种是值传递,一种是引用传递

【举例】

<?php

// 定义变量:
$num1 = 3;
$num2 = 9;
$str = 'Hello';

echo $num1, '&nbsp&nbsp&nbsp', $num2, '&nbsp&nbsp&nbsp', $str;
echo '<hr/>';


// 可变变量:
$a = 1;
$b = "a";

echo $b, '&nbsp&nbsp&nbsp', $$b;
echo '<hr/>';


// 预定义变量:
echo $_GET, '&nbsp&nbsp&nbsp', $_ENV, '&nbsp&nbsp&nbsp', $_SERVER;

2.2 常量

  1. 常量的命名规则:
  1. 常量的定义:常量的定义与变量相似,但常量必须传值,且常量的值是不能改变的
  1. 常用的系统常量:
  1. 常用的一些特殊常量:系统魔术常量,随着环境的改变而改变

【举例】

<?php

// 定义常量:
define("PI", 3.14);
define('-_-', 'smile');
const E = 2.71828;

echo PI, '&nbsp&nbsp&nbsp', E, '&nbsp&nbsp&nbsp';
echo constant('-_-');
echo '<hr/>';


// 常用的系统常量:
echo PHP_VERSION, '&nbsp&nbsp&nbsp', PHP_INT_MAX, '&nbsp&nbsp&nbsp', PHP_INT_SIZE;
echo '<hr/>';


// 魔术常量:
echo __DIR__, '<br/>', __FILE__, '<br/>', __LINE__;

3、数据类型

3.1 数据类型介绍

  1. 基本数据类型:
  1. 复合数据类型:
  1. 特殊数据类型:

3.2 类型判断、类型转换

  1. 类型判断:
  1. 类型转换:将数据类型转换为需要的类型,php 中有两种转换方式
  1. 在类型转换中,比较多的是转换为 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, '&nbsp&nbsp', (int)$str4, '<br/>';     // 开头是字母或字符,转化结果为 0
echo (float)$str2, '<hr/>';      // 将第二个小数点前的数值提取出来


// gettype(), settype() 函数:
echo gettype($str1), '&nbsp&nbsp', gettype($num);
echo '<br/>';

var_dump($num); // 先输出变量之前的数据类型
echo ' &nbsp ';
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 循环控制

  • 通过 breakcontinue 进行循环控制,使用的方式与 C++ 一致,但在 PHP 中可以使用 break 2continue 2 的方式进行多层次循环体的控制,即数字是多少就能控制多少层的循环体

三、文件包含、函数、错误类型简介

1、文件包含

  1. 文件包含的作用:实现代码的共享,相当于 C++ 中的导入头文件,Python 中导入包
  2. 文件包含的四种形式:使用的格式 include ‘文件名’;
  1. include 和 require 的区别:

2、函数

2.1 函数定义、参数

  1. 函数的定义使用 function 关键字定义,结构为:
function 函数名(参数){
    //代码段
}
  1. 说明:
  1. 引用传递:
  1. 函数返回值:
  1. 作用域:全局变量,局部变量,超全局变量
  1. 静态变量:
  1. 可变函数:

【举例】

<?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, '&nbsp';

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 常用的系统函数

  1. 关于输出的函数补充:
  1. 时间函数:
  1. 关于数学的函数:
  1. 有关函数的函数:

【举例】

<?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(), ' &nbsp&nbsp', microtime();
echo '<hr/>';


// 有关数学的函数:
echo max(12, 11, 13, 45), ' &nbsp', min(12, 11, 13, 45), '<br/>'; // 获取最大值和最小值
echo rand(1, 10), ' &nbsp', 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, ' &nbsp ';      // 循环一次获得一个下标对应的内容
    }
    echo '<br/>';
}
echo '<br/>';

foreach ($info as $value) {
    echo 'name : ', $value['name'], ' &nbsp ', '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);
举报

相关推荐

0 条评论