PHP代码本地运行正常 服务器报T_DOUBLE_ARROW语法错误如何解决
问题原因
该语法报错的核心原因是PHP版本不兼容。fn($value) => ... 是PHP 7.4版本才正式支持的箭头函数语法,你的本地环境PHP版本≥7.4所以运行正常,而服务器的PHP版本低于7.4,无法识别该语法,因此抛出unexpected '=>'的报错。
解决方案
有两种通用解决方法:
方法1:升级服务器PHP版本
直接将服务器的PHP版本升级到7.4或更高版本即可解决,操作前注意确认服务器上其他运行的代码兼容高版本PHP。
方法2:将箭头函数替换为兼容低版本的匿名函数
无需升级PHP版本,只需要把报错行的箭头函数改写为PHP 5.3及以上都支持的匿名函数写法即可:
把原来的报错行:
$dna = array_filter($dna, fn($value) => !is_null($value) && $value != '');
替换为:
$dna = array_filter($dna, function($value) { return !is_null($value) && $value != ''; });
其他可优化的代码问题
顺便修复代码中存在的几个潜在bug:
- 代码中
$dna1、$dna2没有提前初始化,文件读取失败时调用array_intersect会抛出警告,建议在代码开头声明这两个变量 - 取文件扩展名的逻辑不严谨,若文件名包含多个
.(比如test.1.csv)会取到错误的扩展名,建议用pathinfo函数获取 - 输出div的行标签未闭合,原代码
echo '<div align = "center"';缺少右尖括号,应改为echo '<div align = "center">';
修正后的完整兼容代码
<?php $csv1 = array(); $csv2 = array(); $dna1 = array(); $dna2 = array(); // check there are no errors if($_FILES['csv1']['error'] == 0 && $_FILES['csv2']['error'] == 0){ $name1 = $_FILES['csv1']['name']; $name2 = $_FILES['csv2']['name']; $ext1 = strtolower(pathinfo($name1, PATHINFO_EXTENSION)); $ext2 = strtolower(pathinfo($name2, PATHINFO_EXTENSION)); $type1 = $_FILES['csv1']['type']; $type2 = $_FILES['csv2']['type']; $tmpName1 = $_FILES['csv1']['tmp_name']; $tmpName2 = $_FILES['csv2']['tmp_name']; // check the file is a csv if($ext1 == 'csv' && $ext2 == 'csv'){ if(($handle1 = fopen($tmpName1, 'r')) != FALSE && ($handle2 = fopen($tmpName2, 'r')) != FALSE) { // necessary if a large csv $i = 0; while(($data1 = fgetcsv($handle1, 1024, ',')) != FALSE) { if(sizeof($data1) > 1){ $dna1[$i] = $data1[1]; $i = $i + 1; } } fclose($handle1); $i = 0; while(($data2 = fgetcsv($handle2, 1024, ',')) != FALSE) { if(sizeof($data2) > 1){ $dna2[$i] = $data2[1]; $i = $i + 1; } } fclose($handle2); } $dna = array_intersect($dna1, $dna2); $dna = array_filter($dna, function($value) { return !is_null($value) && $value != ''; }); echo '<div align = "center">'; foreach ($dna as $key => $value) { if ($key > 0) echo ''.$value.''; echo '<br>'; } echo '</div>'; }else{ echo "Esse arquivo não é csv!"; } } ?>
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

