php - VS Code 上的 intelephense 错误:预期类型为“字符串”。找到'字符串 []'
问题描述
假设以下代码:
<?php
declare (strict_types = 1);
define('SOURCE_PATH', 'C:\xampp\htdocs\atlantis\ProductImages\\');
$dest = explode('\\', SOURCE_PATH);
$dest[count($dest) - 2] = 'ToUpload';
$dest = implode('\\', $dest);
function transfer(string $file)
{
global $dest;
if (!@chdir($dest)) {
mkdir($dest);
chdir($dest);
}
// ...
}
function compress(string $path)
{
global $dest;
$zip = new ZipArchive();
$zip->open(dirname($dest, 1) . '\\' . explode('\\', SOURCE_PATH)[count(explode('\\', SOURCE_PATH)) - 2] . '.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
// ...
}
因此,VS Code 上的 intelephense 一直在抱怨我在函数Expected type 'string'. Found 'string[]'.
中使用的所有四个实例......$dest
那个 intelephense 不喜欢我的代码的什么地方?请注意,页面运行良好......那 string[] 类型是什么?implode()
返回一个字符串,那么这里有什么问题?
编辑:这很可能是一个 intelephense 的错误......
我$dest
是这样计算的:
$dest = dirname(SOURCE_PATH, 1) . '\ToUpload\\';
这不涉及explode()
ing,实际上错误消失了......所以不知何故 intelephense 没有考虑到implode()
返回一个字符串而不是一个数组......
实际上,我在 github 上提交了一个错误报告,我正在等待 Mewburn 对此的回应...... :)
解决方案
全局变量在 intelephense 中可能有点不稳定,已经存在改进支持的问题。在这种特定情况下,推断的类型由第一个赋值决定。由于那是explode 语句,它会假设$dest
是一个字符串数组。
有几个解决方案:
确保
$dest
用注释说明类型是什么。function transfer(string $file) { /** @var string $dest */ global $dest; }
确保第一个赋值
$dest
实际上是一个字符串:$tempdest = explode('\\', SOURCE_PATH); $tempdest[count($tempdest) - 2] = 'ToUpload'; $dest = implode('\\', $dest);
推荐阅读
- laravel - 使用 Laravel 的肥皂 API
- python - 无法使用lxml获取连接到某个标签的html元素
- javascript - JS:通过 getElementsByClassName 隐藏类的某些元素
- html - 如何在画布上绘制负 x 和 y 值
- c# - 查询后的实体框架性能
- java - 微调器简单项目模板获得不同的大小
- javascript - 如何将一些过滤器与恢复初始对象一起使用?
- java - 无法从 Spring 云配置服务器中的 GIT 读取属性源
- c++ - 给定一个成对排序矩阵,如何枚举所有可能的总排序
- android - 如何创建一个带有边框和透明背景的按钮android