PHP入门指南:进阶篇

PHP入门指南:进阶篇

  • PHP入门指南:进阶篇
    • 1. 面向对象编程(OOP)
      • 1.1 类和对象的基本概念
      • 1.2 构造函数和析构函数
      • 1.3 属性和方法的访问控制
      • 1.4 继承与多态
    • 2. 错误和异常处理
      • 2.1 错误处理机制
      • 2.2 异常处理机制
      • 2.3 自定义异常类
    • 3. PHP中的高级特性
      • 3.1 匿名函数与闭包
      • 3.2 命名空间
      • 3.3 使用Traits
      • 3.4 生成器的使用
    • 4. 数据库交互
      • 4.1 PDO的使用
      • 4.2 预处理语句
      • 4.3 事务处理
    • 5. PHP性能优化
      • 5.1 代码优化技巧
      • 5.2 使用缓存技术
      • 5.3 OpCode缓存
    • 6. 安全编程
      • 6.1 SQL注入防御
      • 6.2 XSS攻击防御
      • 6.3 CSRF防御
    • 7. PHP测试
      • 7.1 单元测试基础
      • 7.2 PHPUnit的使用
      • 7.3 Mock对象和测试替身
    • 8. 案例研究和最佳实践
      • 8.1 MVC设计模式在PHP中的应用
      • 8.2 RESTful API开发
      • 8.3 Composer的使用与依赖管理

PHP入门指南:进阶篇

在掌握了PHP的基础知识之后,本文将指导读者继续学习PHP的进阶内容,深化对PHP编程的理解和应用。文中会结合代码示例,帮助读者更好地理解。在这里插入图片描述


1. 面向对象编程(OOP)

1.1 类和对象的基本概念

PHP作为一门动态语言,其面向对象编程提供了丰富的特性。类和对象是PHP OOP的基础。类是属性和方法的模板,而对象则是这个模板的实例。

class Car {public $color;public function drive() {echo "The car is driving";}
}$myCar = new Car();
$myCar->color = "red";
$myCar->drive();

1.2 构造函数和析构函数

构造函数(__construct())在对象创建时调用,而析构函数(__destruct())在对象销毁时调用。

class Car {public $color;public function __construct($color) {$this->color = $color;echo "The car is ".$this->color;}public function __destruct() {echo "The car is being destroyed";}
}$myCar = new Car("red");

1.3 属性和方法的访问控制

在PHP中,可以通过访问修饰符publicprotectedprivate来控制属性和方法的访问权限。

class Car {private $model;public function setModel($model) {$this->model = $model;}public function getModel() {return $this->model;}
}$myCar = new Car();
$myCar->setModel("Model S");
echo $myCar->getModel();

1.4 继承与多态

PHP支持类的继承,允许子类继承父类的属性和方法。多态是面向对象的一个重要特征,指子类可以根据需要重写父类的方法。

class Vehicle {public function intro() {echo "This is a Vehicle";}
}class Car extends Vehicle {public function intro() {echo "This is a Car";}
}$myCar = new Car();
$myCar->intro();

2. 错误和异常处理

2.1 错误处理机制

PHP提供了多种错误处理机制,如使用error_reporting()set_error_handler()等。妥善处理错误是编写健壮程序的关键。

2.2 异常处理机制

PHP 5以上版本引入了异常处理,使用trycatchthrow来捕获和处理异常。

function divide($dividend, $divisor) {if($divisor == 0) {throw new Exception("Division by zero.");}return $dividend / $divisor;
}try {echo divide(5, 0);
} catch (Exception $e) {echo "Caught exception: ".$e->getMessage();
}

2.3 自定义异常类

你可以通过继承Exception类来创建自定义异常类,以适应特定的错误处理需求。

class DivideByZeroException extends Exception {public function __construct() {parent::__construct("Division by zero is not allowed.");}
}

3. PHP中的高级特性

3.1 匿名函数与闭包

PHP中的匿名函数是没有指定名称的函数。它们通常被用作回调函数的值赋给变量,可以作为参数传递给其他函数。闭包是一种特殊的匿名函数,它可以从父作用域中继承变量。

$greeting = "Hello";$welcome = function($name) use ($greeting) {echo "$greeting, $name!";
};$welcome("World"); // 输出 Hello, World!

3.2 命名空间

