Handling errors with PHP
如果没有设置error handler,php会根据配置进行处理。错误的汇报和是否忽略由php.ini 内的 error_reporting 决定,或者在运行时调用error_reporting()。建议在配置中设置,因为有些错误会在执行前发生。在开发时,应该设置error_reporting为E_ALL,这样就可以发现并用于修复问题。
php如何处理这些错误,主要依赖于php.ini的display_errors(负责作为输出部分显示错误),log_errors负责记录错误。
user error handlers
如果php默认的错误处理不适合,你可以使用自己的错误处理通过set_error_handler()。
错误和日志记录:
http://php.net/manual/zh/errorfunc.constants.php
异常处理:
try{
//尝试进行某段代码,一旦抛出异常终止进行之后的代码,直接到catch
}catch(exception or subclass of exception $e){
//尝试接收exception异常,做相应处理。
//可以进行多个catch来接收不同的异常类型对象。
//catch中也可以抛出异常
//如果某个异常一直没有被捕获到,则会造成fatal error
}finally{
//总会执行的代码段
}
class MyException extends Exception { }
class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
// rethrow it
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Test;
$foo->testing();// string(4) "foo!"
生成器
解决了部分函数在需要返回庞大数组时,占用过多内存的问题。
生成器语法
与普通函数返回一个值不同的是,生成器可以yield许多需要的值。
当一个生成器被调用的时候,它返回一个可以被遍历的对象.当你遍历这个对象的时候(例如通过一个foreach循环),PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。
一旦不再需要产生更多的值,生成器函数可以简单退出,而调用生成器的代码还可以继续执行,就像一个数组已经被遍历完了。
注意:生成器不可以用return返回值,解决的方法是用return空来终止生成器的继续执行。
yield关键字
与return不同的是,yield可以返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。
function getArray(){
for($i = 1;$i<3;$i++){
yield $i;
//如果作为表达式上下文,则需要用括号包围起来
//$data = (yield $i)
}
}
$array = getArray();
foreach($array as $v ){
echo $v;
}
//123
指定键名来生成值
$input = <<<'EOF'
1;PHP;Likes dollar signs
2;Python;Likes whitespace
3;Ruby;Likes blocks
EOF;
function input_m($input){
foreach(explode("\n",$input) as $line){
$f = explode(';',$line);
$id = array_shift($f);
yield $id => $f;
}
}
foreach(input_m($input) as $id => $f){
echo "$id:\n";
echo " $f[0]\n";
echo " $f[1]\n";
}
当yield后面不接任何值的时候,返回null
使用引用来生成值(对返回值操作会影响函数内部的值--引用)
function &func(){
...
yield $v;
...
}
foreach(func() as &$v){
echo $v;
}
yield ,yield from与 return
<?php
function count_to_ten() {
yield 1;
yield 2;
yield from [3, 4];
yield from new ArrayIterator([5, 6]);
yield from seven_eight();
return yield from nine_ten();
}
function seven_eight() {
yield 7;
yield from eight();
}
function eight() {
yield 8;
}
function nine_ten() {
yield 9;
return 10;
}
$gen = count_to_ten();
foreach ($gen as $num) {
echo "$num ";
}
echo $gen->getReturn();
?>