基本语法
变量名需要加$
java中的.被->代替
拼接用的.
开始
<?
$age = 18;
echo ”我今年{$age}岁“
?>
- PHP 中单引号包裹的字符串不会解析变量,会原样输出字符串内容,双引号会解析变量。
- 注释使用:# 或 // 或 /* */
- 命名:变量名区分大小写。关键字,函数和类的名称不区分大小写。
变量
$a = 100; // 全局变量
define("SITE_URL", "/"); // 常量
function multiply ($value) { // 函数参数
$b = 'aaa' // 局部变量
static $count = 0; // 静态变量
global $c = 10 // 全局变量
$value = $value * 10;
unset($a); // 删除变量(注意不能删除全局变量)
isset($a); // 判断变量是否存在(注意不能判断全局变量)
return $value;
}
特殊变量
$a = 'name'; // $a 的值是字符串 'name'
$$a = '张三'; // 相当于定义了 $name = '张三'
echo $name; // 输出:张三
echo $$a; // 输出:张三(与上面等价)
//首先解析 $a 的值,将其作为一个新的变量名;然后 $$a 就等同于这个新变量名所对应的变量
常量
PHP_EOL 换行符
定义常量:define("USERAPP","我是常量");
const SITE_NAME = "我是常量";
优先使用 const:语法更简洁,支持类常量和数组,有作用域限制,编译时解析效率更高。
仅在特殊场景使用 define():如需要在条件语句中定义常量,或兼容旧版本 PHP(5.6 以下)。
两者定义的常量均为全局有效(类常量除外),且一旦定义不能被修改或删除。
魔术常量
__LINE__
:返回文件的当前行号。
__FILE__
:返回正在执行的PHP文件的完整路径和名称。
__DIR__
:返回文件的目录。
__FUNCTION__
:返回当前函数的名称。
__CLASS__
:返回当前类的名称。
__METHOD__
:返回当前类方法的名称。
__NAMESPACE__
:返回当前命名空间的名称。
__TRAIT__
:返回当前使用的trait的名称。
数据类型
字符串():‘Hello world!’
整数():123
浮点数():1.234
布尔值():true
数组(): array(“Red”, “Green”, “Blue”)
对象(): new greeting
资源():fopen(“note.txt”, “r”);
NULL():null
DOF定界符
<?php
echo <<<EOF
123
EOF;
?>
数组
索引数组:
$colors = array("Red", "Green", "Blue");
关联数组:
$ages = array("Peter"=>22, "Clark"=>32, "John"=>28);
多维数组:
a[
b[],c[]
]
合并数组:
使用+
在索引相同时,谁在+前面,谁就是头。
使用array_merge( $a,$b)
在索引相同时,优先数据最新的。
函数:
函数名 | 功能描述 | 示例(简化示意,实际可按需扩展) |
---|---|---|
array() | 创建一个数组 | $arr = array(1, 2, 3); 或 $arr = [1, 2, 3]; |
count() | 返回数组中元素的数量 | $len = count([1, 2, 3]); // 结果为 3 |
array_push() | 将一个或多个元素添加到数组的末尾 | $ arr = [1]; array_push($arr, 2, 3); // 变为 [1,2,3] |
array_unshift() | 将一个或多个元素添加到数组的开头 | $ arr = [2]; array_unshift($arr, 1); // 变为 [1,2] |
array_pop() | 删除并返回数组中的最后一个元素 | $ arr = [1, 2]; $ last = array_pop($ arr); // $ arr 变为 [1],$last 为 2 |
array_shift() | 删除并返回数组中的第一个元素 | $ arr = [1, 2]; $ first = array_shift($ arr); // $ arr 变为 [2],$first 为 1 |
array_slice() | 从数组中提取一部分元素,组成新的数组 | $ arr = [1,2,3,4]; $ newArr = array_slice($arr, 1, 2); // 新数组为 [2,3] |
array_merge() | 合并两个或多个数组 | $ arr1 = [1]; $ arr2 = [2]; $ newArr = array_merge($arr1, $arr2); // 变为 [1,2] |
array_reverse() | 反转数组中的元素的顺序 | $ arr = [1,2]; $ newArr = array_reverse($arr); // 变为 [2,1] |
in_array() | 检查数组中是否存在某个 | 值 $exists = in_array(2, [1,2]); // 结果为 true |
array_key_exists() | 检查数组中是否存在某个键 | $arr = [‘a’ => 1]; $exists = array_key_exists(‘a’, $arr); // 结果为 true |
array_keys() | 返回数组中的所有键,组成新数组 | $ arr = [‘a’ => 1, ‘b’ => 2]; $ keys = array_keys($arr); // 新数组为 [‘a’,‘b’] |
array_values() | 返回数组中的所有值,组成新数组 | $ arr = [‘a’ => 1, ‘b’ => 2]; $ vals = array_values($arr); // 新数组为 [1,2] |
array_search() | 在数组中搜索给定的值,并返回对应的键 | $arr = [‘a’ => 1]; $key = array_search(1, $arr); // 结果为 ‘a’ |
array_unique() | 移除数组中的重复值 | $arr = [1,1,2]; $newArr = array_unique( $ arr); // 变为 [1,2] |
max() | 获取数组中的最大值(也可用于普通值) | $max = max([1,3,2]); // 结果为 3 |
min() | 获取数组中的最小值(也可用于普通值) | $min = min([1,3,2]); // 结果为 1 |
sort() | 对数组进行排序(默认升序,改变原数组) | $ arr = [3,1,2]; sort($arr); // 变为 [1,2,3] |
array_sum() | 对数组中的元素求和 | $sum = array_sum([1,2,3]); // 结果为 6 |
字符串
函数名 | 功能描述 | 示例(可结合实际场景调整) | 解析 |
---|---|---|---|
strpos() | 区分大小写,查找子串首次出现的位置,无匹配则返回 false | strpos(“Hello World”, “o”); | 返回 4 索引从 0 开始 |
stripos() | 不区分大小写,查找子串首次出现的位置,无匹配则返回 false | stripos(“Hello World”, “O”); | 返回 4 忽略大小写(如找关键词场景) |
strrpos() | 区分大小写,查找子串最后一次出现的位置,无匹配则返回 false | strrpos(“Hello World”, “o”); | 返回 7 从末尾开始找 |
strripos() | 不区分大小写,查找子串最后一次出现的位置,无匹配则返回 false | strripos(“Hello World”, “O”); | 返回 7 忽略大小写 + 找最后一次位置 |
explode() | 按分隔符把字符串拆成数组 | explode(" ", “Hello World”); | 拆成 [“Hello”,“World”] 常用拆分 CSV、URL 参数等 |
implode() | 用分隔符把数组拼接成字符串(join() 是别名) | implode(“-”, [“a”,“b”]); | 拼接成 “a-b” 常用拼接 ID 列表、路径等 |
strtoupper() | 把字符串全部转大写 | strtoupper(“Hello”); | 转成 “HELLO” 统一格式(如用户输入校验) |
strtolower() | 把字符串全部转小写 | strtolower(“HELLO”); | 转成 “hello” 统一格式(如邮箱匹配) |
ucfirst() | 把字符串首字母转大写 | ucfirst(“hello”); | 转成 “Hello” 美化标题、用户名首字母 |
lcfirst() | 把字符串首字母转小写 | lcfirst(“Hello”); | 转成 “hello” 特殊场景处理(如 API 格式) |
ucwords() | 把字符串每个单词首字母转大写(默认按空格分割 “单词”) | ucwords(“hello world”); | 转成 “Hello World” 美化段落标题、产品名称 |
str_replace() | 替换字符串中指定子串(简单文本替换,非正则) | str_replace(“World”, “PHP”, “Hello World”); | 转成 “Hello PHP” 批量替换固定文本 |
strrev() | 反转字符串内容 | strrev(“Hello”); | 转成 “olleH” 趣味场景或加密简易处理 |
trim() | 去除字符串首尾空白字符(含空格、换行符等) | trim(" Hello "); | 转成 “Hello” 处理用户输入、接口返回数据截取 |
substr() | 按索引 / 长度截取字符串(注意:多字节字符(如中文)可能截断乱码) | substr(“Hello”, 1, 3); | 截取 “ell” 英文场景优先,中文需谨慎 |
mb_substr() | 按索引 / 长度截取字符串(支持多字节字符,需启用 mbstring 扩展) | mb_substr(“你好世界”, 0, 2, “UTF-8”); | 截取 “你好” 中文 / 多语言场景必用 |
数据类型转换
数字转字符串:strval(xxx); (string)xxx; 【注意:布尔类型,true为1,false为null】
字符串转int:intval(xxx);(int)xxx;(integer)xxx;
字符串转浮点型:floatval(xxx);(float)xxx;(double)xxx;
字符串转布尔:boolval(xxx);(bool)xxx;(boolean)xxx;【注意:只有0和空为false】
运算符
算数运算符:+ - * / %
赋值运算符:= += -= *= /= %= **.=【连接字符串】**
递增/递减运算符:$a++ $a-- ++$a --$a
先+后返回
逻辑运算符:and or && || ! xor【一样一个】
字符串运算符:.【级联】 .=【串联分配】
数组运算符:+ == === != <> !==
空合并运算符:??
【判断一个变量是否未定义或者为null,如果未定义或为nul,则返回指定的默认值;否则返回该变量的值】
组合比较符:<=>
【值为1 0 -1,就是看比较值的结果】
等于比较== ===
【双等:只比较值;三等:深度比较类型】
条件语句
if else语句:
<?php
if(条件一){
xxx
} elseif(条件一){
exxx
} else{
xxx
}
?>
switch…Case语句
<?php
switch($today){
case "Mon":
xxxx
break;
default:
xxx
break;
}
?>
循环语句
while循环:
while(条件){
//要执行的代码
}
do…while 循环:
do {
//要执行的代码
}
while(条件);
for 循环:
for(initialization;condition;increment){
//要执行的代码
}
foreach 循环:
foreach($array as $key => $value){
//要执行的代码
}
导入
include
require
语句 | 当引入文件不存在 / 错误时的行为 | 适用场景 |
---|---|---|
include | 产生 E_WARNING 警告,但脚本会继续执行 | 引入非必需文件(如可选模板、组件) |
require | 产生 E_COMPILE_ERROR 致命错误,脚本会立即停止执行 | 引入必需文件(如配置文件、核心函数库) |
函数的基本创建
declare(strict_types=1); // 严格模式,因为php是没有强数据类型的,所以可以通过declare进行约束,必须强类型
function aa(int $a, string $b){
echo "我是$b, 我的年龄是$a.岁\n";
}
aa(18, 16)
时间
内置函数:
函数名 | 功能描述 |
---|---|
time() | 获取当前Unix时间戳(从1970-01-01 00:00:00 UTC到现在的秒数) |
microtime() | 获取当前Unix时间戳(含微秒),默认返回字符串,传true返回浮点数 |
date() | 将时间戳格式化为指定的日期时间字符串(默认用当前时间戳) |
strtotime() | 将人类可读的日期字符串转换为Unix时间戳(支持相对时间) |
mktime() | 根据指定的时、分、秒、月、日、年生成Unix时间戳(参数顺序:时,分,秒,月,日,年) |
gmdate() | 按格林威治标准时间(GMT/UTC)格式化时间戳(区别于date()的本地时间) |
date_default_timezone_set() | 设置脚本的默认时区(需先设置再用时间函数,避免警告) |
date_default_timezone_get() | 获取当前脚本的默认时区 |
date_diff() | 计算两个DateTime对象的时间差,返回DateInterval对象 |
strftime() | 按本地化格式格式化时间戳(依赖系统locale,中文需设置zh_CN.UTF-8) |
date_create() | 创建DateTime对象(等同于new DateTime(),支持字符串参数) |
date_format() | 格式化DateTime对象(DateTime类的format()方法等效) |
date_add() | 给DateTime对象添加时间间隔(DateTime::add()等效) |
date_sub() | 从DateTime对象减去时间间隔(DateTime::sub()等效) |
date_interval_create_from_date_string() | 从字符串创建DateInterval对象(用于时间加减) |
内置对象:
$dateyest1 = new DateTime('2024-12-24');
$dateyest2 = new DateTime('2024-11-24');
$dateyest1->modify('-1 day'); // 减去一天
$dateyest1->add(new DateInterval('P1D')); // 加上一天
$dateyest1->sub(new DateInterval('P1D')); // 减去一天
echo $dateyest1->format('Y-m-d'); // 格式化日期
$dateyest3 = $dateyest1->diff($dateyest2); // 计算两个日期之间的差异
echo $dateyest3->format('%a'); // 输出相差的天数
面向对象
权限:
public
private
protected
get/set
public function getName(){
return $this->name;
}
public function setName($name){
$this->name = $name;
}
构造方法
构造方法(Constructor) :是类中的一种特殊方法,用于在创建类的实例(对象)时自动执行,主要的主要作用是初始化对象的属性或执行必要的准备工作。
public function __construct($name, $age) {
// 初始化属性
$this->name = $name;
$this->age = $age;
}
$person = new Person("张三", 25); // 调用
析构函数
析构函数(Destructor): 是类中的特殊方法,与构造方法相反,它会在对象被销毁(从内存中释放)时自动执行,主要用于释放资源、清理操作(如关闭数据库连接、释放文件句柄等)。
// 析构方法:关闭文件(释放资源)
public function __destruct() {
if ($this->file) {
fclose($this->file);
echo "文件已关闭(析构函数执行)<br>";
}
}
静态
静态变量(Static Variables) :是在函数或类中使用 static 关键字声明的变量,其特点是值不会随函数 / 方法的调用结束而销毁,而是会保留上次执行后的结果,下次调用时直接使用该值。
public static $cat // 创建
self::$cat // 函数内调用
类名::$cat // 函数外调用
parent::$cat // 访问父类
继承
继承: 是面向对象编程(OOP)的核心特性之一,允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码复用和扩展。子类可以复用父类的功能,同时可以添加新功能或重写父类的方法。
class Child extends Parent {
// 代码部分
}
**重写:**子类可以定义与父类同名的方法,覆盖父类的实现(需保持方法签名兼容)。若需调用父类的原方法,使用 parent::方法名()。
class Animal {
public function makeSound() {
echo "动物发出声音<br>";
}
}
class Cat extends Animal {
// 重写父类的 makeSound 方法
public function makeSound() {
parent::makeSound(); // 调用父类的方法
echo "猫咪喵喵叫<br>"; // 新增子类逻辑
}
}
final: 固定某个类或方法的实现,防止被修改或扩展,确保代码的稳定性。
- 修饰类 → 禁止被继承
- 修饰方法 → 禁止被重写
多态
多态(Polymorphism) :是面向对象编程(OOP)的核心特性之一,指不同类的对象对同一方法调用做出不同响应的能力。简单来说,就是 “同一操作作用于不同对象,产生不同结果”。
// 父类:定义统一的方法接口
class Animal {
// 父类的抽象方法(也可以是普通方法)
public function makeSound() {
echo "动物发出声音<br>";
}
}
// 子类1:重写父类方法
class Dog extends Animal {
public function makeSound() {
echo "汪汪汪<br>";
}
}
// 子类2:重写父类方法
class Cat extends Animal {
public function makeSound() {
echo "喵喵喵<br>";
}
}
$dog = new Dog();
$cat = new Cat();
makeAnimalSound($dog); // 输出:汪汪汪
makeAnimalSound($cat); // 输出:喵喵喵
方法的重载: 动态处理未定义的方法调用,通过魔术方法实现对不同参数的灵活响应。
PHP 通过两个魔术方法实现 “重载” 效果,用于处理对不存在的方法的调用:
- __call():当调用对象中不存在的非静态方法时触发
- __callStatic():当调用类中不存在的静态方法时触发
这两个方法会接收两个参数: -
- 第一个参数:被调用的方法名(字符串)
-
- 第二个参数:调用方法时传递的参数数组
接口与抽象类
接口:是纯粹的行为规范,使用 interface 关键字声明。
抽象类:是包含抽象方法的类,使用 abstract 关键字声明。它不能被直接实例化,只能作为父类被继承,子类必须实现其所有抽象方法。
抽象方法:是一种只有声明(方法名、参数、返回值类型)而没有具体实现的方法,必须包含在抽象类中,用于强制子类实现特定的功能。
interface Runnable {
public function run();
}
aa implements Runnable {
public function run(){};
}
// 抽象类
abstract class Animal {
// 普通属性
protected $name;
// 构造方法(普通方法)
public function __construct($name) {
$this->name = $name;
}
// 抽象方法(子类必须实现)
abstract public function makeSound();
// 普通方法(有具体实现)
public function eat() {
echo "{$this->name}在吃东西<br>";
}
}
// 子类继承抽象类,必须实现抽象方法
class Dog extends Animal {
public function makeSound() {
echo "{$this->name}汪汪叫<br>";
}
}
$dog = new Dog("旺财");
$dog->makeSound(); // 输出:旺财汪汪叫
$dog->eat(); // 输出:旺财在吃东西
trait
Trait :是一种代码复用机制,用于解决单继承限制(一个类只能继承一个父类),允许在多个不相关的类中共享方法。它既不是类也不是接口,更像是 “方法集合”,可以被类 “引入” 并直接使用其中的方法。
trait AA{}
use AA
命名空间
命名空间(Namespace) :是一种用于解决命名冲突的机制,它通过将代码元素(如变量、函数、类等)划分到不同的逻辑分组中,避免同名标识符之间的冲突。
用 namespace 定义,use 导入,as 指定别名
注意:
- 必须是第一行
namespace ch1\test\ms\index;
$a = 100;
function add(){
return '我无敌';
}
const MNAM = '更好';
echo add();
echo \ch1\test\ms\index\add();