目录
JWT标头
JWT的有效负载
JWT的签名
先决条件
登录表单
使用JWT
验证JWT
我们可以在PHP中使用JWT吗?
PHP中的JWT身份验证是什么?
PHP中JWT的替代方案是什么?
如何使用JWT保护PHP API?
首页 后端开发 php教程 JWT(JSON Web令牌)的PHP授权

JWT(JSON Web令牌)的PHP授权

Feb 08, 2025 am 09:57 AM

PHP Authorization with JWT (JSON Web Tokens)

应用程序身份验证曾经只依赖于用户名/邮箱和密码等凭据,会话用于维护用户状态直至用户注销。之后,我们开始使用身份验证API。最近,JSON Web Tokens (JWT) 越来越多地用于对服务器请求进行身份验证。

本文将介绍JWT是什么以及如何使用PHP进行基于JWT的用户请求身份验证。

要点

  1. 身份验证方法的演变: 本文概述了用户身份验证方法的演变,从传统的会话到使用JSON Web Tokens (JWT),突出了向更安全、更高效的Web应用程序用户身份验证和会话管理方式的转变。
  2. JWT的优势和应用: 本文解释了JWT相对于其他身份验证方法的优势,例如存储信息和元数据的能力、与OAUTH2的兼容性以及过期控制的提供,说明了JWT如何增强用户身份验证过程的安全性与灵活性。
  3. PHP中的实际应用: 本文提供了在基于PHP的应用程序中实现JWT的综合指南,涵盖了JWT的生成、使用和验证。其中包括详细的代码示例和解释,为读者提供了一个在自己的Web项目中集成基于JWT的身份验证的清晰路线图。

JWT与会话

首先,为什么会话不是那么好呢?主要有三个原因:

  • 数据以明文形式存储在服务器上。即使数据通常不存储在公共文件夹中,任何拥有足够服务器访问权限的人都可以读取会话文件的内容。
  • 它们涉及文件系统读/写请求。每次会话启动或其数据被修改时,服务器都需要更新会话文件。每次应用程序发送会话cookie时也是如此。如果用户数量很多,最终可能会导致服务器速度变慢,除非您使用备用的会话存储选项,例如Memcached和Redis。
  • 分布式/集群式应用程序。由于会话文件默认存储在文件系统上,因此很难为高可用性应用程序(需要使用负载均衡器和集群服务器等技术)构建分布式或集群式基础架构。必须实现其他存储介质和特殊配置,并且必须充分了解其含义。

JWT

现在,让我们开始学习JWT。JSON Web Token规范(RFC 7519)于2010年12月28日首次发布,最近一次更新是在2015年5月。

JWT比API密钥具有许多优势,包括:

  • API密钥是随机字符串,而JWT包含信息和元数据。这些信息和元数据可以描述各种内容,例如用户的身份、授权数据以及令牌在时间范围或相对于域的有效性。
  • JWT不需要集中的颁发或撤销机构。
  • JWT与OAUTH2兼容。
  • JWT数据可以被检查。
  • JWT具有过期控制。
  • JWT适用于空间受限的环境,例如HTTP Authorization标头。
  • 数据以JavaScript对象表示法(JSON)格式传输。
  • JWT使用Base64url编码表示。

JWT长什么样?

这是一个JWT示例:

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
登录后复制
登录后复制
登录后复制
登录后复制

乍一看,这个字符串似乎只是用句点或点字符连接的随机字符组。因此,它似乎与API密钥没有什么不同。但是,如果您仔细观察,就会发现有三个单独的字符串。

JWT标头

第一个字符串是JWT标头。它是一个Base64 URL编码的JSON字符串。它指定了用于生成签名的加密算法以及令牌的类型,该类型始终设置为JWT。该算法可以是对称的或非对称的。

对称算法使用单个密钥来创建和验证令牌。该密钥在JWT的创建者和使用者之间共享。务必确保只有创建者和使用者知道密钥。否则,任何人都可以创建有效的令牌。

非对称算法使用私钥来签署令牌,并使用公钥来验证令牌。当共享密钥不切实际或其他方只需要验证令牌的完整性时,应使用这些算法。

JWT的有效负载

第二个字符串是JWT的有效负载。它也是一个Base64 URL编码的JSON字符串。它包含一些标准字段,称为“声明”。声明有三种类型:注册的公共的私有的

