PhpStorm嵌套调用多次后无法识别返回类型问题求助
我之前在Magento 2开发写安装脚本的时候,也碰到过完全一样的问题——链式调用多次addColumn之后,PhpStorm突然就识别不了这个方法了,明明已经加了@var注释还是没用。后来查了下才搞清楚原因,给你分享下解决方案:
为什么会出现这个问题?
PhpStorm的静态代码分析器有一个默认的链式调用深度限制,当你连续链式调用同一个方法超过这个阈值时,它就没办法再追踪方法的返回类型了。你这里链式调用了25次addColumn,已经超出了PhpStorm默认的分析深度(一般默认在10-20左右),所以它就识别不出后续的addColumn方法属于\Magento\Framework\DB\Ddl\Table类了。
虽然你给$table加了@var注释,但这个注释只在变量初始化时生效,链式调用的后续环节PhpStorm还是依赖自身的类型追踪,超过深度阈值后就会失效。
解决方法
方法1:调整PhpStorm的链式调用分析阈值(最省心)
不需要修改代码,直接调整IDE的设置就能解决:
- 打开PhpStorm设置:
File > Settings(Windows/Linux)或PhpStorm > Settings(Mac) - 导航到
Languages & Frameworks > PHP > Editor - 找到
Maximum chain length for code completion选项,把数值调大(比如设置为30或更高,根据你的需求来) - 点击
Apply和OK,重启PhpStorm后就能正常识别所有链式调用的addColumn了
方法2:拆分长链式调用
如果不想改IDE设置,可以把超长的链式调用拆分成几段,每段用变量接收,让PhpStorm重新识别类型:
$installer = $setup; $installer->startSetup(); /** @var \Magento\Framework\DB\Ddl\Table $table */ $table = $installer->getConnection()->newTable( $installer->getTable('acc') )->addColumn( 'id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], 'Entity Id' )->addColumn( 'user', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 32, ['identity' => true, 'unique' => true], 'User' )->addColumn( 'general', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 32, [], 'General' ); // 继续添加后续列 $table->addColumn( 'individual', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, 32, [], 'Individual' )->addColumn( 'created_at', \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP, null, ['nullable' => false, 'default' => \Magento\Framework\DB\Ddl\Table::TIMESTAMP_INIT], 'Created At' );
拆分后每一段的链式调用长度都在PhpStorm的分析范围内,就能正常识别addColumn方法了。
方法3:临时添加类型提示(不推荐)
如果你愿意修改Magento核心类(不建议,因为版本升级会覆盖修改),可以给\Magento\Framework\DB\Ddl\Table的addColumn方法加上明确的@return $this注释:
/** * Add column to table * * @param string $name * @param string $type * @param int|string $size * @param array $options * @param string $comment * @return $this */ public function addColumn($name, $type, $size = null, $options = [], $comment = '') { // 原有方法代码 }
确保@return $this存在,能让PhpStorm更准确地追踪返回类型,但因为是修改核心文件,优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者Edwin

