1.1·php发展历史
1.2·快速入门php
1.3·常量·变量
1.4·表达式
1.5·函数应用
1.6·类定义
1.7·php数据库与前端连接实战
1.1·php发展历史
PHP作为广泛应用于Web开发的脚本语言,其发展历程可分为以下关键阶段:
一、初创时期(1994-1997)
1994年由Rasmus Lerdorf创建,最初称为"Personal Home Page Tools",用于管理个人网页。1995年发布PHP 2.0(FI:Forms Interpreter),新增表单处理功能。
核心特性:
- 基础模板引擎
- 数据库连接支持
- 简单变量处理(如$$var语法)
二、标准化发展(1997-2000)
1997年Zeev Suraski和Andi Gutmans重写核心代码,1998年发布PHP 3.0:
- 正式更名为"PHP: Hypertext Preprocessor"
- 支持模块化扩展
- 实现基础面向对象编程
- 兼容主流操作系统
// PHP 3示例代码
class SimpleClass {
var $var = 'default';
function displayVar() {
echo $this->var;
}
}
三、性能飞跃(2000-2004)
2000年推出PHP 4.0:
- 引入Zend引擎1.0
- 支持会话管理(session_start())
- 输出缓冲控制(ob_start())
- 新增Superglobals($_GET/$_POST等)
$$ \text{性能提升} = \frac{T_{PHP3}}{T_{PHP4}} \approx 2.5 \quad (基准测试数据) $$
四、现代编程范式(2004-2015)
2004年PHP 5.0发布重大改进:
- 完整面向对象支持(访问控制、接口、抽象类)
- 异常处理机制(try/catch)
- SimpleXML与PDO扩展
- 改进内存管理
// PHP 5特征示例
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
file_put_contents('log.txt', $message, FILE_APPEND);
}
}
2009年PHP 5.3引入:
- 命名空间(namespace)
- 匿名函数(闭包)
- 延迟静态绑定
五、性能革命(2015-2020)
2015年PHP 7.0发布:
- Zend引擎3.0带来100%性能提升
- 类型声明(function foo(int $bar): string)
- 太空船操作符(<=>)
- 空合并运算符(??)
$$ \text{内存消耗减少} = \frac{M_{PHP5}}{M_{PHP7}} \approx 0.5 $$
六、前沿发展(2020至今)
PHP 8.0主要革新:
- JIT编译器(Just-In-Time)
- 联合类型(string|int)
- 匹配表达式(match)
- 属性注解(#[Attribute])
// PHP 8匹配表达式示例
$result = match($statusCode) {
200, 201 => 'success',
404 => 'not found',
500 => 'server error',
default => 'unknown'
};
后续版本持续增强:
- 8.1:枚举类型、只读属性
- 8.2:独立类型null/false/true
- 8.3:类常量显式类型声明
PHP从简单的模板工具发展为支持函数式、面向对象、命令式编程范式的现代语言,持续在性能优化(JIT)、类型系统(渐进式类型)和开发体验(IDE支持)等方面演进,始终保持着在Web开发领域的重要地位。
1.2·快速入门php
php-好用的web后端语言。语法类似于c语言。我们先从如何下载php说起来。
PHP官方下载地址:PHP: Hypertext Preprocessor
然后有了php,没有IDE可不行,IDE推荐使用jetbrains公司的PhpStorm
官方下载地址:PhpStorm:JetBrains 的 PHP IDE
不过这个IDE好像要钱,当然微软商城里面有一些免费的代码编辑器,可以去下载。
PhpStorm也有破解版(我的就是),不过我是不会给出的,(我也无法保证链接的安全性),所有就不发了。
运行php代码其实也不要那么麻烦,先下载phpstudy。
网站:小皮面板(phpstudy) - 让天下没有难配的服务器环境!
然后下载安装。
安装完之后就是这样。没记错的话是自带php+阿帕奇+myql环境的。
我们可以创建一个网站
在配置网站时,需要注意域名需要把顶级域名带上(可能会出问题--有点玄学),例如exp.com/.net,名字可以随便取(最好不要与你可以访问到的域名重名例如:www.baidu.com)
然后打开图片中根目录的地址。建新文件,main.php(文件名随便,但后缀名要为.php)
然后运行阿帕奇和mysql数据库(不运行数据库也没问题)
然后访问:http://[你的域名]/[文件名].php,就可以看到运行结果了。
例如我的就是:http://aaa.com/main.php
你可以在这之前向你的php文件中写入以下代码查看是否成功运行php
<?php
phpinfo();//查看php相关信息的函数
?>
如果运行成功会出现以下结果:
第一个程序--halle,Word
<?php
echo "halle,word";//打印halle,word
?>
使用记事本打开并写入。然后访问你写的文件。
运行结果:
1.3·常量·变量
PHP 变量
定义与特性
- 使用
$
符号声明,如$username = "John";
- 作用域分为局部/全局/静态
- 支持动态变量名:
${$varName} = value;
命名规范
-
格式要求:
- 首字符:字母或下划线
- 后续字符:字母、数字、下划线
- 有效示例:
$_totalCount
,$user2
- 无效示例:
$2ndPlace
(数字开头)
-
大小写敏感:
$Age
≠$age
≠$AGE
取值限制
数据类型 | 存储范围 |
---|---|
整型 | 32位系统:$-2^{31}$~$2^{31}-1$<br>64位系统:$-9 \times 10^{18}$~$9 \times 10^{18}$ |
浮点型 | 约$\pm 1.8 \times 10^{308}$,精度15位 |
字符串 | 最大2GB内存 |
PHP 常量
定义方式
// 传统定义(运行时)
define("MAX_FILE_SIZE", 5);
// 类常量定义(编译时)
const MIN_WIDTH = 768;
命名规范
-
格式要求:
- 推荐全大写+下划线:
TAX_RATE
- 允许但应避免小写:
define("min_height", 100);
- 推荐全大写+下划线:
-
命名限制:
- 不可使用保留关键字
- 不可重复定义
取值特性
- 仅支持标量类型(布尔/整型/浮点/字符串)
- 内存限制与变量相同
- 全局可用(无作用域限制)
对比总结
特性 | 变量 | 常量 |
---|---|---|
声明符号 | $ 前缀 | 无符号 |
可修改性 | 可重复赋值 | 定义后不可变 |
作用域 | 受限于定义位置 | 全局有效 |
数据类型 | 支持所有类型 | 仅标量类型 |
定义方式 | 直接赋值 | define()/const |
应用示例
// 变量动态命名
$dataType = "height";
${$dataType} = 180;
// 常量访问
echo constant("MAX_FILE_SIZE"); // 输出5
1.4·表达式
以下是关于PHP表达式和运算符的详细说明:
一、基本表达式
- 变量表达式:
$username = "张三";
- 常量表达式:
define("MAX_SIZE", 1024);
- 数组表达式:
$colors = ["红", "绿", "蓝"];
二、运算符类型
1. 算术运算符
$a = 10 + 5; // 加
$b = 20 - 8; // 减
$c = 6 * 3; // 乘
$d = 15 / 3; // 除
$e = 17 % 5; // 取模
2. 比较运算符
var_dump(5 == "5"); // 等于 → true
var_dump(5 === "5"); // 全等 → false
var_dump(5 != 3); // 不等于 → true
var_dump(5 > 3); // 大于 → true
3. 逻辑运算符
$condition = (5 > 3) && (2 < 4); // 逻辑与 → true
$result = (false) || (5 === 5); // 逻辑或 → true
$flag = !(5 == 3); // 逻辑非 → true
三、特殊运算符
1. 三元运算符
$age = 18;
$status = $age >= 18 ? "成年人" : "未成年人"; // 简写形式
2. 空合并运算符(PHP7+)
$username = $_GET['user'] ?? '匿名用户'; // 处理未定义变量
3. 错误控制运算符
$file = @file('不存在的文件.txt'); // 抑制错误提示(慎用)
四、运算符优先级要点
- 最高优先级:
()
,[]
,->
,::
- 算术运算符 > 比较运算符 > 逻辑运算符
- 建议使用括号明确运算顺序:
$result = (5 * 3) + (10 / 2); // 明确优先级
五、组合比较运算符(PHP7+)
echo 1 <=> 1; // 0(相等)
echo 2 <=> 1; // 1(左边大)
echo 1 <=> 2; // -1(右边大)
六、字符串运算符
$greeting = "你好" . "世界"; // 连接 → "你好世界"
$name = "王";
$name .= "小明"; // 追加 → "王小明"
注意:使用运算符时要注意类型转换问题,例如:
var_dump(0 == "0"); // true(类型转换后相等)
var_dump(0 === "0"); // false(严格类型检查)
1.5·函数应用
PHP函数详解与应用
一、函数基础
- 定义格式
function 函数名(参数列表) {
// 执行逻辑
return 返回值;
}
示例:计算阶乘
function factorial($n) {
if ($n <= 1) return 1;
return $n * factorial($n - 1);
}
echo factorial(5); // 输出120
- 参数传递
- 按值传递(默认)
function add($a, $b) {
return $a + $b;
}
- 引用传递(使用&)
function doubleValue(&$num) {
$num *= 2;
}
$x = 5;
doubleValue($x); // $x变为10
二、返回值处理
- 多返回值实现
function circleCalc($r) {
$area = M_PI * $r**2;
$circumference = 2 * M_PI * $r;
return [$area, $circumference];
}
list($a, $c) = circleCalc(3);
三、作用域规则
- 全局变量访问
$globalVar = 10;
function showGlobal() {
global $globalVar;
echo $globalVar; // 输出10
// 或使用$GLOBALS数组
echo $GLOBALS['globalVar'];
}
四、常用内置函数
- 字符串处理
$str = "Hello PHP";
echo strlen($str); // 10
echo strtoupper($str); // HELLO PHP
print_r(explode(" ", $str)); // ["Hello", "PHP"]
- 数组操作
$nums = [3,1,4,2];
sort($nums); // [1,2,3,4]
echo array_sum($nums); // 10
print_r(array_reverse($nums)); // [4,3,2,1]
五、高级特性
- 匿名函数(闭包)
$greet = function($name) {
return "Hello, $name!";
};
echo $greet('John'); // Hello, John!
// 配合array_map使用
$numbers = [1,2,3];
$squared = array_map(function($n) {
return $n ** 2;
}, $numbers); // [1,4,9]
- 可变参数函数
function sum(...$nums) {
return array_sum($nums);
}
echo sum(1,2,3,4); // 10
六、最佳实践
- 参数验证
function divide($a, $b) {
if (!is_numeric($a) || !is_numeric($b)) {
throw new InvalidArgumentException("参数必须为数字");
}
if ($b == 0) {
throw new DivisionByZeroError("除数不能为零");
}
return $a / $b;
}
- 函数缓存
function heavyCalculation($x) {
static $cache = [];
if (isset($cache[$x])) {
return $cache[$x];
}
// 复杂计算过程
$result = $x * 2; // 示例计算
$cache[$x] = $result;
return $result;
}
七、典型应用场景
- 表单验证函数
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
function sanitizeInput($data) {
return htmlspecialchars(stripslashes(trim($data)));
}
- 数据库操作封装
function queryDB($sql, $params = []) {
$pdo = new PDO(DSN, USER, PASS);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
注意事项:
- 函数命名推荐使用小驼峰式(如getUserInfo)
- 避免函数过长(建议不超过50行)
- 合理使用类型声明(PHP7+特性)
function addNumbers(float $a, float $b): float {
return $a + $b;
}
1.6·类定义
PHP 类定义与教学
一、基础概念
- 类(Class):具有相同属性和行为的对象的抽象模板
- 对象(Object):类的具体实例
- 属性:类的特征变量(成员变量)
- 方法:类的功能函数(成员函数)
二、类定义基本结构
<?php
class User {
// 属性声明
public $name;
private $age;
// 构造函数
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
// 方法示例
public function getInfo(): string {
return "姓名:{$this->name},年龄:{$this->age}";
}
}
?>
三、核心组件详解
- 构造函数与析构函数
public function __construct() { /* 初始化逻辑 */ }
public function __destruct() { /* 清理逻辑 */ }
- 访问控制修饰符
public
:全局可访问protected
:仅类内和子类可访问private
:仅类内可访问
- 继承与多态
class AdminUser extends User {
private $permissionLevel;
public function setPermission(int $level): void {
$this->permissionLevel = $level;
}
}
- 静态成员
class Counter {
public static $count = 0;
public static function increment(): void {
self::$count++;
}
}
Counter::increment();
四、实际应用案例
数据库连接类示例
class Database {
private $connection;
private static $instance = null;
private function __construct() {
$this->connection = new PDO(
'mysql:host=localhost;dbname=test',
'username',
'password'
);
}
public static function getInstance(): Database {
if (!self::$instance) {
self::$instance = new Database();
}
return self::$instance;
}
public function query(string $sql): PDOStatement {
return $this->connection->query($sql);
}
}
// 使用示例
$db = Database::getInstance();
$result = $db->query("SELECT * FROM users");
五、最佳实践建议
- 命名规范:类名使用大驼峰,方法名使用小驼峰
- 单一职责原则:每个类应只负责单一功能
- 封装原则:隐藏内部实现细节,通过公共方法暴露功能
- 类型声明:PHP7+推荐使用参数和返回类型声明
六、常见问题解答
-
Q: 类和对象是什么关系? A: 类如同蓝图,对象是根据蓝图建造的实体。例如
User
类是模板,$user = new User()
是具体实例 -
Q: 什么时候使用静态方法? A: 当方法与类相关但不需要实例数据时使用,如工具类方法
-
Q: 如何选择访问修饰符? A: 遵循最小权限原则,默认使用
private
,仅在需要暴露时使用public
或protected
实际开发中可通过IDE的代码提示功能(如PHPStorm)快速查看类结构,使用var_dump($object)
可查看对象详细信息。
1.7·php数据库与前端连接实战
PHP数据库与前端连接实战:从数据存储到页面展示
一、环境准备与数据库搭建
- 本地服务器配置
- 推荐使用XAMPP/WAMP集成环境(含Apache+MySQL+PHP)
- 启动Apache服务与MySQL服务
- 创建示例数据库
CREATE DATABASE shop_db;
USE shop_db;
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
price DECIMAL(10,2),
stock INT
);
二、PHP连接MySQL数据库
<?php
// 数据库连接参数配置
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "shop_db";
// 创建连接对象
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接状态
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "数据库连接成功";
?>
三、数据查询与前端展示
- 数据查询处理
<?php
$sql = "SELECT * FROM products";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 准备数据数组
$products = array();
while($row = $result->fetch_assoc()) {
$products[] = $row;
}
} else {
echo "0 条记录";
}
$conn->close();
?>
- 前端数据渲染
<!DOCTYPE html>
<html>
<head>
<style>
.product-table {border-collapse: collapse; width: 80%; margin: 20px auto;}
.product-table td, .product-table th {border: 1px solid #ddd; padding: 8px;}
</style>
</head>
<body>
<table class="product-table">
<tr>
<th>ID</th>
<th>商品名称</th>
<th>价格</th>
<th>库存</th>
</tr>
<?php foreach ($products as $product): ?>
<tr>
<td><?php echo $product['id']; ?></td>
<td><?php echo htmlspecialchars($product['name']); ?></td>
<td>¥<?php echo number_format($product['price'], 2); ?></td>
<td><?php echo $product['stock']; ?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
四、安全增强措施
- 预处理语句防SQL注入
$stmt = $conn->prepare("INSERT INTO products (name, price, stock) VALUES (?, ?, ?)");
$stmt->bind_param("sdi", $name, $price, $stock);
- 输入数据过滤
$clean_name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$clean_price = filter_input(INPUT_POST, 'price', FILTER_SANITIZE_NUMBER_FLOAT);
五、完整功能实现示例
- 数据添加表单
<form action="add_product.php" method="post">
<input type="text" name="name" placeholder="商品名称" required>
<input type="number" step="0.01" name="price" placeholder="价格" required>
<input type="number" name="stock" placeholder="库存" required>
<button type="submit">添加商品</button>
</form>
- 后端处理脚本(add_product.php)
<?php
include 'db_connect.php';
if($_SERVER["REQUEST_METHOD"] == "POST"){
$name = $_POST['name'];
$price = $_POST['price'];
$stock = $_POST['stock'];
$stmt = $conn->prepare("INSERT INTO products (name, price, stock) VALUES (?, ?, ?)");
$stmt->bind_param("sdi", $name, $price, $stock);
if($stmt->execute()){
header("Location: index.php");
} else {
echo "添加失败: " . $conn->error;
}
$stmt->close();
$conn->close();
}
?>
六、调试技巧
- 常见错误排查:
- 检查MySQL服务是否运行
- 验证数据库用户权限
- 查看PHP错误日志(路径:php.ini中error_log配置)
- 使用
var_dump()
输出变量值
- 连接测试工具
// 临时测试脚本
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "PDO连接成功";
} catch(PDOException $e) {
echo "连接失败: " . $e->getMessage();
}
本教程完整实现了从数据库连接、数据操作到前端展示的全流程,包含安全防护措施和实用调试技巧。建议读者按照步骤实践后,可尝试扩展删除、修改等功能,并探索AJAX异步交互等进阶内容。
好了现在php算是讲完了,其实我php不好,所以建议大家去买一本将php的书,因为php在web安全中是非常重要的,仅靠一两篇博客文章就想学好php很难。
下一篇文章:Python的入门与实战应用(上)
我精通python,所以文章分为上、中、下讲解。主要是干货比较多而且python在网络安全中非常重要。