注册的声明是预定义的。您可以在JWT的RFC中找到它们的列表。以下是一些常用的声明:

  • iat:令牌颁发的日期时间戳。
  • key:一个唯一的字符串,可用于验证令牌,但这与没有集中的颁发者机构相悖。
  • iss:包含颁发者名称或标识符的字符串。可以是域名,可用于丢弃来自其他应用程序的令牌。
  • nbf:令牌应开始被视为有效的日期时间戳。应等于或大于iat。
  • exp:令牌应停止有效的日期时间戳。应大于iat和nbf。

您可以根据需要定义公共声明。但是,它们不能与注册的声明或已存在的公共声明的声明相同。您可以随意创建私有声明。它们仅供双方使用:生产者和消费者。

JWT的签名

JWT的签名是一种加密机制,旨在使用对令牌内容唯一的数字签名来保护JWT的数据。签名确保JWT的完整性,以便使用者可以验证它没有被恶意行为者篡改。

JWT的签名是三件事的组合:

  • JWT的标头
  • JWT的有效负载
  • 一个秘密值

这三者使用JWT标头中指定的算法进行数字签名(未加密)。如果我们解码上面的示例,我们将得到以下JSON字符串:

JWT的标头

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
登录后复制
登录后复制
登录后复制
登录后复制

JWT的数据

<code>{
    "alg": "HS256",
    "typ": "JWT"
}</code>
登录后复制
登录后复制
登录后复制

您可以自己尝试jwt.io,在那里您可以尝试编码和解码您自己的JWT。

在基于PHP的应用程序中使用JWT

既然您已经了解了JWT是什么,那么现在是时候学习如何在PHP应用程序中使用它们了。在深入研究之前,您可以随意克隆本文的代码,或者按照我们的步骤进行操作。

您可以采用多种方法来集成JWT,但以下是我们将要采用的方法。

除登录和注销页面外,对应用程序的所有请求都需要通过JWT进行身份验证。如果用户在没有JWT的情况下发出请求,他们将被重定向到登录页面。

用户填写并提交登录表单后,表单将通过JavaScript提交到我们应用程序中的登录端点authenticate.php。然后,端点将从请求中提取凭据(用户名和密码),并检查它们是否有效。

如果有效,它将生成一个JWT并将其发送回客户端。当客户端收到JWT时,它将存储JWT并将其用于对应用程序的未来每次请求。

对于一个简单的场景,用户只能请求一个资源——一个恰当命名的PHP文件resource.php。它不会做太多事情,只是返回一个包含请求时当前时间戳的字符串。

在发出请求时,可以使用多种方法来使用JWT。在我们的应用程序中,JWT将发送在Bearer授权标头中。

如果您不熟悉Bearer Authorization,它是一种HTTP身份验证形式,其中令牌(例如JWT)发送在请求标头中。服务器可以检查令牌并确定是否应授予令牌的“持有者”访问权限。

这是一个标头的示例:

<code>{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}</code>
登录后复制
登录后复制
登录后复制

对于我们的应用程序收到的每个请求,PHP都将尝试从Bearer标头中提取令牌。如果存在,则对其进行验证。如果有效,用户将看到该请求的正常响应。但是,如果JWT无效,则不允许用户访问资源。

请注意,JWT并非旨在替代会话cookie。

先决条件

首先,我们需要在我们的系统上安装PHP和Composer。

在项目的根目录中,运行composer install。这将引入Firebase PHP-JWT,这是一个简化JWT操作的第三方库,以及用于简化应用程序中对配置数据访问的laminas-config。

登录表单

图片

安装库后,让我们逐步完成authenticate.php中的登录代码。我们首先进行通常的设置,确保Composer生成的自动加载器可用。

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
登录后复制
登录后复制
登录后复制
登录后复制

收到表单提交后,凭据将针对数据库或其他一些数据存储进行验证。出于本示例的目的,我们将假设它们有效,并将$hasValidCredentials设置为true。

<code>{
    "alg": "HS256",
    "typ": "JWT"
}</code>
登录后复制
登录后复制
登录后复制

接下来,我们初始化一组变量,用于生成JWT。请记住,由于JWT可以在客户端进行检查,因此不要在其中包含任何敏感信息。

另一件值得指出的是,$secretKey不会像这样初始化。您可能会在环境中设置它并提取它,使用phpdotenv等库,或在配置文件中设置它。在本例中,我避免这样做,因为我想关注JWT代码。

