php教程技术文章
-
Generator 适合惰性迭代和流式数据,Fiber 适合暂停完整调用栈;真正的非阻塞 I/O 仍由事件循环和异步库负责。本文按任务形态说明三者如何组合。259 收藏 -
PHP 调用 session_regenerate_id() 返回 false 时,不要立即销毁旧会话。本文给出前置检查、旧数据保留、失败原因记录和成功/失败分支处理方法。258 收藏 -
修改 Composer 的 PSR-4 自动加载映射后,为什么还会 Class not found?本文用 composer.json、vendor/composer 生成文件和 class_exists 检查,说明 dump-autoload 的作用、生产优化参数与常见排查边界。253 收藏 -
PHP 8.5 升级排查不要只盯动态属性。本文把 PHP 8.5 新弃用与 PHP 8.2 动态属性历史问题分开,用 E_ALL 日志、源码扫描和测试矩阵定位受影响代码。251 收藏 -
PHP Fiber 的异常不是由 resume 返回,而是从 Fiber::suspend() 的暂停点重新抛出;本文用一个最小任务调度器说明 start、resume、throw 的关系和终止边界。246 收藏 -
文章 · php教程 | 2天前 | 错误处理 · php教程 · 接口排查 · JSON解析 · php json_decode json_last_error JSON_THROW_ON_ERROR JSON_ERROR_NONE
解释 PHP json_decode 返回 null 的两种含义,演示如何用 json_last_error、错误码和 JSON_THROW_ON_ERROR 区分合法 JSON null 与语法、编码、深度解析失败。239 收藏 -
PHP 的 SameSite=None 必须配合 Secure,本地 HTTP、localhost 例外和跨站请求条件又不完全相同。本文用配置示例和排查清单说明为什么 Cookie 看似设置成功却没有随下一次请求发送。234 收藏 -
PHP 8.4 属性钩子适合集中处理单属性的清洗、类型边界和局部校验,但跨字段规则与数据库副作用不应塞进 get/set。本文用订单行示例拆分属性钩子、命名构造器和服务层的职责。233 收藏 -
DateTimeImmutable 的 modify() 不会改写原对象,而是返回新的日期对象。本文用 PHP 示例说明如何接住返回值、如何选择 DateTime 与 DateTimeImmutable,并提醒月末运算和异常处理边界。232 收藏 -
PHP 8.5 引入的 Uri\Rfc3986\Uri 能把带端口的地址拆成可读取字段,并通过不可变对象安全生成新端口版本。本文用一个内网 API 地址说明 getPort、withPort、toString 的配合方式,以及缺少端口和非法 URI 的处理边界。232 收藏 -
使用 PHP curl_multi 并发请求时,通过 curl_multi_info_read() 获取已完成的单个句柄,再结合 CURLOPT_PRIVATE、传输结果和 HTTP 状态准确归属与处理响应。223 收藏 -
PHP readonly 属性报错时,先看属性是否已初始化,再根据赋值作用域区分初始化失败、重复修改和间接修改。223 收藏 -
PHP backed enum 直接 json_encode 时默认输出 backing value,而不是 case 名称。本文用最小示例区分 name、value、from/tryFrom,并给出需要输出名称或二者并存时的 JsonSerializable 写法。221 收藏 -
DOMXPath 查询带默认命名空间的 XML 时,直接写 //catalog/item 往往返回空结果。本文用原创 XML 示例说明如何注册 namespace URI、选择 XPath 前缀,并区分空 DOMNodeList 与 false 的排查路径。216 收藏 -
PHP Fibers 没有独立开关,先检查 PHP 8.1+ 与 Fiber 类,再用 start、suspend、resume、throw 和状态方法定位挂起恢复问题。205 收藏