命名空间在PHP中用于封装相关的类、接口、函数和常量。它防止不同库之间的代码发生名称冲突,并可作为组织项目代码的手段。通过使用关键字namespace来声明。

namespace MyProject\Math;class Calculator {public static function sum($a, $b) {return $a + $b;}
}echo \MyProject\Math\Calculator::sum(1, 2); // 输出 3

3.3 使用Traits

Traits是PHP的一个语言特性,它允许开发者复用多个类中的方法。Trait类似于一个类,但是它是为了将特定功能在多个类中共用而设计,它不能被直接实例化。

trait Sharable {public function share($content) {echo "Sharing " . $content;}
}class Post {use Sharable;
}$post = new Post();
$post->share("my first post"); // 输出 Sharing my first post

3.4 生成器的使用

生成器(Generator)提供了一种更容易的方法来实现简单对象的迭代,而不需要实现完整的Iterator接口。生成器允许你通过yield关键字一次产生一个值,并在两个值之间保存状态。

function numbersGenerator() {for ($i = 0; $i < 5; ++$i) {yield $i;}
}$gen = numbersGenerator();foreach ($gen as $num) {echo $num, PHP_EOL; // 输出 0 1 2 3 4,每个数字后面跟着一个换行符
}

4. 数据库交互

4.1 PDO的使用

PHP Data Objects (PDO) 是一个数据库访问层,为不同的数据库提供了一个统一的接口。它支持多种数据库,如 MySQL、PostgreSQL、SQLite 和更多。PDO 提供了预处理语句和绑定参数,使数据库交互更安全、简单。

$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
$user = 'username';
$password = 'password';try {$pdo = new PDO($dsn, $user, $password);echo "Connection successful";
} catch (PDOException $e) {echo "Connection failed: " . $e->getMessage();
}

4.2 预处理语句

使用预处理语句能够防止 SQL 注入,并提高数据库操作性能。在使用参数时,使用占位符来编写 SQL 语句,并通过绑定参数的方式提供具体的值。

$sql = 'INSERT INTO users (name, email) VALUES (:name, :email)';
$statement = $pdo->prepare($sql);$statement->bindParam(':name', $name);
$statement->bindParam(':email', $email);$name = 'John Doe';
$email = 'john.doe@example.com';
$statement->execute();

4.3 事务处理

数据库事务可以确保数据的完整性。若一系列操作中有一个失败,则整个事务会回滚,所有的更改会被撤销。

try {$pdo->beginTransaction();$pdo->exec('UPDATE account SET balance = balance - 100 WHERE id = 1');$pdo->exec('UPDATE account SET balance = balance + 100 WHERE id = 2');// 提交事务$pdo->commit();
} catch (Exception $e) {// 若出错,则回滚事务$pdo->rollBack();echo "Transaction failed: " . $e->getMessage();
}

在深入探索数据库交互时,请注意安全性问题,比如使用预处理语句防止 SQL 注入,并在操作中使用事务处理来保证数据的一致性。PDO 为PHP开发者提供了一个强大的工具,可以轻松安全地与数据库交互,无论是进行基本查询还是更复杂的操作。通过这些技巧,你可以确保应用程序的数据访问既高效又安全。

5. PHP性能优化

5.1 代码优化技巧

性能优化是开发中的一个重要方面,而在PHP中优化代码可以显著提升应用的性能。这包括但不限于使用合适的数据结构、避免在循环中进行资源密集型的操作、减少不必要的函数调用和数据库查询,以及合理使用单引号和双引号。

// 使用单引号字符串,当你不需要解析变量时
echo 'Hello, world!';// 减少不必要的函数调用
if (strpos($string, 'something') !== false) {// do something
}// 优化循环
for ($i = 0, $count = count($array); $i < $count; $i++) {// 使用已缓存的$count,避免每次迭代都调用count()
}

5.2 使用缓存技术

将重复且计算成本高的操作结果缓存在内存中,可以显著提高web应用程序的性能。可以使用OPcache、Redis、Memcached等工具来实现缓存,这样能够减少数据库访问次数和计算量。

// 伪代码示范使用Memcached缓存结果
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);$dataKey = 'unique_key_for_data';
$data = $memcached->get($dataKey);if ($data === false) {// 缓存未命中,从数据库获取数据$data = getDataFromDatabase();$memcached->set($dataKey, $data, 60*60); // 缓存1小时
}displayData($data);

