无障碍创业:PHP工程师的15年技术跃迁路
|
去年十二月份,我蹲在客户机房换电源模块,手抖得拧不紧螺丝——不是怕电,是刚跟前端撕完:他非说aria-label里写了“点击跳转”就等于通过WCAG 2.1 AA,我掏出Chrome DevTools一查,role="button"没加tabindex="-1",键盘焦点直接卡死在SVG图标上。他转身去接了个电话,听筒里飘出半句“……对对,那个无障碍改造预算先压着”。雨还在下,玻璃门框缝里漏进来的水线,正沿着UPS机柜底部爬。 我原以为搞懂ARIA属性、写熟``和``的语义差异、配齐focus-visible伪类就够撑住一个创业MVP。结果上线第三天,视障用户投诉表单提交后页面没反馈——不是没做loading状态,是我把aria-live="polite"塞进了Vue组件的beforeDestroy钩子里,销毁比DOM更新快十七秒。那会儿外卖盒还敞着盖,麻婆豆腐浮着层红油,筷子插在米饭里斜戳着,像根没拔掉的debug断点。 优胜劣汰?对。但不是你想象那种温良恭俭让的淘汰。是上周三凌晨两点,服务器告警邮件炸出来,我扒拉日志发现是某电商后台的PHP-FPM子进程全挂了——就因为一个实习生把file_get_contents('https://api.xxx.com/price')硬塞进foreach循环里,连个curl_multi_init都没碰过。监控图上那根红色峰值线,比我岳父体检报告里的肌酐值还刺眼。而真正要命的是:这代码能跑通,订单也生成了,只是慢得像在用2G网络同步MySQL binlog。没人测过它在弱网下的表现,因为“反正用户都在Wi-Fi下付款”。 前天路过楼下咖啡店,听见俩95后聊低代码平台。一个说“PHP太老,框架迭代跟不上”,另一个搅着拿铁说“但咱老板上个月刚用Laravel+Inertia做了个投标系统,三天上线”。我站在自动门边没进去,玻璃倒影里看见自己衬衫领子翻了一角,左手无名指上有道干裂的口子——是上个月改Composer依赖时,被phpstan报错信息闪瞎眼后抓痒抠的。
文章配图,仅供参考 说句实话,我对“无障碍”这三个字现在的敬畏感,远不如十五年前调试IE6 CSS hack时来得纯粹。那时候没有axe-core,没有lighthouse,我们靠屏幕阅读器语音卡顿的0.3秒间隙,反推DOM渲染阻塞点。现在呢?工具链堆成山,可团队里七个工程师,只有我在读W3C那篇《Custom Control Accessibility API》RFC草案,边读边划重点,笔尖把纸背面戳破三个洞。 有个细节我敢打包票:PHP 8.1的枚举类配合match表达式做权限校验,性能确实比array_search快,但如果你的RBAC表里存的是字符串ID(比如'admin_v2_edit_user_profile'),而不是用enum case常量,那么——哪怕你把整个权限树用Swoole协程重写三遍,只要缓存没命中,照样会在auth.php里多打一次数据库。这个我试过,就在去年腊月廿三,那天机房空调坏了,冷凝水顺着交换机机架往下滴,滴滴答答,像在数你写的每行低效SQL。 上周末跟老王视频,他做医疗SAAS的,突然问我:“你觉不觉得,现在最狠的创业门槛不是技术,是‘敢不敢关掉那个无障碍检测插件再发版’?”我没接茬。他那边背景音是孩子咳嗽,一声接一声。我低头看了眼自己终端窗口——tmux里还挂着tail -f /var/log/php/error.log,最后一行停在:PHP Warning: Undefined array key "aria_describedby" in /app/src/Forms/FieldRenderer.php on line 88。而line 88旁边,有行注释:// 这个key是设计稿里写的,产品确认过。 说个跑题的:昨天修打印机卡纸,拆开看见滚轴上缠着三张A4纸,其中一张印着我们上季度做的无障碍验收表,签字栏空着。墨盒漏了,蓝墨水在表格末尾洇开,把“验收结论”四个字晕成一片模糊的湖。保洁阿姨推着车路过,扫了眼,说:“哟,又打印坏啦?”我说是,她顺手把纸团揉成球,投进绿色垃圾桶——那桶上贴着标签:“可回收/不可回收/其他垃圾”,但没写“无障碍文档残片应归入哪一类”。 所以别信什么“平滑过渡”“渐进增强”的鬼话。十五年里,我见过用eval拼SQL的老板拿天使轮;见过把Symfony Form组件当玩具拆解最后重写出轻量级校验引擎的实习生;也见过某政务平台因未处理``在iOS Safari下的无障碍失焦问题,被通报整改,整条产研线停工七天。技术跃迁从来不是阶梯,是断崖。你跳,或者等别人替你按回车键。 我现在在写一个微服务注册中心的PHP客户端——不用gRPC,不接Consul,就纯cURL+JSON。它得支持HTTP/2,得处理connection timeout和keep-alive复用冲突,还得给盲人工程师的命令行读屏器吐出结构化错误码。文档我打算用Markdown写,但每个标题后手动加一行空格。至于为啥?我也不知道。可能是因为刚才泡面汤洒了,烫着手指那一刻,忽然想起二十年前第一次写header("Location: …")时,也是这么盯着浏览器地址栏跳转的延迟,一秒,两秒,三秒——就为确认那个302真没丢。 下周一约了个视障开发者喝茶。他说他想试试用PHP做TTS音频流合成的路由调度。我答应带笔记本去,但没告诉他——我连mp3的ID3v2帧头都快记混了。行吧,先装个ffmpeg-php扩展看看。装不上再说。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


PHP工程师必避的5大服务器选型陷阱与调优实战
PHP工程师别只写代码:外链才是SEO权重跃升杠杆
无障碍创业三难破局:用技术架构打通流量、合规与运营


