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 # 安装所有的项目依赖

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费ai绘画软件选择哪个?

对于免费AI绘画软件的选择&#xff0c;因为每个软件都有其独特的优点和适用场景&#xff0c;可以根据个人的需求和技能水平来决定。以下是被广泛认可的AI绘画软件&#xff1a; 1、建e网AI-一款为建筑室内设计师提供AI绘图的智能工具&#xff0c;具有文字生图&#xff0c;方案优…

Pytroch 自写训练模板适合入门版 包含十五种经典的自己复现的一维模型 1D CNN

训练模板 在毕业之前&#xff0c;决定整理一下手头的代码&#xff0c;自己做1D-CNN这吗久&#xff0c;打算开源一下自己使用的1D-CNN的代码&#xff0c;包括用随机数生成一个模拟的数据集&#xff0c;到自己写的一个比较好的适合入门的基础训练模板&#xff0c;以及自己复现的…

松软香甜的贝果面包,碱水清香可口饱腹

最近尝试了一款碱趣贝果面包&#xff0c;是手工制作的美味面包&#xff0c;它非常蓬松&#xff0c;口感熟软&#xff0c;而且食用方便快捷&#xff0c;只需加热一下就可以食用。 这款面包的表皮清香有韧性&#xff0c;里面松软可口&#xff0c;加热后散发出清新的香气&#xff…

负载均衡下webshell连接

目录 一、什么是负载均衡 分类 负载均衡算法 分类介绍 分类 均衡技术 主要应用 安装docker-compose 2.1上传的文件丢失 2.2 命令执行时的漂移 2.3 大工具投放失败 2.4 内网穿透工具失效 3.一些解决方案 总结 一、什么是负载均衡 负载均衡&#xff08;Load Balanc…

51单片机编程应用(C语言):矩阵键盘

16个按键只要8个I/O口&#xff0c;本来16个按键要16个I/O口。 矩阵键盘可以按行扫描也可以按列扫描&#xff0c;扫描原理很简单&#xff0c;变成之前的独立按键&#xff0c;比如 按行扫描&#xff0c;看原理图如下&#xff0c;我们P170,另外三个置1&#xff0c;那么第一行就选…

手写RPC框架

RPC框架核心组件 对于RPC框架简洁模式下&#xff0c;主要有以下角色&#xff0c;暂且抛开心跳机制以及负载均衡等复杂策略&#xff0c;我们先来自己实现一个RPC框架&#xff0c;后面我们再深入理解。 注册中心 RegisterServiceVo package com.cover.rpc.remote.vo;import …

J6 - ResNeXt50模型的实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境代码在之前的章节都有&#xff0c;我后续只贴出模型设计构建过程如下打印模型结构打印参数量 训练过程与结果总结 环境 系统: L…

聊聊并发编程,另送5本Golang并发编程新书

大家好&#xff0c;我是飞哥&#xff01; 并发编程并不是一个新话题&#xff0c;但是我觉得在近几年以及未来的时间里&#xff0c;并发编程将显得越来越重要。 为什么这样讲&#xff0c;让我们先回到一个基本的问题上来&#xff0c;为什么我们要采用并发编程&#xff1f;关于这…

数据分析基础之《pandas(2)—基本数据操作》

一、读取一个真实的股票数据 1、读取数据 # 基本数据操作 data pd.read_csv("./stock_day.csv")data# 删除一些列&#xff0c;使数据简洁点 data data.drop([ma5,ma10,ma20,v_ma5,v_ma10,v_ma20], axis1)data 二、索引操作 1、numpy当中我们已经讲过使用索引选取…

Unity 读取指定目录所占内存大小

public static class TxxTool{#region 读取文件大小private static List<string> DirList new List<string>();public static long GetFileSize(string path){DirList new List<string>();DirList.Add(path);GetAllDirecotries(path);long fileSize 0;for…

蓝桥杯省赛无忧 课件87 01tire

01 算法概述 02 问题引入 03 算法分析 04 例题

ReactNative实现的横向滑动条

OK,我们先看下效果图 注意使用到了两个库 1.react-native-linear-gradient 2.react-native-gesture-handler ok,我们看下面的代码 import {Image, TouchableWithoutFeedback, StyleSheet, View} from react-native; import LinearGradient from react-native-linear-grad…

开源软件:技术创新与应用的推动力量

文章目录 每日一句正能量前言开源软件如何推动技术创新开源软件的历史开源软件的开发模式开源软件与闭源软件源代码和开发许可维护特点、支持和成本开源软件的优势减少开支可定制性快速创新发展透明度和安全性 开源软件的应用 常见问题后记 每日一句正能量 不好等待运气降临&am…

vue3-自定义指令

自定义指令 vue 除了内置的制指令&#xff08;v-model v-show 等&#xff09;之外&#xff0c;还允许我们注册自定义的指令。 vue 复用代码的方式&#xff1a; 组件&#xff1a;主要是构建模块。 组合式函数&#xff1a;侧重有状态的逻辑。 自定义指令&#xff1a;主要是为…

大模型ReAct提示工程详解【2023】

普林斯顿大学的教授和谷歌的研究人员最近发表了一篇论文&#xff0c;描述了一种新颖的提示工程方法&#xff0c;该方法使大型语言模型&#xff08;例如 ChatGPT&#xff09;能够在模拟环境中智能地推理和行动。 这种 ReAct 方法模仿了人类在现实世界中的运作方式&#xff0c;即…

欧洲的编程语言三巨头,只剩下一位了!

能把三位大牛的名字都叫出来的人恐怕不多吧&#xff1a; 这三位都是图灵奖获得者&#xff0c;他们的名字和发明散布在各种教科书中&#xff0c;从左到右&#xff0c;依次是&#xff1a; 尼克劳斯沃斯 (Niklaus Wirth) 瑞士人&#xff0c;一生发明了8种编程语言&#xff0c;其中…

CTF赛三层内网渗透

CTF赛三层内网渗透 前言 2019某CTF线下赛真题内网结合WEB攻防题库&#xff0c;涉及WEB攻击&#xff0c;内网代理路由等技术&#xff0c;每台服务器存在Flag&#xff0c;获取一个Flag对应一个积分&#xff0c;获取三个Flag结束。 第一关 Taget1_centos7 1、访问目标网页 发现…

AIGC 为何能火爆全网,赋能智能时代?

Hi&#xff0c;大家好&#xff0c;我是半亩花海。2023年&#xff0c;人工智能新浪潮涌起&#xff0c;AIGC 火爆全网&#xff0c;不断赋能各大行业。从短视频平台上火爆的“AI 绘画”&#xff0c;到智能聊天软件 ChatGPT&#xff0c;都引起了大家的广泛关注。那么 AIGC 到底是什…

浙政钉访接口:k8s+slb容器日志报错(:Temporary failure in name resolution。)

在此我只能说兄弟&#xff0c;浙政钉的扫码接口和用户详情返回这两个接口是不需要白名单的&#xff0c; 我们文明人先确定一件事就是&#xff0c;你代码本地能调用到浙政钉返回。ecs服务器curl浙政钉也通的&#xff1a; 这时候和你说要开通白名单的&#xff0c;请放开你的道德…

r0下进程保护

简介 SSDT 的全称是 System Services Descriptor Table&#xff0c;系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表&#xff0c;它还包含着一些其它有用的信息&#xff0c;诸如地址索引的基地…