我试图在我的一个类上实现PHP5的类型提示,
class ClassA {
public function method_a (ClassB $b)
{}
}
class ClassB {}
class ClassWrong{}
Run Code Online (Sandbox Code Playgroud)
正确用法:
$a = new ClassA;
$a->method_a(new ClassB);
Run Code Online (Sandbox Code Playgroud)
产生错误:
$a = new ClassA;
$a->method_a(new ClassWrong);
Run Code Online (Sandbox Code Playgroud)
可捕获的致命错误:传递给ClassA的参数1 :: method_a()必须是ClassB的一个实例,ClassWrong的实例给出...
我是否可以知道是否有可能发现错误(因为它说"可捕获")?如果是,怎么样?
谢谢.
我有一个网关脚本,它将JSON返回给客户端.在脚本中,我使用set_error_handler来捕获错误,并且仍然具有格式化的返回.
它受"允许的内存大小耗尽"错误的影响,但不是通过像ini_set('memory_limit','19T')之类的东西来增加内存限制,我只想返回用户应该尝试别的东西,因为它已经习惯了记忆.
有没有什么好方法可以捕获致命错误?
我一直在玩一个我正在开发的系统,并设法让它导致这个:
致命错误:超出最长执行时间30秒
它发生在我做一些不切实际的事情时,但它可能发生在用户身上.
有谁知道是否有办法捕捉这个例外?我已经读过了,但似乎每个人都建议增加允许的时间.
PHP致命错误作为状态代码200返回到HTTP客户端.如何让它返回状态码500(内部服务器错误)?
我使用以下脚本使用PHP使用数据库:
try{
$db = new PDO('mysql:host='.$host.';port='.$port.';dbname='.$db, $user, $pass, $options);
}
catch(Exception $e){
$GLOBALS['errors'][] = $e;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想使用此数据库句柄使用此代码执行请求:
try{
$query = $db->prepare("INSERT INTO users (...) VALUES (...);");
$query->execute(array(
'...' => $...,
'...' => $...
));
}
catch(Exception $e){
$GLOBALS['errors'][] = $e;
}
Run Code Online (Sandbox Code Playgroud)
这是问题所在:
$GLOBALS['errors'][]数组,之后脚本仍在运行,注意:未定义的变量:第32行的C:\ xampp\htdocs [...]\test.php中的db
致命错误:在第32行的C:\ xampp\htdocs [...]\test.php中调用非对象的成员函数prepare()
注意:第32行是$query = $db->prepare(...)指令.
也就是说,脚本崩溃了,try/catch似乎没用.你知道为什么第二次尝试/捕获不起作用以及如何解决它?
谢谢您的帮助!
编辑:有一些非常好的回复.我已经验证了一个不是我想要做的,但这可能是最好的方法.
为什么我收到此错误?
Warning: file_get_contents(http://www.example.com) [function.file-get-contents]: failed to open stream: HTTP request failed! in C:\xampp\htdocs\test.php on line 22
Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\test.php on line 22
Run Code Online (Sandbox Code Playgroud)
这是代码:
try {
$sgs = file_get_contents("http://www.example.com");
}
catch (Exception $e) {
echo '123';
}
echo '467';
Run Code Online (Sandbox Code Playgroud)
是不是尝试\ catch应该继续执行代码?或者也许有一些不同的方式来做到这一点?
我正在完善一大堆代码.很多它包含许多不影响代码执行的一般警告和注意事项(即:未定义的变量,或没有qoutes的数组键).
我想编写一个函数,让我首先专注于致命错误,然后我会打开不那么紧急的警告和通知.我找到了这个代码,但它通过电子邮件发送每个小警告通知和错误.
http://net.tutsplus.com/tutorials/php/quick-tip-email-error-logs-to-yourself-with-php/
如何修改此代码,使其仅处理以下内容:
背景:假设我有以下显然不正确的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中,有什么方法可以忽略未定义的函数而不是抛出在浏览器中可见的致命错误?-ie,致命错误:调用未定义的函数
我知道有一种将所有自定义函数包装在条件中的做法,如下所示,但是有一种编程方式来获得这种效果吗?
if (function_exists('my_function')) {
// use my_function() here;
}
Run Code Online (Sandbox Code Playgroud) FWIW我正在使用SimpleTest 1.1alpha.
我有一个单例类,我想编写一个单元测试,通过尝试实例化类(它有一个私有构造函数)来保证该类是一个单例.
这显然会导致致命错误:
致命错误:调用私有FrontController :: __ construct()
有没有办法"捕获"致命错误并报告通过的测试?
php ×10
fatal-error ×5
try-catch ×4
arrays ×1
error-code ×1
exception ×1
memory ×1
simpletest ×1
singleton ×1
syntax ×1
type-hinting ×1
undefined ×1
unit-testing ×1