1. PHP简介
1.1 PHP的定义
- PHP的定义:PHP是一种开源的服务器端脚本语言,用于开发Web应用程序。它可以嵌入HTML中,也可以与各种数据库配合使用,如MySQL等。PHP最初是由Rasmus Lerdorf开发的,现在由The PHP Group维护。
1.2 PHP的历史
- PHP的历史:
PHP最初是由Rasmus Lerdorf于1995年创建的,当时它只是一个简单的用于跟踪访问个人简历的工具。随着时间的推移,它逐渐演变成了一个用于创建动态Web页面的脚本语言。PHP的发展得益于其开源性质,使得开发者可以方便地共享和贡献代码,从而不断完善和发展。现在,PHP已经成为了Web开发中最受欢迎的语言之一,被广泛应用于各种网站和应用程序的开发中。
1.3 PHP的特点- PHP的特点:
- 开源免费
- 跨平台
- 面向对象编程(OOP)
- 支持多种数据库
- 安全性高
- 执行效率高
- 可扩展性强
- 社区活跃,生态丰富
2. PHP基础语法
2.1 变量
- 变量赋值及使用示例:
$name = "Tom"; $age = 18; $isMale = true; $salary = 1200.50; echo "姓名:" . $name . "<br>"; echo "年龄:" . $age . "<br>"; echo "性别:" . ($isMale ? "男" : "女") . "<br>"; echo "薪水:" . $salary . "<br>";
- 变量作用域示例:
$globalVar = "global"; function test() { $localVar = "local"; global $globalVar; echo "函数内部局部变量:" . $localVar . "<br>"; echo "函数内部全局变量:" . $globalVar . "<br>"; } test(); echo "函数外部全局变量:" . $globalVar . "<br>"; echo "函数外部局部变量:" . $localVar . "<br>"; // 报错:Notice: Undefined variable
- 变量类型转换示例:
$numStr = "123"; $num = (int)$numStr; $strNum = (string)$num; echo "字符串转整型:" . $num . "<br>"; echo "整型转字符串:" . $strNum . "<br>";
- 变量引用示例:
$a = 10; $b = &$a; $b = 20; echo "变量a的值:" . $a . "<br>"; echo "变量b的值:" . $b . "<br>";
- 常量定义及使用示例:
define("PI", 3.14); echo "圆周率:" . PI . "<br>";
2.2 常量
- PHP常量是一个简单值的标识符。常量一旦被定义,在脚本的其他任何地方都不能被改变或者重新定义。
// 定义常量 define("CONSTANT_NAME", "Hello world."); // 使用常量 echo CONSTANT_NAME;
- 魔术常量是PHP预定义的特殊常量,它们有特殊的含义,不能被重新定义。常用的魔术常量有:
-
- __LINE__:当前行号
- __FILE__:当前文件名
- __DIR__:当前文件所在的目录
- __FUNCTION__:当前函数名
- __CLASS__:当前类名
- __TRAIT__:当前trait名
- __METHOD__:当前方法名
- __NAMESPACE__:当前命名空间名
- 预定义常量是PHP提供的一些常量,可以直接在代码中使用。常用的预定义常量有:
-
- PHP_VERSION:当前PHP版本号
- PHP_OS:当前操作系统类型
- PHP_EOL:当前系统的换行符
- PHP_INT_MAX:整型的最大值
- PHP_INT_MIN:整型的最小值
- 魔术方法是一种特殊的方法,它们在特定的情况下自动调用。常用的魔术方法有:
-
- __construct():对象被创建时自动调用的方法
- __destruct():对象被销毁时自动调用的方法
- __get():获取一个不存在的属性时自动调用的方法
- __set():设置一个不存在的属性时自动调用的方法
- __call():调用一个不存在的方法时自动调用的方法
- __toString():把对象转换为字符串时自动调用的方法
2.3 运算符
- 算术运算符:
$a = 10; $b = 3; echo $a + $b; // 输出13 echo $a - $b; // 输出7 echo $a * $b; // 输出30 echo $a / $b; // 输出3.3333333333333 echo $a % $b; // 输出1
- 赋值运算符:
$a = 10; $b = 3; $a += $b; // $a = $a + $b; echo $a; // 输出13
- 比较运算符:
$a = 10; $b = 3; var_dump($a > $b); // 输出bool(true) var_dump($a < $b); // 输出bool(false) var_dump($a == $b); // 输出bool(false) var_dump($a != $b); // 输出bool(true)
- 逻辑运算符:
$a = true; $b = false; var_dump($a && $b); // 输出bool(false) var_dump($a || $b); // 输出bool(true) var_dump(!$a); // 输出bool(false)
- 位运算符:
$a = 1; $b = 2; var_dump($a & $b); // 输出int(0) var_dump($a | $b); // 输出int(3) var_dump($a ^ $b); // 输出int(3) var_dump(~$a); // 输出int(-2) var_dump($a << 1); // 输出int(2) var_dump($a >> 1); // 输出int(0)
- 三元运算符:
$a = 10; $b = 3; echo ($a > $b) ? "a大于b" : "a小于等于b"; // 输出a大于b
- 表格:
运算符 |
描述 |
示例 |
+ |
加法 |
$a + $b |
- |
减法 |
$a - $b |
* |
乘法 |
$a * $b |
/ |
除法 |
$a / $b |
% |
取模 |
$a % $b |
2.4 控制结构
- if语句
$a = 10; if ($a > 5) { echo "a大于5"; }
- for循环
for ($i = 0; $i < 10; $i++) { echo $i; }
- foreach循环
$arr = array(1, 2, 3); foreach ($arr as $value) { echo $value; }
- while循环
$i = 0; while ($i < 10) { echo $i; $i++; }
- do-while循环
$i = 0; do { echo $i; $i++; } while ($i < 10);
- switch语句
$a = 1; switch ($a) { case 1: echo "a等于1"; break; case 2: echo "a等于2"; break; default: echo "a不等于1也不等于2"; }
- 三元运算符
$a = 10; $b = $a > 5 ? "a大于5" : "a小于等于5"; echo $b;
- 表格语法
控制结构 |
用法示例 |
if语句 |
if ($a > 5) {
|
for循环 |
for ($i = 0; $i < 10; $i++) {
|
foreach循环 |
$arr = array(1, 2, 3); |
while循环 |
$i = 0; |
do-while循环 |
$i = 0; |
switch语句 |
$a = 1; |
三元运算符 |
$a = 10; |
2.5 函数- 函数
- 示例1:定义一个简单的函数
function sayHello() { echo "Hello World!"; } sayHello(); // 输出 Hello World!
- 示例2:带参数的函数
function sayHelloTo($name) { echo "Hello " . $name . "!"; } sayHelloTo("Alice"); // 输出 Hello Alice!
- 示例3:带默认参数的函数
function sayHelloWithDefault($name = "World") { echo "Hello " . $name . "!"; } sayHelloWithDefault(); // 输出 Hello World! sayHelloWithDefault("Bob"); // 输出 Hello Bob!
- 示例4:返回值的函数
function add($a, $b) { return $a + $b; } $result = add(3, 4); echo $result; // 输出 7
- 示例5:使用可变参数的函数
function sum(...$numbers) { $result = 0; foreach ($numbers as $n) { $result += $n; } return $result; } echo sum(1, 2, 3); // 输出 6 echo sum(1, 2, 3, 4, 5); // 输出 15
3. PHP高级特性
3.1 面向对象编程
- 封装:将数据和操作数据的方法封装在一起,避免外部直接访问和修改数据,提高安全性和可维护性。
<?php class Person { private $name; private $age; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } public function getName() { return $this->name; } public function getAge() { return $this->age; } public function setName($name) { $this->name = $name; } public function setAge($age) { $this->age = $age; } } $person = new Person('Tom', 18); echo $person->getName(); // 输出:Tom echo $person->getAge(); // 输出:18 $person->setName('Jerry'); $person->setAge(20); echo $person->getName(); // 输出:Jerry echo $person->getAge(); // 输出:20
- 继承:子类可以继承父类的属性和方法,并且可以在此基础上进行扩展和修改。
<?php class Animal { protected $name; public function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } public function run() { echo $this->name . ' is running.'; } } class Dog extends Animal { public function bark() { echo $this->name . ' is barking.'; } } $dog = new Dog('旺财'); echo $dog->getName(); // 输出:旺财 $dog->run(); // 输出:旺财 is running. $dog->bark(); // 输出:旺财 is barking.
- 多态:同一种方法在不同的对象上可以有不同的表现形式。
<?php interface Shape { public function area(); } class Rectangle implements Shape { private $width; private $height; public function __construct($width, $height) { $this->width = $width; $this->height = $height; } public function area() { return $this->width * $this->height; } } class Circle implements Shape { private $radius; public function __construct($radius) { $this->radius = $radius; } public function area() { return pi() * $this->radius * $this->radius; } } function printArea(Shape $shape) { echo $shape->area(); } $rectangle = new Rectangle(5, 10); $circle = new Circle(5); printArea($rectangle); // 输出:50 printArea($circle); // 输出:78.539816339745
- 接口:规定了类必须实现哪些方法,但是不需要规定如何实现。
<?php interface Animal { public function eat(); public function sleep(); } class Dog implements Animal { public function eat() { echo 'Dog is eating.'; } public function sleep() { echo 'Dog is sleeping.'; } } class Cat implements Animal { public function eat() { echo 'Cat is eating.'; } public function sleep() { echo 'Cat is sleeping.'; } } $dog = new Dog(); $cat = new Cat(); $dog->eat(); // 输出:Dog is eating. $dog->sleep(); // 输出:Dog is sleeping. $cat->eat(); // 输出:Cat is eating. $cat->sleep(); // 输出:Cat is sleeping.
3.2 异常处理
- 异常处理基本语法
try { // 可能抛出异常的代码 } catch (Exception $e) { // 捕获异常并处理 }
- 自定义异常
class CustomException extends Exception { public function errorMessage() { // 自定义异常处理信息 } }
- 抛出异常
if ($someError) { throw new CustomException('Some error message'); }
- 处理未捕获的异常
set_exception_handler(function($e) { // 处理未捕获的异常 });
- 使用finally语句块
try { // 可能抛出异常的代码 } catch (Exception $e) { // 捕获异常并处理 } finally { // 无论是否有异常都会执行的代码 }
3.3 命名空间
- 命名空间是PHP5引入的一个新特性,用于解决命名冲突的问题。命名空间可以将函数、类、常量等组织在一起,避免与其他同名元素发生冲突。
- 命名空间的声明方式:
namespace MyNamespace;
- 使用命名空间定义的类可以通过完整的命名空间路径进行访问,例如:
$obj = new MyNamespace\MyClass();
- 可以使用use关键字导入命名空间,使得代码更加简洁。例如:
use MyNamespace\MyClass; $obj = new MyClass();
- 命名空间也可以嵌套使用,例如:
namespace MyNamespace\SubNamespace; class MyClass {}
- 使用命名空间的好处是可以更好地组织代码,防止命名冲突,提高代码的可读性和可维护性。
3.4 闭包
- 闭包基本定义和使用示例
$greet = function($name) { printf("Hello %s\r\n", $name); }; $greet('World'); $greet('PHP');
- 闭包使用外部变量示例
function getCounter() { $i = 0; return function() use (&$i) { return ++$i; }; } $counter = getCounter(); echo $counter(); // 输出 1 echo $counter(); // 输出 2 echo $counter(); // 输出 3
- 闭包作为函数参数示例
function add($a, $b, $callback) { $result = $a + $b; $callback($result); } add(1, 2, function($result) { echo $result; // 输出 3 });
3.5 Trait- Trait是PHP5.4引入的一种代码复用机制,类似于Java中的接口和抽象类的结合体,可以在不同的类中复用相同的代码块。
- Trait是一种可重用的代码块,可以被多个类使用,避免了多重继承的问题。
- Trait可以像类一样定义属性和方法,但不能被直接实例化,只能被其他类使用。
- Trait中定义的属性和方法可以被使用它的类中的其他方法调用,就像这些方法是类中的原始定义一样。
- Trait可以使用“as”关键字进行方法重命名和冲突解决。
- Trait可以使用“insteadof”关键字来解决方法冲突,也可以使用“as”关键字来进行方法重命名。
- Trait可以使用“use”关键字来在类中引入Trait,一个类可以引入多个Trait。
- Trait中的方法可以被定义为抽象方法,需要在使用Trait的类中实现。
4. PHP与Web开发
4.1 PHP与HTTP协议
- PHP与HTTP协议PHP作为一种Web开发语言,与HTTP协议密切相关。以下是PHP与HTTP协议相关的一些实例:
-
- 发送HTTP请求并获取响应:
$url = 'http://example.com/api'; $data = array('key1' => 'value1', 'key2' => 'value2'); $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data), ), ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context);
-
- 读取HTTP请求的头部信息:
foreach (getallheaders() as $name => $value) { echo "$name: $value\n"; }
-
- 设置HTTP响应头部信息:
header('Content-Type: application/json'); header('Cache-Control: no-cache, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-
- 重定向HTTP请求:
header('Location: http://example.com/new_page.php'); exit;
-
- 使用HTTP认证:
$username = 'myusername'; $password = 'mypassword'; $context = stream_context_create(array( 'http' => array( 'header' => "Authorization: Basic " . base64_encode("$username:$password") ) )); $result = file_get_contents('http://example.com/api', false, $context);
4.2 PHP与数据库
- PHP与数据库
-
- PHP连接MySQL数据库的例子:
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "连接成功"; ?>
-
- PHP连接MongoDB数据库的例子:
<?php $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $bulk = new MongoDB\Driver\BulkWrite; $doc = ['_id' => new MongoDB\BSON\ObjectID, 'name' => 'John Doe', 'age' => 42]; $_id = $bulk->insert($doc); $manager->executeBulkWrite('testdb.testcoll', $bulk); echo $_id; ?>
-
- PHP连接Redis数据库的例子:
<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->set('test', 'Hello World'); echo $redis->get('test'); ?>
4.3 PHP与Session和Cookie
- Session是指跨请求(request)的数据存储机制,用于在同一个用户的不同请求间共享数据,常用于用户登录状态、购物车等功能的实现。
- Cookie是指在客户端(通常是浏览器)存储数据的机制,可以在请求时将数据发送给服务器,常用于保存用户的偏好设置、语言选择等信息。
- 在PHP中,可以使用$_SESSION和$_COOKIE超全局变量来操作Session和Cookie:
// 设置Session session_start(); $_SESSION['username'] = 'John'; // 获取Session session_start(); echo $_SESSION['username']; // 设置Cookie setcookie('username', 'John', time()+3600); // 获取Cookie echo $_COOKIE['username'];
4.4 PHP与模板引擎- PHP与模板引擎:
- 实例1:使用Smarty模板引擎渲染页面
- 实例2:使用Twig模板引擎渲染页面
- 实例3:使用Blade模板引擎渲染页面
5. PHP的应用
5.1 Web应用开发
- Web应用开发
-
- 利用PHP开发简单的网站
<?php echo "Hello, World!"; ?>
-
- 利用PHP连接MySQL数据库
<?php $servername = "localhost"; $username = "username"; $password = "password"; // 创建连接 $conn = new mysqli($servername, $username, $password); // 检测连接 if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } echo "Connected successfully"; ?>
-
- 利用PHP实现表单提交
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { // 收集表单数据 $name = $_POST["name"]; $email = $_POST["email"]; $message = $_POST["message"]; // 处理表单数据 // ... // 返回结果 echo "Thank you for your message!"; } ?> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> Name: <input type="text" name="name"><br> E-mail: <input type="text" name="email"><br> Message: <textarea name="message"></textarea><br> <input type="submit" name="submit" value="Submit"> </form>
5.2 命令行应用开发
- 使用Symfony Console组件开发命令行应用
- 使用PHP内置的argv和argc全局变量获取命令行参数
- 使用PHP内置的exec函数执行外部命令
- 使用PHP内置的pcntl扩展实现进程控制
- 使用PHP内置的posix扩展实现进程间通信
表格:
命令 |
描述 |
php mycommand.php |
执行自定义命令 |
php mycommand.php -h |
查看帮助信息 |
php mycommand.php -v |
查看版本信息 |
5.3 数据处理和分析
- 数据处理:使用 PHP 处理各种数据类型,包括字符串、数字、数组、对象等等。
- 数据库操作:使用 PHP 连接数据库,进行增删改查等操作。
- 文件操作:使用 PHP 对文件进行读写、上传下载等操作。
- 图像处理:使用 PHP 处理图像,包括缩放、裁剪、水印等操作。
- 表格处理:使用 PHP 处理表格数据,包括导入、导出、排序、筛选等操作。
5.4 游戏开发- 游戏开发
- 实例1:使用PHP开发简单的猜数字游戏
- 实例2:使用PHP和JavaScript开发简单的扫雷游戏
- 实例3:使用PHP和MySQL开发简单的卡牌游戏
6. PHP的发展趋势
6.1 PHP的生态系统
- PHP的生态系统
-
- Composer
-
-
- Composer是PHP的依赖管理器,可以方便地管理项目中所需要的第三方库及其版本。
-
-
- Laravel框架
-
-
- Laravel是一个流行的PHP Web应用程序框架,提供了许多开箱即用的功能,如路由、ORM、模板引擎等。
-
-
- Symfony框架
-
-
- Symfony是另一个流行的PHP框架,也提供了许多组件,如表单、安全性、缓存等。
-
-
- PHPUnit
-
-
- PHPUnit是PHP的一个测试框架,可以方便地编写和运行单元测试。
-
6.2 PHP的框架
- Laravel框架:基于MVC模式,具有良好的文档和社区支持,是目前最流行的PHP框架之一。
- Symfony框架:同样基于MVC模式,具有高度的可定制性和可扩展性,适合大型项目的开发。
- CodeIgniter框架:轻量级框架,易于上手和学习,适合小型项目的开发。
- Yii框架:高性能框架,具有强大的缓存和安全性能,适合大型高并发项目的开发。
- Phalcon框架:C扩展实现的框架,速度极快,适合需要高性能的项目开发。
- CakePHP框架:老牌框架,具有丰富的工具和插件,适合中小型项目的开发。
6.3 PHP的性能优化
- 使用缓存提高性能,如使用Memcached、Redis等内存缓存技术。
- 使用PHP加速器,如Zend OPCache、APC等。
- 优化数据库查询,如使用索引、避免全表扫描等。
- 优化代码逻辑,如减少循环嵌套、避免重复代码等。
- 使用异步编程,如使用Swoole扩展等。
- 使用多线程编程,如使用PCNTL扩展等。
- 使用CDN加速,如使用七牛云、阿里云等CDN服务。
- 使用负载均衡,如使用Nginx、HAProxy等负载均衡软件。
- 使用分布式架构,如使用微服务架构等。
- 使用缓存技术,如使用Redis等缓存技术。
- 使用高性能的Web服务器,如Nginx、Apache等。
- 使用PHP7及以上版本,因为PHP7相比PHP5性能有了很大提升。
6.4 PHP的安全性
- PHP的安全性
-
- 防止SQL注入攻击的方法,例如使用PDO预处理语句和绑定参数。
- 防止跨站脚本攻击(XSS)的方法,例如使用htmlspecialchars()函数对输出进行转义,或使用Content Security Policy(CSP)。
- 防止跨站请求伪造(CSRF)攻击的方法,例如使用随机生成的令牌来验证表单提交。
- 防止文件上传漏洞的方法,例如限制上传文件的类型和大小,以及在服务器端对上传文件进行验证和过滤。
- 使用密码哈希来保护用户密码,例如使用PHP内置的password_hash()和password_verify()函数。
- 使用HTTPS协议来保护数据传输的安全性,例如使用SSL证书和TLS加密。
6.5 PHP的未来发展- PHP 8的发布,包括JIT编译器和其他新功能
- PHP框架的发展,如Laravel、Symfony、Yii等
- PHP在云计算和大数据领域的应用
- PHP在人工智能和机器学习领域的应用
- PHP在物联网和智能家居领域的应用
- PHP与其他语言的集成和互操作性
- PHP的安全性和性能的不断提升
- PHP社区的发展和贡献,如PHP FIG等
表格:
版本 |
发布时间 |
新功能 |
PHP 8 |
2020年11月26日 |
JIT编译器、Union类型、命名参数等 |
PHP 7.4 |
2019年11月28日 |
Typed Properties、Arrow Functions等 |
PHP 7.3 |
2018年12月6日 |
Flexible Heredoc and Nowdoc Syntaxes、JSON_THROW_ON_ERROR等 |