5.3 OpCode缓存

OpCode缓存是提高PHP性能的一个关键工具,通过缓存已编译的脚本代码的操作码(OpCode),避免了脚本在每次请求时都要编译。PHP的OPcache扩展是一个典型的OpCode缓存工具,以及APC(Alternative PHP Cache)。

要启用OPcache,请在php.ini文件中添加或更新以下设置:

[opcache]
; 启用OpCache
zend_extension=opcache.so
opcache.enable=1; 设置缓存大小
opcache.memory_consumption=128; 设置缓存的脚本最大数量
opcache.max_accelerated_files=4000

性能优化是一个持续的过程,每个项目根据其独特的情况可能会有不同的最佳做法。除了上述建议之外,持续监控和分析应用程序性能,定期审查和优化代码,以及跟进PHP版本更新带来的改善都是必要的措施。

6. 安全编程

6.1 SQL注入防御

SQL注入是一个严重的安全问题,攻击者可能会注入恶意SQL语句,以窃取或破坏数据库中的数据。防御SQL注入的最有效方式之一是使用预处理语句和绑定变量,确保所有输入都被适当地转义。

// 使用PDO预处理语句防止SQL注入
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email AND password = :password");$stmt->execute(['email' => $email,'password' => $password
]);$user = $stmt->fetch();

6.2 XSS攻击防御

跨站脚本攻击(XSS)允许攻击者将恶意脚本注入网页中其他用户会看到的内容。使用内置的PHP函数如htmlspecialchars()htmlentities()可以防御XSS攻击,确保输出到浏览器的内容是安全的。

echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

6.3 CSRF防御

跨站请求伪造(CSRF)攻击会强迫登录用户在当前已验证的Web应用程序上执行非本意的操作。一个常见的防御方法是使用CSRF令牌,每次提交表单时都需要验证这个令牌。

session_start();// 生成CSRF令牌
if (empty($_SESSION['csrf_token'])) {$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}// 表单中包含CSRF令牌
echo '<input type="hidden" name="csrf_token" value="'.$_SESSION['csrf_token'].'">';// 验证CSRF令牌
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {die('CSRF token mismatch');
}

7. PHP测试

7.1 单元测试基础

单元测试是确保代码质量的重要环节,它允许开发者针对代码库中的最小可测试部分(单元)进行验证。PHPUnit 是PHP中一个流行的单元测试框架,它提供了一个全面的单元测试解决方案。

// 安装PHPUnit使用Composer
composer require --dev phpunit/phpunit ^9// 一个简单的单元测试例子
use PHPUnit\Framework\TestCase;class SampleTest extends TestCase {public function testTrueAssertsToTrue() {$this->assertTrue(true);}
}

7.2 PHPUnit的使用

PHPUnit允许运行自动化测试,确保应用组件按预期工作。测试用例内的每个方法都是一个测试,PHPUnit 提供了丰富的断言方法来检查代码行为。

// ExampleTest.php
use PHPUnit\Framework\TestCase;class ExampleTest extends TestCase {public function testAddition() {$this->assertEquals(2, 1 + 1, "1+1 should equal 2");}// 测试预期异常public function testException() {$this->expectException(InvalidArgumentException::class);throw new InvalidArgumentException();}
}// 运行测试
./vendor/bin/phpunit ExampleTest

7.3 Mock对象和测试替身

在单元测试中,你经常需要模拟对象来模仿真实对象的行为。PHPUnit 提供了强大的mock和stub机制来创建测试替身,这可以避免对数据库或其他服务的实际调用。

use PHPUnit\Framework\TestCase;class SomeClassTest extends TestCase {public function testFunctionUsesDependency() {$mock = $this->createMock(SomeDependencyClass::class);$mock->method('functionToMock')->willReturn('specific value');$someClass = new SomeClass($mock);$result = $someClass->functionUsingDependency();$this->assertSame('specific value', $result);}
}

8. 案例研究和最佳实践

8.1 MVC设计模式在PHP中的应用

模型-视图-控制器(MVC)是一种常见的设计模式,用于组织代码,以提高可管理性和可扩展性。在PHP中实现MVC可以帮助将数据模型、用户界面和用户输入逻辑分离,使代码更容易维护。

