直接安装 phpoption/phpoption 包,确认 autoload 正确引入 vendor/autoload.php,使用 option::fromvalue() 处理存在性而非真值性,优先用 getorcall() 避免默认值冗余计算,谨慎在嵌套字段中应用 option。

直接装 phpoption/phpoption 就行,别找错包名——它不叫 php-option、phpoption(没命名空间)或 prewk/option(那是另一个轻量替代品),官方唯一稳定维护的包就是 phpoption/phpoption。
composer require phpoption/phpoption 之后要确认 autoload 是否生效
执行完命令后,别急着写代码。先检查 vendor/autoload.php 是否被项目正确引入——常见错误是忘记 require 'vendor/autoload.php'; 或路径写错。如果出现 Class 'PhpOption\Option' not found,基本就是 autoload 没加载,不是包没装上。
- 确保入口文件(如
index.php或测试脚本)顶部有require __DIR__ . '/vendor/autoload.php'; - 运行
composer dump-autoload -o可强制刷新自动加载映射,尤其在类文件新增后 - 不要手动 require
src/PhpOption/Option.php—— Composer 的 PSR-4 自动加载机制已覆盖该路径
Option::fromValue() 是最常用但容易误用的入口
这个静态方法把任意值转成 Some 或 None,但它只认 null 为“空”,其他假值(如 0、false、'')全当有效值处理。这不是 bug,是设计使然:Option 关注的是“存在性”,不是“真值性”。
- 想把空字符串也视为 None?得自己封装:
Option::fromValue($str === '' ? null : $str) - 数据库查询返回
false表示失败?不能直接Option::fromValue($pdo->fetch()),得先转成null:Option::fromValue($row ?: null) - 不要用
new Some($val)或None::create()手动实例化——Option::fromValue()已足够且语义清晰
getOrElse() 和 getOrCall() 的性能差异常被忽略
getOrElse() 会立即求值默认参数,哪怕 Option 有值;而 getOrCall() 只在 None 时才调用回调。这对耗资源的默认构造(比如 new User() + DB 查询)影响明显。
- ❌ 错误写法:
$user = $userOpt->getOrElse(User::createDefault());—— 每次都创建默认用户对象 - ✅ 正确写法:
$user = $userOpt->getOrCall(fn() => User::createDefault());—— 仅当 $userOpt 是 None 时才触发 - PHP 7.4+ 支持箭头函数,比传统
function() { ... }更简洁;低于 7.4 请用function () use ($deps) { ... }
真正难的不是装包或调方法,而是判断哪些变量值得套一层 Option —— 比如 API 响应里的嵌套字段 $data['user']['profile']['avatar'],直接链式 map() 比层层 isset() 更可靠,但也更容易让新人掉进“过度封装”陷阱。先从核心业务实体开始,别一上来就给所有数组键加 Option。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











