我有一个大概10年前编写的PHP脚本。我不记得当时PHP的版本是什么,但是我的脚本工作得很好而没有来自解释器的抱怨。现在,我不得不将我的脚本移动到一个新的Web主机,并且在PHP 7.x下,解释器大声抱怨这个脚本的某一行,我正在寻找一种优雅的方法让它闭嘴。
违规行是: -
list($degrees, $minutes, $seconds) = preg_split("/ /", $coord);
$coord
变量包含以下三种形式之一的GPS坐标:“度数分秒”,“度数小数 - 分钟”或“小数度”。因此,preg_split()
可能会返回1,2或3个元素。如果它只返回1或2个元素,则解释器会大声抱怨对$seconds
和/或$minutes
的未定义引用。我看到有一个我可以为preg_split()
指定的LIMIT参数,它给出了要返回的最大元素数,但似乎没有一个补充参数来告诉它要返回的MINIMUM元素数。欢迎任何建议。
样本坐标:' - 97.74019'或'-97 44.411'或'-97 44 24.7'
答案 0 :(得分:5)
完全赞同Anant,但你可以用更优雅的方式做到:
<?php
$coordArray = preg_split('/ /', $coord);
$degrees = $coordArray[0] ?? 0;
$minutes = $coordArray[1] ?? 0;
$seconds = $coordArray[2] ?? 0;
答案 1 :(得分:2)
该行给出E_NOTICE
(&#34;注意:未定义的偏移量:X在第1行和第34行的命令行代码中;)。您可以将错误报告级别更改为不包括E_NOTICE
,也可以隐藏使用@
运算符禁用此特定行的错误报告。在这里使用@
没有任何害处。不匹配的变量将被指定为NULL(在5和7中):
$coord = "x y";
@list($degrees, $minutes, $seconds) = preg_split("/ /", $coord);
var_dump($degrees, $minutes, $seconds);
给出:
string(1) "x"
string(1) "y"
NULL
我一般不会推荐它,但要取消所有E_NOTICE
错误通知,您可以在error_reporting设置中取消设置:
ini_set("error_reporting", E_ALL&~E_NOTICE);
答案 2 :(得分:2)
您可以转换下面的代码: -
$d_m_s_array = preg_split("/ /", $coord);
$degrees = (!empty($d_m_s[0]) ? $d_m_s[0] :0;
$minutes = (!empty($d_m_s[1]) ? $d_m_s[1] :0;
$seconds = (!empty($d_m_s[2]) ? $d_m_s[2] :0;
注意: -
此外,您的原始代码只会生成通知(如果错误报告也是如此)。请看这里: - https://eval.in/707979
它不会停止程序执行,但你可以通过上面的代码来解决这个问题
答案 3 :(得分:0)