// models/User.php
class User {protected $name;public function getName() {return $this->name;}public function setName($name) {$this->name = $name;}
}// views/userView.php
?>
<h1>Welcome, <?= $user->getName() ?></h1>
<?php// controllers/UserController.php
class UserController {protected $userModel;public function __construct(User $user) {$this->userModel = $user;}public function hello() {$this->userModel->setName('John');require 'views/userView.php';}
}// 一般用路由器调度不同的控制器方法
$userController = new UserController(new User());
$userController->hello();

8.2 RESTful API开发

代表性状态传递(REST)是一种软件架构风格,用于创建可扩展的web服务。PHP作为服务端语言,天然适合开发RESTful API。它可以通过HTTP方法(如GET、POST、PUT、DELETE等)来响应客户端的请求。

// GET /users 返回所有用户
// POST /users 创建新用户
// GET /users/1 返回ID为1的用户
// PUT /users/1 更新ID为1的用户
// DELETE /users/1 删除ID为1的用户

8.3 Composer的使用与依赖管理

Composer是PHP的一个依赖管理工具,它允许你声明项目所需的依赖库,并将它们一起安装。通过使用Composer,你可以轻松管理PHP项目的第三方库,保持项目的依赖关系清晰和最新。

# Composer基本命令
composer init # 初始化一个新的Composer项目
composer require # 添加一个新的库到你的项目
composer update # 更新项目依赖到最新版本
composer install # 安装所有的项目依赖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop搭建(完全分布式)

节点分布&#xff1a; bigdata-masterbigdata-slave1bigdata-salve2 NameNode NodeManager NodeManager SecondaryNameNodeDataNodeDataNodeResourceManagerNodeManagerDataNode 目录 一、jdk安装&#xff1a; 二、hadoop安装 一、jdk安装&#xff1a; jdk-8u212链接&am…

信息隐藏研究新动向

信息隐藏有三十年的研究历史&#xff0c;在隐写、数字水印、可逆数据隐藏等方面&#xff0c;国内外发展了一系列新技术与新方法。随着深度学习时代的来临&#xff0c;信息隐藏研究出现了新的变化。一方面&#xff0c;深度学习技术在信息隐藏的发展中发挥了重要作用&#xff1b;…

94.网游逆向分析与插件开发-游戏窗口化助手-地图数据获取的逆向分析与C++代码还原

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级经验数据获取的逆向分析 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;c4351a5b346d8953a1a8e3ec…

SpringCloud-Eureka原理分析

Eureka是Netflix开源的一款用于实现服务注册与发现的工具。在微服务架构中&#xff0c;服务的动态注册和发现是必不可少的组成部分&#xff0c;而Eureka正是为了解决这一问题而诞生的。 一、为何需要Eureka 在微服务架构中&#xff0c;服务之间的协同合作和高效通信是至关重要…

CentOS下安装vlc

一、引言 vlc是一跨多媒体播放器&#xff0c;可以播放本地媒体文件和网络串流&#xff0c;帮助我们排查音视频开发过程中遇到的问题。大部分情况下&#xff0c;我们只需要在Windows系统下安装vlc就可以了。但有一种情况是需要在Linux下安装vlc的&#xff1a;我们的音视频拉流软…

华为配置内部人员接入WLAN网络示例(802.1X认证)

配置内部人员接入WLAN网络示例&#xff08;802.1X认证&#xff09; 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 用户接入WLAN网络&#xff0c;使用802.1X客户端进行认证&#xff0c;输入正确的用户名和密…

Day10案例演示

Day10案例演示 在 AppInfoScanner所在的文件中运行cmd&#xff0c;输入 python -m pip install -r requirements.txt安装环境 具体用法可移步&#xff1a;https://github.com/kelvinBen/AppInfoScanner 以下仅以android类型示范 python app.py android -i <Your apk fil…

【Git版本控制 02】分支管理

目录 一、创建分支 二、切换分支 三、合并分支 四、删除分支 五、合并冲突 六、分支策略 七、bug分支 一、创建分支 # 当前仓库只有 master 一个主分支 # 可通过 git branch 是进行分支管理的命令&#xff0c;可通过不同参数对分支进行查看、创建、删除(base) [rootloc…

第一个 Angular 项目 - 静态页面

