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://xiahunao.cn/news/2774602.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【GAMES101】Lecture 19 相机

目录 相机 视场 Field of View (FOV) 曝光&#xff08;Exposure&#xff09; 感光度&#xff08;ISO&#xff09; 光圈 快门 相机 成像可以通过我们之前学过的光栅化成像和光线追踪成像来渲染合成&#xff0c;也可以用相机拍摄成像 今天就来学习一下相机是如何成像的…

NeRF从入门到放弃1:原理介绍

基本概念 原始的论文中所介绍的NeRF&#xff08;NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis&#xff0c;用神经辐射场表示场景进行视角合成&#xff09;&#xff0c;是神经辐射场以及体积渲染技术的结合&#xff0c;即用神经辐射场隐式地表示场…

代码随想录算法训练营第29天|491.递增子序列 * * 46.全排列 * 47.全排列 II

文章目录 491.递增子序列思路&#xff1a;代码 思路&#xff1a;优化代码&#xff1a; 46.全排列思路代码一&#xff1a;使用used数组代码二&#xff1a;使用path判断元素 47.全排列 II思路一&#xff1a;层节点和路径都是用used数组做记录思路二&#xff1a;层通过排序后是否重…

【第二届 Runway短视频创作大赛】——截至日期2024年03月01日

短视频创作大赛 关于AI Fil&#xff4d; Festival竞赛概况参加资格报名期间报名方法 提交要求奖品附录 关于AI Fil&#xff4d; Festival 2022年成立的AIFF是一个融合了最新AI技术于电影制作中的艺术和艺术家节日&#xff0c;让我们得以一窥新创意时代的风采。从众多参赛作品中…

C语言笔试题之实现C库函数 strstr()(设置标志位)

实例要求&#xff1a; 1、请你实现C库函数strstr()&#xff08;stdio.h & string.h&#xff09;&#xff0c;请在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;&#xff1b;2、函数声明&#xff1a;int strStr(char* h…

MATLAB知识点:易错点:判断浮点数是否相等

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章 3.4.3 关系运算 下面我们再来看一个易错点&…

flask+pyinstaller实现mock接口,并打包到exe运行使用postman验证

flask代码 from flask import Flask, request, jsonifyapp Flask(__name__)app.route("/login", methods[POST]) def login():username request.json.get("username").strip() # 用户名password request.json.get("password").strip() # 密…

林浩然的趣味解读:赫伯特·亚历山大·西蒙的跨界智慧与伟大成就

林浩然的趣味解读&#xff1a;赫伯特亚历山大西蒙的跨界智慧与伟大成就 Lin Haoran’s Amusing Interpretation: Herbert Alexander Simon’s Interdisciplinary Wisdom and Great Achievements 林浩然&#xff0c;这位机智幽默且对知识充满好奇的探索者&#xff0c;最近在一次…

代码随想录算法训练营第二十四天 |回溯算法基础知识,77.组合(已补充)

回溯算法理论基础&#xff08;已观看&#xff09; 带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili #题目分类 什么是回溯法 溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 在二叉树系列中&#xff0c;我们已经不…

2022年通信工程师初级 实务 真题

文章目录 三、第3章 接入网&#xff0c;接入网的功能结构&#xff0c;无线频段及技术四、第4章 互联网&#xff0c;网络操作系统的功能&#xff0c;IP地址五、第6章 移动通信系统&#xff0c;FDD、TDD 三、第3章 接入网&#xff0c;接入网的功能结构&#xff0c;无线频段及技术…

numa网卡绑定

#概念 参考&#xff1a;https://www.jianshu.com/p/0f3b39a125eb(opens new window) chip&#xff1a;芯片&#xff0c;一个cpu芯片上可以包含多个cpu core&#xff0c;比如四核&#xff0c;表示一个chip里4个core。 socket&#xff1a;芯片插槽&#xff0c;颗&#xff0c;跟…

【Spring Boot】第二篇 自动装配原来就这么简单

导航 一. 什么是自动装配?二. 如何实现自动装配?1. 配置清单在哪里?2. 自动装配实现核心点1: 从META‐INF/spring.factories路径读取配置类清单核心点2: 过滤第一次过滤: 根据EnableAutoConfiguration注解中exclude和excludeName属性第二次过滤: 通过AutoConfigurationImpor…

Java实现网上药店系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药品档案模块2.4 药品订单模块2.5 药品收藏模块2.6 药品资讯模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 药品表3.2.3 药品订单表3.2.4 药品收藏表3.2.5 药品留言表…

【集合系列】LinkedHashMap 集合

LinkedHashMap集合 1. 概述2. 方法3. 遍历方式4. 代码示例5. 注意事项 其他集合类 祖父类 Map 父类 HashMap 集合类的遍历方式 具体信息请查看 API 帮助文档 1. 概述 LinkedHashMap 是 Java 中的一种特殊类型的 HashMap&#xff0c;它继承自 HashMap 类&#xff0c;并实现了…

免费:阿里云学生服务器领取申请(2024新版教程)

2024年阿里云学生服务器免费领取&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之前&#xff0c;完成实验与认证任务&#xff0c;还可以免费续费6个月&#xff0c;阿里云百科aliyunbaike…

2023爱分析·大模型厂商全景报告|爱分析报告

01 研究范围定义 研究范围 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成大量不同下游任务的模型。2023年以来&#xff0c;ChatGPT引爆全球大模型市场。国内众多大模型先后公测&#xff0c;众多互联网领军者投身大模型事业&#xff0c;使得大模型市场进入“百团…

Redis篇之过期淘汰策略

一、数据的过期策略 1.什么是过期策略 Redis对数据设置数据的有效时间&#xff0c;数据过期以后&#xff0c;就需要将数据从内存中删除掉。可以按照不同的规则进行删除&#xff0c;这种删除规则就被称之为数据的删除策略&#xff08;数据过期策略&#xff09;。 2.过期策略-惰…

【C语言自定义类型详解进阶】结构体(补充结构体的对齐和位段,一口气看完系列,央妈都点赞的博文)

目录 1.结构体 1.1 结构的基础知识 1.2 结构的声明 1.2.1特殊的声明&#xff08;匿名结构体类型&#xff09; 1.3结构体变量的定义 1.4关于匿名结构体类型的补充 1.5结构体的自引用 1.6结构体变量的初始化 2.结构体内存对齐&#xff08;重点&#xff09; 2.1偏移量补…

Redis篇之缓存雪崩

一、什么的缓存雪崩 缓存雪崩&#xff1a;在同一时间段大量的缓存key同时失效或者redis服务宕机&#xff0c;导致大量请求到达数据库给数据库带来巨大压力&#xff0c;可能导致数据库崩了。 二、应该怎么解决 1.给不同的Key的TTL添加随机值 2.利用Redis集群提高服务的可用性 3…

【人工智能】人工智能 – 引领未来科技的潮流

写在前面 引言红利挑战结论 引言 人工智能是指使计算机系统表现出类似于人类智能的能力。其目标是实现机器具备感知、理解、学习、推理和决策等智能行为。人工智能的发展可以追溯到上世纪50年代&#xff0c;随着计算机技术和算法的不断进步&#xff0c;人工智能得以实现。 今天…