VS 代码上的智能错误:预期类型 'string'。找到 'string[]'
intelephense error on VS Code: Expected type 'string'. Found 'string[]'
假设如下一段代码:
<?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 在我的函数中使用 $dest
的所有四个实例中一直抱怨 Expected type 'string'. Found 'string[]'.
...
intelephense 不喜欢我的代码的地方是什么?请注意,该页面运行良好...那个 string[] 类型是什么? implode()
returns 一个字符串,所以这里有什么问题?
编辑:这很可能是 intelephense 的错误...
我这样计算$dest
:
$dest = dirname(SOURCE_PATH, 1) . '\ToUpload\';
不涉及 explode()
ing,实际上 error 消失了......所以不知何故 intelephense 失败了考虑到 implode()
returns 一个字符串而不是一个数组...
实际上,我在 github 上提交了错误报告,我正在等待 Mewburn 对此的回应...:)
全局变量在 intelephense 中可能有点不稳定,an issue 已经存在以改进支持。在这种特定情况下,推断的类型由第一个赋值决定。由于这是 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);
我想,这是因为内爆参数被改变了。
https://www.php.net/manual/de/migration74.deprecated.php
说如下:
Implode with historical parameter order Passing parameters to implode() in reverse order is deprecated, use implode($glue, $parts)
instead of implode($parts, $glue).
假设如下一段代码:
<?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 在我的函数中使用 $dest
的所有四个实例中一直抱怨 Expected type 'string'. Found 'string[]'.
...
intelephense 不喜欢我的代码的地方是什么?请注意,该页面运行良好...那个 string[] 类型是什么? implode()
returns 一个字符串,所以这里有什么问题?
编辑:这很可能是 intelephense 的错误...
我这样计算$dest
:
$dest = dirname(SOURCE_PATH, 1) . '\ToUpload\';
不涉及 explode()
ing,实际上 error 消失了......所以不知何故 intelephense 失败了考虑到 implode()
returns 一个字符串而不是一个数组...
实际上,我在 github 上提交了错误报告,我正在等待 Mewburn 对此的回应...:)
全局变量在 intelephense 中可能有点不稳定,an issue 已经存在以改进支持。在这种特定情况下,推断的类型由第一个赋值决定。由于这是 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);
我想,这是因为内爆参数被改变了。
https://www.php.net/manual/de/migration74.deprecated.php 说如下:
Implode with historical parameter order Passing parameters to implode() in reverse order is deprecated, use implode($glue, $parts) instead of implode($parts, $glue).