第一个 Angular 项目 - 静态页面 之前的笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 这是在学完了上面这三个内容后能够完成的项目&#xff0c;目前因为还没有学到数…

Asp .Net Core 系列:Asp .Net Core 集成 Panda.DynamicWebApi

文章目录 简介Asp .Net Core 集成 Panda.DynamicWebApi配置原理什么是POCO Controller&#xff1f;POCO控制器原理ControllerFeatureProvider实现自定义判断规则IApplicationModelConventionPanda.DynamicWebApi中的实现ConfigureApiExplorer()ConfigureSelector()ConfigurePar…

S7-1200PLC通讯问题总结

文章目录 一、硬件1.串口通信RS232RS485RS422 2.网口通信 二、协议1.串口通信协议2.网口通信协议 三、程序编写1.S7通信PUTGET 2.开放式以太网通信 一、硬件 可分为PLC与PLC通信&#xff0c;PLC与上位机通信&#xff0c;PLC与变频器通信&#xff0c;PLC与仪器仪表通信&#xf…

兼容ARM 32位架构的edgeConnector产品为用户提供新的部署选项

Softing工业将ARM 32位兼容性集成到了edgeConnector产品中&#xff0c;以满足用户对ARM处理器的边缘设备日益增长的使用需求。 &#xff08;兼容ARM 32位架构的edgeConnector产品扩展了其应用部署范围&#xff09; 用户对采用ARM处理器的紧凑型边缘设备的需求正在大幅增长&…

使用 Docker 镜像预热提升容器启动效率详解

概要 在容器化部署中,Docker 镜像的加载速度直接影响到服务的启动时间和扩展效率。本文将深入探讨 Docker 镜像预热的概念、必要性以及实现方法。通过详细的操作示例和实践建议,读者将了解如何有效地实现镜像预热,以加快容器启动速度,提高服务的响应能力。 Docker 镜像预热…

使用influxdb+Grafana+nmon2influxdb+nmon实时监控vps性能

Grafana可以用来实时查看linux系统的各种性能数据。 1、安装环境&#xff1a; centos 7influxdb1.7.6grafana-4.6.3-1nmon2influxdb-2.1.7nmon-16m 2、安装influxdb&#xff1a; 下载rpm包&#xff1a; influxdb官网&#xff1a;https://docs.influxdata.com/influxdb/v2.0…

【Git版本控制 01】基本操作

目录 一、初始配置 二、添加文件 三、查看日志 四、修改文件 五、版本回退 六、撤销修改 七、删除文件 一、初始配置 Git版本控制器&#xff1a;记录每次的修改以及版本迭代的一个管理系统。 # 初始化本地仓库&#xff1a;git init(base) [rootlocalhost gitcode]# gi…

NLP_语言模型的雏形 N-Gram 模型

文章目录 N-Gram 模型1.将给定的文本分割成连续的N个词的组合(N-Gram)2.统计每个N-Gram在文本中出现的次数&#xff0c;也就是词频3.为了得到一个词在给定上下文中出现的概率&#xff0c;我们可以利用条件概率公式计算。具体来讲&#xff0c;就是计算给定前N-1个词时&#xff0…

笔记---dp---数字三角形模型

所谓数字三角形模型&#xff0c;即是从数字三角形这一题衍生出来的 题目为经典题目&#xff0c;不再赘述&#xff0c;此笔记根据AcWing算法提高课来进行对数字三角形模型衍生例题的记录 题目关系如下&#xff08;见AcWing里的AcSaber&#xff09;&#xff1a; AcWing.1015.摘…

微信小程序(三十八)滚动容器

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.滚动触底事件 2.下拉刷新事件 源码&#xff1a; index.wxml <view class"Area"> <!-- scroll-y 垂直滚动refresher-enabled 允许刷新bindrefresherrefresh 绑定刷新作用函数bindscrollto…

单片机无线发射的原理剖析

目录 一、EV1527编码格式 二、OOK&ASK的简单了解 三、433MHZ 四、单片机的地址ID 五、基于STC15W104单片机实现无线通信 无线发射主要运用到了三个知识点&#xff1a;EV1527格式&#xff1b;OOk&#xff1b;433MHZ。下面我们来分别阐述&#xff1a; EV1527是数据的编…

网神 SecGate 3600 防火墙 route_ispinfo_import_save 文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…