切勿泄露它或将其存储在版本控制下!

<code>{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}</code>
登录后复制
登录后复制
登录后复制

准备好有效负载数据后,我们接下来使用php-jwt的静态encode方法来创建JWT。

该方法:

  • 将数组转换为JSON
  • 生成标头
  • 签署有效负载
  • 编码最终字符串

它接受三个参数:

  • 有效负载信息
  • 密钥
  • 用于签署令牌的算法

通过对函数结果调用echo,返回生成的令牌:

<code>Authorization: Bearer ab0dde18155a43ee83edba4a4542b973</code>
登录后复制

使用JWT

图片

现在客户端有了令牌,您可以使用JavaScript或您喜欢的任何机制来存储它。以下是如何使用原生JavaScript进行操作的示例。在index.html中,成功提交表单后,收到的JWT将存储在内存中,登录表单将被隐藏,并且将显示请求时间戳的按钮:

<?php
declare(strict_types=1);

use Firebase\JWT\JWT;

require_once('../vendor/autoload.php');
登录后复制

使用JWT

单击“获取当前时间戳”按钮时,将向resource.php发出GET请求,该请求在Authorization标头中设置身份验证后收到的JWT。

<?php
// 从请求中提取凭据

if ($hasValidCredentials) {
登录后复制

当我们单击按钮时,将发出类似于以下内容的请求:

$secretKey  = 'bGS6lzFqvvSQ8ALbOxatm7/Vk7mLQyzqaS34Q4oR1ew=';
$issuedAt   = new DateTimeImmutable();
$expire     = $issuedAt->modify('+6 minutes')->getTimestamp();      // 添加60秒
$serverName = "your.domain.name";
$username   = "username";                                           // 从过滤后的POST数据中检索

$data = [
    'iat'  => $issuedAt->getTimestamp(),         // 颁发时间:生成令牌的时间
    'iss'  => $serverName,                       // 颁发者
    'nbf'  => $issuedAt->getTimestamp(),         // 不早于
    'exp'  => $expire,                           // 过期
    'userName' => $username,                     // 用户名
];
登录后复制

假设JWT有效,我们将看到资源,之后响应将写入控制台。

验证JWT

最后,让我们看看如何在PHP中验证令牌。与往常一样,我们将包含Composer的自动加载器。然后,我们可以选择检查是否使用了正确的请求方法。为了继续关注JWT特定的代码,我已经跳过了执行此操作的代码:

<?php     // 将数组编码为JWT字符串。
    echo JWT::encode(
        $data,
        $secretKey,
        'HS512'
    );
}
登录后复制

然后,代码将尝试从Bearer标头中提取令牌。我已经使用preg_match这样做了。如果您不熟悉该函数,它将在字符串上执行正则表达式匹配。

我在这里使用的正则表达式将尝试从Bearer标头中提取令牌,并转储其他所有内容。如果找不到,则返回HTTP 400错误请求:

const store = {};
const loginButton = document.querySelector('#frmLogin');
const btnGetResource = document.querySelector('#btnGetResource');
const form = document.forms[0];

// 将jwt插入到store对象中
store.setJWT = function (data) {
  this.JWT = data;
};

loginButton.addEventListener('submit', async (e) => {
  e.preventDefault();

  const res = await fetch('/authenticate.php', {
    method: 'POST',
    headers: {
      'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
    },
    body: JSON.stringify({
      username: form.inputEmail.value,
      password: form.inputPassword.value
    })
  });

  if (res.status >= 200 && res.status < 300) {
    const jwt = await res.text();
    store.setJWT(jwt);
    frmLogin.style.display = 'none';
    btnGetResource.style.display = 'block';
  } else {
    // 处理错误
    console.log(res.status, res.statusText);
  }
});
登录后复制

请注意,默认情况下,Apache不会将HTTP_AUTHORIZATION标头传递给PHP。其背后的原因是:

基本授权标头只有在您的连接通过HTTPS完成时才安全,因为否则凭据将以编码的明文(未加密)形式通过网络发送,这是一个巨大的安全问题。

我完全理解这一决定的逻辑。但是,为了避免很多混淆,请将以下内容添加到您的Apache配置中。然后代码将按预期工作。如果您使用的是NGINX,则代码应该按预期工作:

<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E</code>
登录后复制
登录后复制
登录后复制
登录后复制

接下来,我们尝试提取匹配的JWT,它将位于$matches变量的第二个元素中。如果不可用,则没有提取JWT,并返回HTTP 400错误请求:

<code>{
    "alg": "HS256",
    "typ": "JWT"
}</code>
登录后复制
登录后复制
登录后复制

如果我们到达此点,则提取JWT,因此我们转到解码和验证阶段。为此,我们再次需要我们的密钥,它将从环境或应用程序的配置中提取。然后,我们使用php-jwt的静态decode方法,将JWT、密钥和一组用于解码JWT的算法传递给它。

如果能够成功解码,我们就会尝试验证它。我这里的示例非常简单,因为它只使用颁发者、不早于和过期时间戳。在实际应用程序中,您可能还会使用许多其他声明。

<code>{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}</code>
登录后复制
登录后复制
登录后复制

如果令牌无效,例如令牌已过期,则用户将收到HTTP 401未授权标头,并且脚本将退出。

如果解码和验证过程失败,则可能是:

  • 提供的段数与前面描述的标准三个段数不匹配。
  • 标头或有效负载不是有效的JSON字符串。
  • 签名无效,这意味着数据已被篡改!
  • JWT中设置了nbf声明,其时间戳小于当前时间戳。
  • JWT中设置了iat声明,其时间戳小于当前时间戳。
  • JWT中设置了exp声明,其时间戳大于当前时间戳。

如您所见,JWT具有一套不错的控制措施,无需手动撤销或针对有效令牌列表进行检查即可将其标记为无效。

如果解码和验证过程成功,则用户将被允许发出请求,并将收到相应的响应。

总结

这是一个关于JSON Web Tokens(或JWT)以及如何在基于PHP的应用程序中使用它们的快速介绍。从这里开始,您可以尝试在下一个API中实现JWT,也许尝试一些使用非对称密钥(如RS256)的其他签名算法,或者将其集成到现有的OAUTH2身份验证服务器中以用作API密钥。

如果您有任何意见或问题,请随时通过Twitter与我们联系。

关于使用JWT进行PHP授权的常见问题解答

我们可以在PHP中使用JWT吗?

您确实可以在PHP中使用JWT来在Web应用程序中建立身份验证和授权机制。要开始使用,您需要使用Composer安装PHP JWT库,例如“firebase/php-jwt”或“lcobucci/jwt”。这些库提供了创建、编码、解码和验证JWT的必要工具。 要创建JWT,您可以使用库来构建包含发行者、受众、过期时间等声明的令牌。创建后,您可以使用密钥签署令牌。接收JWT时,您可以使用库对其进行解码和验证以确保其真实性。如果令牌有效且已验证,您可以访问其声明以确定用户身份和权限,从而允许您在PHP应用程序中实现安全的身份验证和授权。 保护密钥并遵循使用JWT时的安全最佳实践对于防止未经授权访问应用程序资源至关重要。

PHP中的JWT身份验证是什么?

PHP中的JWT(JSON Web Token)身份验证是一种广泛用于在Web应用程序中实现用户身份验证和授权的方法。它基于令牌的身份验证,能够进行安全且无状态的用户验证。以下是JWT身份验证在PHP中的工作方式: 首先,在用户身份验证或登录期间,服务器会生成一个JWT,这是一个紧凑的、自包含的令牌,其中包含与用户相关的信息(声明),例如用户ID、用户名和角色。这些声明通常是JSON数据。然后,服务器使用密钥签署此令牌以确保其完整性和真实性。 其次,成功进行身份验证后,服务器会将JWT发送回客户端,客户端通常将其存储在安全位置,例如HTTP cookie或本地存储。此令牌作为身份验证的证明。 最后,对于对服务器上受保护资源的后续请求,客户端会在请求标头中附加JWT,通常使用带有“Bearer”方案的“Authorization”标头。服务器收到JWT后,会使用在令牌创建期间使用的相同密钥来验证其签名。此外,它还会检查令牌是否未过期且包含有效的声明。成功验证后,它会从令牌声明中提取用户信息,并实现授权逻辑以确保用户具有访问请求资源所需的权限。这种方法允许在PHP应用程序中进行安全、无状态的身份验证,而无需服务器端会话存储。 虽然PHP中的JWT身份验证提供了许多好处,例如可扩展性和无状态性,但保护密钥并采用令牌管理的最佳实践对于维护应用程序的安全至关重要。使用已建立的PHP JWT库可以简化令牌处理并增强安全性。

