我需要从一些php本机函数中捕获一些警告,然后处理它们.
特别:
array dns_get_record ( string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]] )
Run Code Online (Sandbox Code Playgroud)
当DNS查询失败时,它会发出警告.
try
/ catch
不起作用,因为警告不是例外.
我现在有2个选择:
set_error_handler
看起来有点矫枉过正,因为我必须使用它来过滤页面中的每个警告(这是真的吗?);
调整错误报告/显示,以便这些警告不会回显到屏幕,然后检查返回值; 如果是false
,则没有找到主机名的记录.
这里的最佳做法是什么?
我需要检查值是否定义为任何值,包括null.isset
将null值视为未定义并返回false
.以下面的例子为例:
$foo = null;
if(isset($foo)) // returns false
if(isset($bar)) // returns false
if(isset($foo) || is_null($foo)) // returns true
if(isset($bar) || is_null($bar)) // returns true, raises a notice
Run Code Online (Sandbox Code Playgroud)
请注意,这$bar
是未定义的.
我需要找到满足以下条件的条件:
if(something($bar)) // returns false;
if(something($foo)) // returns true;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
背景:假设我有以下显然不正确的PHP:
try{
$vtest = '';
print(array_pop($vtest));
}catch(Exception $exx){}
Run Code Online (Sandbox Code Playgroud)
为了使用array_pop,$ vtest显然应该是一个数组,而不是一个字符串.然而,当我运行此代码时,会显示警告.我不希望这样,我只是希望代码无声地失败.
问题:与其他语言相比,PHP try-catch是否有一些特殊之处导致这种情况无效?
免责声明: 仅供参考,确实有其他方法可以在PHP中处理这种情况,但这些都是不可取的.这里的目标是避免:
"签名"技巧:
$vtest = '';
print(@array_pop($vtest)); // <-- would like to avoid this
Run Code Online (Sandbox Code Playgroud)
类型铸造:
$vtest = '';
$vtest = (array)$vtest;
print(array_pop($vtest));
Run Code Online (Sandbox Code Playgroud) 我正在写一个PHP邮件功能,有些例子@mail(…)
和其他人都有mail(…)
.
有什么区别,哪一个最好用?
干杯
我的Phar脚本使用fwrite创建一个新文件,该文件工作正常,它在phar之外创建新文件,与phar文件位于同一目录中.
但是当我使用if(file_exists('file.php'))时它不会捡起它.
但是然后包括并要求捡起它.
有谁知道这个问题?经过一段时间的测试和研究似乎无法找到解决方案.
使用文件系统函数时,处理错误的正确方法是什么,例如:
警告:symlink():第XXX行的/path-to-script/symlink.php中没有这样的文件或目录
我通常的方法是在调用文件系统函数之前检查可能产生错误的任何条件.但是如果命令失败的原因我没有预见到,我如何捕获错误以向用户显示更有用的消息?
这是创建符号链接的代码的简化:
$filename = 'some-file.ext';
$source_path = '/full/path/to/source/dir/';
$dest_path = '/full/path/to/destination/dir/';
if(file_exists($source_path . $filename)) {
if(is_dir($dest_path)) {
if( ! file_exists($dest_path . $filename)) {
if (symlink($source_path . $filename, $dest_path . $filename)) {
echo 'Success';
} else {
echo 'Error';
}
}
else {
if (is_link($dest_path . $filename)) {
$current_source_path = readlink($dest_path . $filename);
if ( $current_source_path == $source_path . $filename) {
echo 'Link exists';
} else {
echo "Link exists but points to: {$current_source_path}";
}
} else …
Run Code Online (Sandbox Code Playgroud) 假设您需要创建某种类型的"顶部"并具有如下代码:
$matches=array();
foreach ($array as $v){
$matches[processing($v)]++;
}
Run Code Online (Sandbox Code Playgroud)
这将为Notice: Undefined index
索引需要创建的案例输出a .
既然你知道你必须创建索引,那么解决这些案例的最佳方法是什么?
我根据具体情况使用了这些解决方案
@$matches[$v]++;
$matches[$v]=isset($matches[$v])?$matches[$v]++:1;
还有其他方法吗?
寻找最快的执行时间,因为我使用此功能数千次或一些更懒的方式来输入仍然比@更快
编辑:
在一个简单的情况下,你也$matches[$v]++;
可以使用array_count_values()
(如Yoshi建议)
所以我正在努力清理一个可怕的代码库,我正在慢慢转向完整的错误报告.
这是一个艰巨的过程,有数百条通知:
Notice: Undefined index: incoming in /path/to/code/somescript.php on line 18
Run Code Online (Sandbox Code Playgroud)
由于使用变量假设未定义的变量将只处理为false,如:
if($_SESSION['incoming']){
// do something
}
Run Code Online (Sandbox Code Playgroud)
目标是能够知道何时引入了错误的未定义变量,使用严格错误/通知检查的能力,作为重构过程的第一阶段 - 最终将包括重写依赖于标准输入的代码点这样的数组.我知道有两种方法可以替换一个变量,该变量可能会以抑制通知的方式定义,如果尚未定义的话.
只更换一个变量的实例是相当干净的,就像$_REQUEST['incoming']
只查找truthy值一样
@$_REQUEST['incoming'].
Run Code Online (Sandbox Code Playgroud)
替换变量的实例非常脏,就像$_REQUEST['incoming']
"标准"测试一样
(isset($_REQUEST['incoming'])? $_REQUEST['incoming'] : null)
Run Code Online (Sandbox Code Playgroud)
而且你添加了一个三元/内联if,这是有问题的,因为你实际上可以在复杂的代码中以不同的方式嵌套parens并完全改变行为.
所以.......与使用@
相比,使用错误抑制符号是否有任何不可接受的方面(isset($something)? $something : null)
?
编辑:为了尽可能清楚,我不是要比较"将代码重写为好"和"@",这是因为真正的重构增加了复杂性,这个过程的后期阶段.我只是比较了我所知道的两种方式(可能还有其他方法),用现在的非通知抛出版本替换$ undefined_variable.
我正在重构一些工作代码,我遇到了一些以"@"符号为前缀的函数调用.据我了解,如果调用失败,这是为了逃避PHP错误报告.
这种类型的东西是好的做法吗?我理解开发环境中的基本原理,但是当网站被推向生产时,不应该正确处理所有错误而不是仅仅进行转义?
因此,使用此符号意味着开发人员必须在稍后阶段对代码进行排序,以删除所有错误报告转义.
我不确定是否删除这些符号,只是找到一种更好的方法来处理潜在的错误.
为清楚起见,使用它的函数是本机PHP fsockopen()
函数.
我正在研究一些PHP代码,无法弄清楚@代码在这段代码中的重要性:
$data = @fread($_socket, 8192);
Run Code Online (Sandbox Code Playgroud)
我无法在php.net上找到许多其他的例子来解释@的用途,而只是用它.
谢谢
我在PHP中遇到这个函数的问题.我在这个页面上有不断变化的已发布项目,我正在使用此函数返回数组中的变量:
function grade($a) {
if ($a == 1) {
return $_POST['1'];
}
if ($a == 2) {
return $_POST['2'];
}
if ($a == 3) {
return $_POST['3'];
}
if ($a == 4) {
return $_POST['4'];
}
if ($a == 5) {
return $_POST['5'];
}
if ($a == 6) {
return $_POST['6'];
}
//... you get the idea
}
Run Code Online (Sandbox Code Playgroud)
这可能不是正确的方法.如何缩短此函数,以便我不必为每个可能的数组变量创建if语句?
谢谢你的帮助!
php ×11
try-catch ×2
arrays ×1
debugging ×1
exception ×1
file-exists ×1
include ×1
isset ×1
null ×1
optimization ×1
phar ×1
refactoring ×1
require ×1
syntax ×1
syntax-error ×1