PHP 基础
PHP 简介
- PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言
- PHP 脚本在服务器上执行
- PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
- PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
- PHP 文件的默认文件扩展名是 “.php”
- PHP 可在不同的平台上运行(Windows、Linux、Unix、Mac OS X 等)
- PHP 与目前几乎所有的正在被使用的服务器相兼容(Apache、IIS、Nginx等)
- PHP 提供了广泛的数据库支持
- PHP 是免费的,可从官方的 www.php.net 下载
- PHP 易于学习,并可高效地运行在服务器端
PHP 安装、环境搭建
PHP 集成环境搭建工具推荐
LNMP 搭建
参考:https://www.php.cn/php-weizijiaocheng-411843.html
PHP 语法
PHP是一款功能强大的嵌入式HTML脚本语言,经常被程序员用来作为网站开发的基础语言。php语法基础知识点包括PHP脚本代码标记、PHP指令分隔符、PHP的注释和PHP的输出。
基本语法
PHP 脚本可以放在文档中的任何位置。
PHP 脚本以 <?php
开始,以 ?>
结束:
<?php
// PHP 代码
?>
PHP 文件的默认文件扩展名是 .php
。PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码。
- Hello World
<?php
echo 'Hello World!';
?>
PHP 中的每个代码行都必须以分号结束。
- 注释
<?php
//单行注释
/*多行注释*/
?>
变量
- 在PHP中变量是用于储存信息的容器,类似于数学中的集合。
- 赋值方法与数学中的代数相类似。
<?php
//变量
$x = 5;
$y = 6;
$z = $x + $y;
echo $z;
?>
- PHP 变量规则
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
PHP 语句和 PHP 变量都是区分大小写的。
- PHP 变量作用域
PHP 有四种不同的变量作用域:- local
- global
- static
- parameter
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global
关键字。在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问。global
关键字用于函数内访问全局变量。
static
作用域:当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。每次调用该函数时,该变量将会保留着函数前一次被调用时的值。仍然是函数的局部变量。
PHP 数据类型
数据类型包括String
(字符串), Integer
(整型), Float
(浮点型), Boolean
(布尔型), Array
(数组), Object
(对象), NULL
(空值)。
PHP 字符串
文本放在单引号和双引号中
<?php
$str_1 = '字符串';
$str_2 = "字符串";
?>
PHP 整型
整数是一个没有小数的数字。
- 规则:
- 必须至少有一个数字 (0-9)
- 不能包含逗号或空格
- 是没有小数点的
- 可以是正数或负数
- 可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。
<?php
$x = 24;
var_dump($x);
echo "<br>";
$x = -42; // 负数
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);
?>
PHP 浮点型
浮点数是带小数部分的数字,或是指数形式。var_dump()
函数返回变量的数据类型和值。
<?php
$x = 1.365;
var_dump($x);
echo "<br>";
$x = 2.4e3;
var_dump($x);
echo "<br>";
$x = 8E-5;
var_dump($x);
?>
PHP 布尔型
布尔型可以是 TRUE
或 FALSE
PHP 数组
数组可以在一个变量中存储多个值。
<?php
$arr = array('a','b','c');
var_dump($arr);
?>
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
PHP 对象
对象数据类型也可以用于存储数据。在 PHP 中,对象必须声明。首先,你必须使用class
关键字声明类对象。类是可以包含属性和方法的结构。
<?php
//对象
class Car
{
//属性
var $size;
//方法
function Car($size = 10)
{
$this->size = $size;
}
}
function echo_car($obj)
{
foreach (get_object_vars($obj) as $prop => $val) {
echo "$prop is $val";
}
}
//实例化
$car_1 = new Car(25);
echo_car($car_1);
?>
PHP NULL 值
NULL
值表示变量没有值。NULL
是数据类型为 NULL
的值。NULL
值指明一个变量是否为空值。 同样可用于数据空值和 NULL
值的区别。
PHP 常量
PHP 常量是一个简单值的标识符。该值在脚本中不能改变。一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $
修饰符)。常量是全局的。
设置 PHP 常量
设置常量,使用 define()
函数
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
- 参数
name
:必选参数,常量名称,即标志符。value
:必选参数,常量的值。case_insensitive
:可选参数,如果设置为TRUE
,该常量则大小写不敏感。默认是大小写敏感的。
<?php
// 区分大小写的常量名
define("Name", "php");
echo Name; // 输出 "php"
echo '<br>';
echo name; // 输出 "name"
// 不区分大小写的常量名
define("Name", "php", true);
echo name; // 输出 "php"
?>
PHP 字符串
PHP 字符串变量用于存储并处理文本, 在创建字符串之后,我们就可以对它进行操作。我们可以直接在函数中使用字符串,或者把它存储在变量中。
字符串变量
<?php
$txt="Hello world!";
echo $txt;
?>
并置运算符
PHP 中,只有一个字符串运算符。并置运算符 .
用于把两个字符串值连接起来。
<?php
$txt1="Hello";
$txt2="World";
cho $txt1 . " " . $txt2;
?>
strlen() 函数
strlen()
函数返回字符串的长度(字符数)。
<?php
echo strlen("Hello world!");
?>
strpos() 函数
strpos()
函数用于在字符串内查找一个字符或一段指定的文本。如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE
。
<?php
echo strpos("Hello world!","world");
?>
PHP 运算符
PHP 运算符包括算数运算符、赋值运算符、递增\递减运算符、比较运算符、逻辑运算符、数组运算符、三元运算符、组合比较符。
算术运算符
运算符 | 名称 | 描述 | 实例 | 结果 |
---|---|---|---|---|
x + y | 加 | x 和 y 的和 | 2 + 2 | 4 |
x - y | 减 | x 和 y 的差 | 5 - 2 | 3 |
x * y | 乘 | x 和 y 的积 | 5 * 2 | 10 |
x / y | 除 | x 和 y 的商 | 15 / 5 | 3 |
x % y | 模(除法的余数) | x 除以 y 的余数 | 5 % 2、10 % 8、10 % 2 | 1、2、0 |
- x | 取反 | x 取反 | - 2 | -2 |
a . b | 并置 | 连接两个字符串 | “Hi” . “Ha” | HiHa |
PHP7+ 版本新增整除运算符 intdiv()
赋值运算符
运算符 | 等同于 | 描述 |
---|---|---|
x = y | x = y | 左操作数被设置为右侧表达式的值 |
x += y | x = x + y | 加 |
x -= y | x = x - y | 减 |
x *= y | x = x * y | 乘 |
x /= y | x = x / y | 除 |
x %= y | x = x % y | 模(除法的余数) |
a .= b | a = a . b | 连接两个字符串 |
递增/递减运算符
运算符 | 名称 | 描述 |
---|---|---|
++ x | 预递增 | x 加 1,然后返回 x |
x ++ | 后递增 | 返回 x,然后 x 加 1 |
– x | 预递减 | x 减 1,然后返回 x |
x – | 后递减 | 返回 x,然后 x 减 1 |
比较运算符
运算符 | 名称 | 描述 | 实例 |
---|---|---|---|
x == y | 等于 | 如果 x 等于 y,则返回 true | 5==8 返回 false |
x === y | 恒等于 | 如果 x 等于 y,且它们类型相同,则返回 true | 5===“5” 返回 false |
x != y | 不等于 | 如果 x 不等于 y,则返回 true | 5!=8 返回 true |
x <> y | 不等于 | 如果 x 不等于 y,则返回 true | 5<>8 返回 true |
x !== y | 不恒等于 | 如果 x 不等于 y,或它们类型不相同,则返回 true | 5!==“5” 返回 true |
x > y | 大于 | 如果 x 大于 y,则返回 true | 5>8 返回 false |
x < y | 小于 | 如果 x 小于 y,则返回 true | 5<8 返回 true |
x >= y | 大于等于 | 如果 x 大于或者等于 y,则返回 true | 5>=8 返回 false |
x <= y | 小于等于 | 如果 x 小于或者等于 y,则返回 true | 5<=8 返回 true |
逻辑运算符
运算符 | 名称 | 描述 | 实例 |
---|---|---|---|
x and y | 与 | 如果 x 和 y 都为 true,则返回 true | x=6、y=3 (x < 10 and y > 1) 返回 true |
x or y | 或 | 如果 x 和 y 至少有一个为 true,则返回 true | x=6、y=3(x6 or y5) 返回 true |
x xor y | 异或 | 如果 x 和 y 有且仅有一个为 true,则返回 true | x=6、y=3(x6 xor y3) 返回 false |
x && y | 与 | 如果 x 和 y 都为 true,则返回 true | x=6y=3(x < 10 && y > 1) 返回 true |
x || y | 或 | 如果 x 和 y 至少有一个为 true,则返回 true | x=6、y=3(x5 || y5) 返回 false |
! x | 非 | 如果 x 不为 true,则返回 true | x=6、y=3 !(x==y) 返回 true |
数组运算符
运算符 | 名称 | 描述 |
---|---|---|
x + y | 集合 | x 和 y 的集合 |
x == y | 相等 | 如果 x 和 y 具有相同的键/值对,则返回 true |
x === y | 恒等 | 如果 x 和 y 具有相同的键/值对,且顺序相同类型相同,则返回 true |
x != y | 不相等 | 如果 x 不等于 y,则返回 true |
x <> y | 不相等 | 如果 x 不等于 y,则返回 true |
x !== y | 不恒等 | 如果 x 不等于 y,则返回 true |
三元运算符
<?php
$num = 64;
$result = $num >= 60 ? '及格' : '不及格';
echo $result;
?>
组合比较符(PHP7+)
<?php
// 整型
echo 2 <=> 2; // 0
echo 2 <=> 3; // -1
echo 3 <=> 1; // 1
// 浮点型
echo 1.4 <=> 1.4; // 0
echo 1.4 <=> 2.4; // -1
echo 2.4 <=> 1.4; // 1
// 字符串
echo "cc" <=> "cc"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
条件语句
If…Else
If...Else
语句 ,条件语句用于根据不同条件执行不同动作。
- 条件语句:
if
条件语句 - 在条件成立时执行代码if...else
语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码if...else if....else
语句 - 在若干条件之一成立时执行一个代码块switch
语句 - 在若干条件之一成立时执行一个代码块
<?php
$score = 90;
if ($score >= 60) {
echo "及格";
} else {
echo "不及格";
}
if ($score >= 60 && $score < 70) {
echo "C";
} elseif ($score >= 70 && $score < 90) {
echo "B";
} elseif ($score >= 90) {
echo "A";
} else {
echo "D";
}
$color = "blue";
switch ($color) {
case "red":
echo "红色";
break;
case "yellow":
echo "黄色";
break;
case "blue":
echo "蓝色";
break;
default:
echo "非三色";
}
?>
PHP 数组
数组是一个能在单个变量中存储多个值的特殊变量。其特点就是将values
映射到keys
的类型。与其他语言不同的是,PHP中数组的key
可以是字符串,而values
可以是任意类型。
创建数组
array()
函数用于创建数组。
三种类型的数组:
- 数值数组 - 带有数字 ID 键的数组
- 关联数组 - 带有指定的键的数组,每个键关联一个值
- 多维数组 - 包含一个或多个数组的数组
数值数组
<?php
$str = array("A", "B", "C");
echo "字母: " . $str[0] . "," . $str[1] . "," . $str[2] . ".";
?>
获取数组的长度
count()
函数用于返回数组的长度(元素的数量):
<?php
$str = array("A", "B", "C");
echo "字母: " . $str[0] . "," . $str[1] . "," . $str[2] . ".";
echo count($str);
?>
遍历数值数组
<?php
$str = array("A", "B", "C");
$len = count($str);
for ($i = 0; $i < $len; $i++) {
echo $str[$i];
echo "<br>";
}
?>
关联数组
关联数组是使用您分配给数组的指定的键的数组。
<?php
$age = array("lulu" => "13", "nana" => "12", "momo" => "11");
echo 'lulu is ' . $age['lulu'] . ' years old';
?>
遍历关联数组
<?php
$age = array("lulu" => "13", "nana" => "12", "momo" => "11");
echo 'lulu is ' . $age['lulu'] . ' years old';
foreach ($age as $x => $x_value) {
echo "key=" . $x . ",value=" . $x_value;
echo "<br>";
}
?>
数组排序
PHP数组中的元素可以按字母或数字顺序进行降序或升序排列。PHP数组排序函数方法有:sort()
、rsort()
、asort()
、ksort()
、arsort()
、krsort()
。
数组排序函数
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
<?php
$str = array("D", "B", "C","A");
sort($str);
$len = count($str);
for ($i = 0; $i < $len; $i++) {
echo $str[$i];
echo "<br>";
}
?>
循环
PHP 中的循环语句:
while
- 只要指定的条件成立,则循环执行代码块do...while
- 首先执行一次代码块,然后在指定的条件成立时重复这个循环for
- 循环执行代码块指定的次数foreach
- 根据数组中每个元素来循环代码块
while 循环
while
循环表示只要指定的条件成立,则循环执行代码块 。while
循环将重复执行代码块,直到指定的条件不成立。
<?php
$i = 0;
// 只要 i 小于或者等于 10,while 循环将继续运行。循环每运行一次,i 就会递增 1
while ($i <= 10) {
echo "Number: " . $i;
$i++;
}
?>
do…while 语句
do...while
语句会至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环。
<?php
$i = 0;
do {
echo "number:" . $i . " ";
$i++;
} while ($i <= 10);
?>
For 循环
For
循环,循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。 for
循环用于预先知道脚本需要运行的次数
的情况。 语法 for (初始值; 条件; 增量) { 要执行的代码; }
。
<?php
for ($i = 1; $i <= 9; $i++) {
echo $i;
}
?>
foreach 循环
foreach
循环用于遍历数组。每进行一次循环,当前数组元素的值就会被赋值给 $value
变量(数组指针会逐一地移动),在进行下一次循环时,将看到数组中的下一个值。
<?php
$x = array("1", "2", "3");
foreach ($x as $value) {
echo $value . "<br>";
}
?>
PHP 函数
内建函数
创建 PHP 函数
函数是通过调用函数来执行的。
<?php
function writeName(){
echo "Tom";
}
echo "My name is ";
writeName();
?>
函数 添加参数
<?php
function writeName($fname){
echo $fname . " Refsnes.<br>";
}
echo "My name is ";
writeName("Tony");
echo "My sister's name is ";
writeName("Tom");
echo "My brother's name is ";
writeName("Komi");
?>
返回值
如需让函数返回一个值,请使用 return
语句。
<?php
function sum($x, $y){
$sum = $x + $y;
return $sum;
}
echo "123 + 233 = " . sum(123, 233);
?>
PHP魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。PHP有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
- LINE
文件中的当前行号。 - FILE
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。 - DIR
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。 - FUNCTION
函数名称 - CLASS
类的名称 - TRAIT
PHP 实现了代码复用的一个方法,称为 traits - METHOD
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写) - NAMESPACE
当前命名空间的名称(区分大小写)。
命名空间
PHP 命名空间(namespace) 是在PHP 5.3中加入的,从广义上来说,命名空间是一种封装事物的方法。命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。
作用
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。
定义命名空间
默认情况下,所有常量、类和函数名都放在全局空间下。可以在同一个文件中定义不同的命名空间代码。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
<?php
// 定义代码在 'Demo' 命名空间中
namespace Demo;
namespace Demo1;
// ... 代码 ...
子命名空间
与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
<?php
namespace Demo\Man\Level; //声明分层次的单个命名空间
const CONNECT_STATUS = 1;
class Man { /* ... */ }
function attack() { /* ... */ }
?>
命名空间使用
通过三种方式引用:
-
非限定名称,或不包含前缀的类名称,例如
$a=new foo();
或foo::staticmethod();
。如果当前命名空间是demospace
,foo
将被解析为demospace\foo
。如果使用foo
的代码是全局的,不包含在任何命名空间中的代码,则foo
会被解析为foo
。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。 -
限定名称,或包含前缀的名称,例如
$a = new demospace\foo();
或demospace\foo::staticmethod();
。如果当前的命名空间是demospace
,则foo
会被解析为demospace\subnamespace\foo
。如果使用foo
的代码是全局的,不包含在任何命名空间中的代码,foo
会被解析为subnamespace\foo
。 -
完全限定名称,或包含了全局前缀操作符的名称,例如,
$a = new \demospace\foo();
或\demospace\foo::staticmethod();
。在这种情况下,foo
总是被解析为代码中的文字名(literal name)demospace\foo
。
namespace
关键字和__NAMESPACE__
常量
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__
魔术常量和 namespace
关键字。
常量__NAMESPACE__
的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。常量 __NAMESPACE__
在动态创建名称时很有用。
使用命名空间:别名/导入
PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量。
1、使用use操作符导入/使用别名
use My\Attacks\Classname as Attack;
2、一行中包含多个use语句
use My\Attacks\Classname as Attack, My\Full\Names;
PHP 面向对象
在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。 在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。 对象的主要三个特性: 对象的行为、对象的形态、 对象的表示。
对象的主要三个特性:
- 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
- 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
- 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
面向对象内容
-
类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
-
对象 − 是类的实例。
-
成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
-
成员函数 − 定义在类的内部,可用于访问对象的数据。
-
继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
-
父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
-
子类 − 一个类继承其他类称为子类,也可称为派生类。
-
多态 − 多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
-
重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
-
抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
-
封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
-
构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
-
析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
类定义
- 类使用
class
关键字后加上类名定义。 - 类名后的一对大括号(
{}
)内可以定义变量和方法。 - 类的变量使用
var
来声明, 变量也可以初始化值。 - 函数定义类似
PHP
函数的定义,但函数只能通过该类及其实例化的对象访问。
实例:
<?php
class Car
{
// 成员变量
var $name;
var $size;
// 成员函数
/* 成员函数 */
function setName($par)
{
$this->name = $par;//变量 $this 代表自身的对象。
}
function getName()
{
echo $this->name . PHP_EOL;
}
function setSize($par)
{
$this->size = $par;
}
function getSize()
{
echo $this->size . PHP_EOL;
}
}
// 创建对象
$byd = new Car;
//调用成员方法
$byd->setName('比亚迪');
$byd->setSize('BIG');
$byd->getName();
$byd->getSize();
PHP 构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
void __construct ([ mixed $args [, $... ]] )
<?php
class Car
{
// 成员变量
var $name;
var $size;
// 构造函数
function __construct($par1, $par2)
{
$this->name = $par1;
$this->size = $par2;
}
// 成员函数
/* 成员函数 */
function setName($par)
{
$this->name = $par; //变量 $this 代表自身的对象。
}
function getName()
{
echo $this->name . PHP_EOL;
}
function setSize($par)
{
$this->size = $par;
}
function getSize()
{
echo $this->size . PHP_EOL;
}
}
// 创建对象
$byd = new Car('比亚迪', 'big');
//调用成员方法
$byd->getName();
$byd->getSize();
析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
void __destruct ( void )
<?php
class Car
{
// 成员变量
var $name;
var $size;
// 构造函数
function __construct($par1, $par2)
{
$this->name = $par1;
$this->size = $par2;
}
//析构函数
function __destruct() {
print "销毁 " . $this->name . "\n";
}
// 成员函数
/* 成员函数 */
function setName($par)
{
$this->name = $par; //变量 $this 代表自身的对象。
}
function getName()
{
echo $this->name . PHP_EOL;
}
function setSize($par)
{
$this->size = $par;
}
function getSize()
{
echo $this->size . PHP_EOL;
}
}
// 创建对象
$byd = new Car('比亚迪', 'big');
//调用成员方法
$byd->getName();
$byd->getSize();
继承
PHP 使用关键字 extends
来继承一个类,PHP 不支持多继承
class Child extends Parent {
// 代码部分
}
方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public
(公有),protected
(受保护)或 private
(私有)来实现的。
public
(公有):公有的类成员可以在任何地方被访问。protected
(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。private
(私有):私有的类成员则只能被其定义所在的类访问。
接口
使用接口(interface
),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface
关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。要实现一个接口,使用 implements
操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
<?php
// 声明一个'iTgame'接口
interface iTgame
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 实现接口
class GameAi implements iTgame
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $
符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
class MyClass
{
const constant = '常量值';
function showConstant() {
echo self::constant . PHP_EOL;
}
}
抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。
Static 关键字
声明类属性或方法为 static
(静态),就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。由于静态方法不需要通过对象即可调用,所以伪变量 $this
在静态方法中不可用。静态属性不可以由对象通过 -> 操作符来访问。
Final 关键字
PHP 5 新增了一个 final
关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为
final
,则不能被继承。
调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct()
。
PHP类型比较
- 两个等号 == 比较,只比较值,不比较类型
- 三个等号 === 比较,除了比较值,也比较类型
PHP 高级
PHP 多维数组
一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。
<?php
// 二维数组:
$user = array
(
array("lisi",100,96),
array("wangwu",60,59),
array("zhaoqian",110,100)
);
print_r($user);
?>
在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组。
<?php
$user = array
(
"user1"=>array
(
"123",
"aaa"
),
"user2"=>array
(
"1234",
"bbb"
),
"user3"=>array
(
"12345",
"ccc"
)
);
print("<pre>"); // 格式化输出数组
print_r($user);
print("</pre>");
?>
PHP 日期
PHP date()
函数可把时间戳格式化为可读性更好的日期和时间。 时间戳是一个字符序列,表示一定的事件发生的日期/时间。 语法 string date ( string $format [, int $timestamp ] )
。
$date = date("Y/m/d");
format 字符 | 说明 | 返回值例子 |
---|---|---|
日 | — | — |
d | 月份中的第几天,有前导零的 2 位数字 | 01 到 31 |
D | 星期中的第几天,文本表示,3 个字母 | Mon 到 Sun |
j | 月份中的第几天,没有前导零 | 1 到 31 |
l("L"的小写字母) | 星期几,完整的文本格式 | Sunday 到 Saturday |
N | ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) | 1(表示星期一)到 7(表示星期天) |
S | 每月天数后面的英文后缀,2 个字符 | st,nd,rd 或者 th。可以和 j 一起用 |
w | 星期中的第几天,数字表示 | 0(表示星期天)到 6(表示星期六) |
z | 年份中的第几天 | 0 到 365 |
星期 | — | — |
W | ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) | 例如:42(当年的第 42 周) |
月 | — | — |
F | 月份,完整的文本格式,例如 January 或者 March | January 到 December |
m | 数字表示的月份,有前导零 | 01 到 12 |
M | 三个字母缩写表示的月份 | Jan 到 Dec |
n | 数字表示的月份,没有前导零 | 1 到 12 |
t | 给定月份所应有的天数 | 28 到 31 |
年 | — | — |
L | 是否为闰年 | 如果是闰年为 1,否则为 0 |
o | ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) | Examples: 1999 or 2003 |
Y | 4 位数字完整表示的年份 | 例如:1999 或 2003 |
y | 2 位数字表示的年份 | 例如:99 或 03 |
时间 | — | — |
a | 小写的上午和下午值 | am 或 pm |
A | 大写的上午和下午值 | AM 或 PM |
B | Swatch Internet 标准时 | 000 到 999 |
g | 小时,12 小时格式,没有前导零 | 1 到 12 |
G | 小时,24 小时格式,没有前导零 | 0 到 23 |
h | 小时,12 小时格式,有前导零 | 01 到 12 |
H | 小时,24 小时格式,有前导零 | 00 到 23 |
i | 有前导零的分钟数 | 00 到 59> |
s | 秒数,有前导零 | 00 到 59> |
u | 毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函数总是返回 000000 因为它只接受 integer 参数, 而 DateTime::format() 才支持毫秒。 | 示例: 654321 |
时区 | — | — |
e | 时区标识(PHP 5.1.0 新加) | 例如:UTC,GMT,Atlantic/Azores |
I | 是否为夏令时 | 如果是夏令时为 1,否则为 0 |
O | 与格林威治时间相差的小时数 | 例如:+0200 |
P | 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) | 例如:+02:00 |
T | 本机所在的时区 | 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如"Eastern Standard Time",中文版会显示"中国标准时间")。 |
Z | 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 | -43200 到 43200 |
完整的日期/时间 | — | — |
c | ISO 8601 格式的日期(PHP 5 新加) | 2004-02-12T15:19:21+00:00 |
r | RFC 822 格式的日期 | 例如:Thu, 21 Dec 2000 16:01:07 +0200 |
U | 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 | 参见 time() |
PHP 文件
打开文件
fopen()
函数用于在 PHP 中打开文件。此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:
模式 | 描述 |
---|---|
r | 只读。在文件的开头开始。 |
r+ | 读/写。在文件的开头开始。 |
w | 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
w+ | 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
a | 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。 |
a+ | 读/追加。通过向文件末尾写内容,来保持文件内容。 |
x | 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
x+ | 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
关闭文件
fclose()
函数用于关闭打开的文件:
检测文件末尾(EOF)
feof()
函数检测是否已到达文件末尾(EOF
)。
在循环遍历未知长度的数据时,feof()
函数很有用。
**注释:**在 w
、a
和x
模式下,您无法读取打开的文件!
逐行读取文件
fgets()
函数用于从文件中逐行读取文件。
**注释:**在调用该函数之后,文件指针会移动到下一行。
$file = fopen("D:\CODE\PHP\php_project\php_study\config\app.php", 'r') or exit("Unable to open file!");
while (!feof($file)) {
echo fgetc($file);
}
fclose($file);
PHP Cookie
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
setcookie()
函数用于设置 cookie。
注释:setcookie()
函数必须位于 标签之前。
setcookie(name, value, expire, path, domain);
PHP Session
PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
- 开始 PHP Session
ession_start()
函数必须位于 标签之前:
- 存储 Session 变量
<?php
session_start();
if (isset($_SESSION['views'])) {
$_SESSION['views'] = $_SESSION['views'] + 1;
} else {
$_SESSION['views'] = 1;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<?php
// 检索 session 数据
echo "浏览量:" . $_SESSION['views'];
?>
</body>
</html>
- 销毁 Session
使用 unset()
或 session_destroy()
函数
注释:session_destroy()
将重置 session
,您将失去所有已存储的 session
数据。
PHP Error
PHP 错误处理
- 基本的错误处理:使用 die() 函数
if (!file_exists("demo.txt")) {
die("文件不存在");
} else {
$file = fopen("demo.txt", "r");
}
- 自定义错误处理器
创建一个专用函数,可以在 PHP 中发生错误时调用该函数,语法:
error_function(error_level,error_message,error_file,error_line,error_context)
参数 | 描述 |
---|---|
error_level | 必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。 |
error_message | 必需。为用户定义的错误规定错误消息。 |
error_file | 可选。规定错误发生的文件名。 |
error_line | 可选。规定错误发生的行号。 |
error_context | 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。 |
错误报告级别:
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE | run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_ALL | 所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分) |
<?php
// 错误处理函数
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "脚本结束";
die();
}
// 设置错误处理函数
set_error_handler("customError", E_USER_WARNING);
// 触发错误
$test = 2;
if ($test > 1) {
trigger_error("变量值必须小于等于 1", E_USER_WARNING);
}
?>
PHP Exception
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
- 异常的基本使用
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。如果异常没有被捕获,而且又没用使用 set_exception_handler()
作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 “Uncaught Exception” (未捕获异常)的错误消息。
public function exception_demo($number)
{
if ($number < 0) {
throw new Exception('数字不能小于0');
}
return true;
}
public function index(){
$number = -9;
$this->exception_demo($number);
}
- Try、throw 和 catch
Try
- 使用异常的函数应该位于 “try” 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。Throw
- 里规定如何触发异常。每一个 “throw” 必须对应至少一个 “catch”。Catch
- “catch” 代码块会捕获异常,并创建一个包含异常信息的对象。
public function exception_demo($number)
{
if ($number < 0) {
throw new Exception('数字不能小于0');
}
return true;
}
public function index(){
try {
$number = -9;
$this->exception_demo($number);
} catch (Exception $e) {
echo 'Message: ' . $e->getMessage();
}
}
PHP 过滤器
如需过滤变量,请使用下面的过滤器函数之一:
- filter_var() - 通过一个指定的过滤器来过滤单一的变量
- filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
- filter_input - 获取一个输入变量,并对它进行过滤
- filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
检测一个数字是否在一个范围内
- PHP Filter 函数
$int = 10;
$min = 1;
$max = 11;
if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range" => $min, "max_range" => $max))) === false) {
echo ("不合法");
} else {
echo ("合法");
}
- PHP Filters
ID 名称 | 描述 |
---|---|
FILTER_CALLBACK | 调用用户自定义函数来过滤数据。 |
FILTER_SANITIZE_STRING | 去除标签,去除或编码特殊字符。 |
FILTER_SANITIZE_STRIPPED | “string” 过滤器的别名。 |
FILTER_SANITIZE_ENCODED | URL-encode 字符串,去除或编码特殊字符。 |
FILTER_SANITIZE_SPECIAL_CHARS | HTML 转义字符 '"<>& 以及 ASCII 值小于 32 的字符。 |
FILTER_SANITIZE_EMAIL | 删除所有字符,除了字母、数字以及 !#$%&’*±/=?^_`{|}~@.[] |
FILTER_SANITIZE_URL | 删除所有字符,除了字母、数字以及 $-_.+!*’(),{}|^~[]`<>#%";/?😡&= |
FILTER_SANITIZE_NUMBER_INT | 删除所有字符,除了数字和 ± |
FILTER_SANITIZE_NUMBER_FLOAT | 删除所有字符,除了数字、± 以及 .,eE |
FILTER_SANITIZE_MAGIC_QUOTES | 应用 addslashes()。 |
FILTER_UNSAFE_RAW | 不进行任何过滤,去除或编码特殊字符。 |
FILTER_VALIDATE_INT | 把值作为整数来验证。 |
FILTER_VALIDATE_BOOLEAN | 把值作为布尔选项来验证。如果是 “1”、“true”、“on” 和 “yes”,则返回 TRUE。如果是 “0”、“false”、“off”、“no” 和 “”,则返回 FALSE。否则返回 NULL。 |
FILTER_VALIDATE_FLOAT | 把值作为浮点数来验证。 |
FILTER_VALIDATE_REGEXP | 根据 regexp(一种兼容 Perl 的正则表达式)来验证值。 |
FILTER_VALIDATE_URL | 把值作为 URL 来验证。 |
FILTER_VALIDATE_EMAIL | 把值作为 e-mail 地址来验证。 |
FILTER_VALIDATE_IP | 把值作为 IP 地址来验证,只限 IPv4 或 IPv6 或 不是来自私有或者保留的范围。 |
PHP JSON
JSON 函数
函数 | 描述 |
---|---|
json_encode | 对变量进行 JSON 编码 |
json_decode | 对 JSON 格式的字符串进行解码,转换为 PHP 变量 |
json_last_error | 返回最后发生的错误 |
- json_encode
json_encode()
用于对变量进行JSON
编码,该函数如果执行成功返回 JSON
数据,否则返回 FALSE
。
语法:
string json_encode ( $value [, $options = 0 ] )
将 PHP 数组转换为 JSON 格式数据:
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$arr_json = json_encode($arr);
echo $arr_json;
将 PHP 对象转换为 JSON 格式数据:
class user
{
public $name = "";
public $hobbies = "";
public $birthdate = "";
}
$e = new user();
$e->name = "alice";
$e->hobbies = "paints";
$e->birthdate = "1974/8/5";
echo json_encode($e);
- json_decode
json_decode()
函数用于对 JSON 格式的字符串进行解码,并转换为 PHP 变量
mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
参数:
- json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据
- assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。
- depth: 整数类型的参数,它指定递归深度
- options: 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。
$json = '[{"a":1,"b":2,"c":3,"d":4,"e":5}]';
$json_decode = json_decode($json);
dd($json_decode);
结果:
array:1 [▼
0 => {#302 ▼
+"a": 1
+"b": 2
+"c": 3
+"d": 4
+"e": 5
}
]
PHP 7 新特性
PHP 太空船运算符(组合比较符)
太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1。
print( 1 <=> 1);
print( 1 <=> 2);
print( 2 <=> 1);
PHP 常量数组
通过 define()
来定义
define('sites', [
'Google',
'PHP',
'Taobao'
]);
dd(sites[1]);
PHP CSPRNG
PHP 7 通过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。
- random_bytes() - 加密生存被保护的伪随机字符串。
- random_int() - 加密生存被保护的伪随机整数
random_bytes()
语法格式
string random_bytes ( int $length )
参数
- length - 随机字符串返回的字节数。
返回值
- 返回一个字符串,接受一个int型入参代表返回结果的字节数。
$bytes = random_bytes(5);
print(bin2hex($bytes));
random_int()
语法格式
int random_int ( int $min , int $max )
参数
- min - 返回的最小值,必须是大于或等于 PHP_INT_MIN 。
- max - 返回的最大值,必须是小于或等于 PHP_INT_MAX 。
返回值
- 返回一个指定范围内的int型数字。
print(random_int(1000000, 9999999));
$bytes = random_bytes(5);
$num = random_int(1000000, 9999999);
$date = date('YmdHis');
print(bin2hex($bytes).$num.$date);
PHP 7 use 语句
// PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
use some\namespace\{ClassA, ClassB, ClassC as C};
更新中…