PHP中JWT的替代方案是什么?

PHP中用于身份验证和授权的JWT(JSON Web Tokens)的替代方案是基于会话的身份验证。在基于会话的身份验证中,服务器为每个已验证的用户维护一个会话。当用户登录时,会创建一个唯一的会话标识符(通常存储为客户端浏览器上的会话cookie)。此标识符用于将用户与服务器端会话数据关联起来,包括与用户相关的信息,例如用户ID、用户名和权限。 基于会话的身份验证提供简单性和易于实现,使其适用于各种Web应用程序,尤其是在您不需要JWT的无状态性和可扩展性功能时。它本质上是有状态的,当您需要在用户会话期间管理特定于用户的数据(例如购物车内容或用户首选项)时,这可能是有利的。 但是,使用基于会话的身份验证时,需要考虑一些事项。对于需要无状态身份验证的分布式或基于微服务的架构,它可能不太适用。此外,管理用户会话可能会增加服务器负载,尤其是在用户群较大的应用程序中。最终,在PHP中选择JWT和基于会话的身份验证应与应用程序的特定需求和设计考虑因素相符,确保安全有效的身份验证机制最能满足您的需求。

如何使用JWT保护PHP API?

使用JWT(JSON Web Tokens)保护PHP API涉及一个多步骤过程,该过程结合了身份验证和授权。首先,选择合适的PHP JWT库(如“firebase/php-jwt”或“lcobucci/jwt”)来处理与令牌相关的操作,并使用Composer管理依赖项。 对于身份验证,您需要在PHP应用程序中实现用户身份验证系统。此系统会针对您的数据库或身份验证提供程序验证用户凭据。成功进行身份验证后,您将生成一个JWT令牌,其中包含与用户相关的声明,例如用户的ID、用户名和角色。务必设置过期时间以控制令牌的有效性,然后使用密钥签署令牌。此已签名的令牌作为身份验证响应的一部分发送回客户端。 客户端安全地存储收到的JWT,通常存储在HTTP cookie或本地存储中。对于后续的API请求,客户端会在请求标头中包含JWT,作为带有“Bearer”方案的“Authorization”标头。在您的PHP API中,您可以通过使用创建令牌时使用的相同密钥来验证其签名来验证传入的JWT。此外,您还会检查令牌是否未过期且包含有效的声明。成功验证后,您将从令牌声明中提取用户信息,并实现授权逻辑以确保用户具有访问请求资源所需的权限。 保持密钥安全至关重要,因为它对于签署和验证令牌都至关重要。此密钥的任何泄露都可能导致严重的安全性漏洞。

以上是JWT(JSON Web令牌)的PHP授权的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

PHP 8.1中的枚举(枚举)是什么? PHP 8.1中的枚举(枚举)是什么? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

什么是REST API设计原理? 什么是REST API设计原理? Apr 04, 2025 am 12:01 AM

RESTAPI设计原则包括资源定义、URI设计、HTTP方法使用、状态码使用、版本控制和HATEOAS。1.资源应使用名词表示并保持层次结构。2.HTTP方法应符合其语义,如GET用于获取资源。3.状态码应正确使用,如404表示资源不存在。4.版本控制可通过URI或头部实现。5.HATEOAS通过响应中的链接引导客户端操作。

您如何在PHP中有效处理异常(尝试,捕捉,最后,投掷)? 您如何在PHP中有效处理异常(尝试,捕捉,最后,投掷)? Apr 05, 2025 am 12:03 AM

在PHP中,异常处理通过try,catch,finally,和throw关键字实现。1)try块包围可能抛出异常的代码;2)catch块处理异常;3)finally块确保代码始终执行;4)throw用于手动抛出异常。这些机制帮助提升代码的健壮性和可维护性。

PHP中的匿名类是什么?您何时可以使用它们? PHP中的匿名类是什么?您何时可以使用它们? Apr 04, 2025 am 12:02 AM

匿名类在PHP中的主要作用是创建一次性使用的对象。1.匿名类允许在代码中直接定义没有名字的类,适用于临时需求。2.它们可以继承类或实现接口,增加灵活性。3.使用时需注意性能和代码可读性,避免重复定义相同的匿名类。

See all articles