PHP语法错误:带括号的对象链式调用触发T_OBJECT_OPERATOR报错
问题描述
在集成CyberSource支付网关的PHP示例代码时,遇到如下语法错误:
Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in /Users/Me/Sites/cybersource-rest-samples-php/vendor/cybersource/rest-client-php/lib/ApiClient.php on line 338
报错代码行:
// debugging for curl if (($this->merchantConfig->getLogConfiguration())->isLoggingEnabled()) {
直觉上包裹$this->merchantConfig->getLogConfiguration()的括号属于冗余写法,不应触发错误,且文档说明代码基于PHP5.6编写,服务器运行环境也是PHP5.6,版本匹配。
问题原因与解决方案
这个语法错误的核心原因是PHP 5.6及更早版本不支持对带括号包裹的方法返回值直接进行链式调用——虽然PHP 5.4引入了对方法/函数返回值直接链式调用的支持,但仅针对无额外括号包裹的情况。当用括号把整个方法调用包裹起来后,PHP 5.6的解析器无法正确识别这是一个对象返回值,会误判后续的->isLoggingEnabled()为非法语法。
修复方案
- 直接去掉外层冗余括号,修改后代码:
// debugging for curl if ($this->merchantConfig->getLogConfiguration()->isLoggingEnabled()) {
- 若需保留逻辑优先级的明确性,可先将方法返回值赋值给临时变量,再调用后续方法:
// debugging for curl $logConfig = $this->merchantConfig->getLogConfiguration(); if ($logConfig->isLoggingEnabled()) {
补充说明
PHP 7.0及以上版本修复了该解析器问题,允许对带括号包裹的方法返回值进行链式调用。如果后续有版本升级计划,升级到PHP7+后这类写法就不会再触发错误。
内容的提问来源于stack exchange,提问作者Codelicus
相关产品推荐
相关产品推荐

