Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
error_reporting(0);<?php
function silence($func) {
return function() use($func) {
$current_level = error_reporting(0);
$res = call_user_func_array($func, func_get_args());
error_reporting($current_level);
return $res;
};
}
function replacer($func, $name) {
return function() use($func, $name) {
return call_user_func_array($name, func_get_args());
};
}
@silence
@replacer('fopen')
function xfopen(){}
xfopen('/wrong/path', 'rb');
За что ж вы так с @ то…
try fopen except IOError, в php такой возможности нет, поэтому приходится подавлять ошибку и проверять код возврата.if ($result == FALSE) или if ($result != 0) ), а часть из них ещё бросают warning'и (может и другие ошибки бросают, но не припоминаю). @ как раз и предназначен (по крайней мере чаще всего для этого используется) для подавления warning'ов в таких случаях.Ситуация, когда файл пропадает после вызова file_exists и до вызова fopen явно не нормальна и ее надо отслеживать.
$current_level = error_reporting(0);
$file = fopen('/etc/passwd', 'r+');
error_reporting($current_level);
<?php
function double($func) {
return function() use($func) {
return 2*call_user_func_array($func, func_get_args());
};
}
/**
* @return integer
* @decorated_by double
**/
function a()
{
return 21;
}
var_dump(a());
/* Вывод:
int(42)
*/
<?php
require(__DIR__.'/2.php');
use \Foo\Decor;
@Decor::neg
function one()
{
return 1;
}
var_dump(one());
<?php
namespace Foo;
class Decor
{
public static function neg($func)
{
return function() use($func) {
$v = call_user_func_array($func, func_get_args());
return -$v;
};
}
}
int(-1)
@a(A)
@b
@c(C)
function x(X)
{
Y
}
function x(X)
{ return call_user_func_array(a(b(c(function(X) {
Y
}, C)), A), func_get_args());}
call_user_func_array($func, func_get_args());@Decorator
public abstract class CoderDecorator implements Coder {
@Inject
@Delegate
@Any
Coder coder;
@Override
public String codeString(String s, int tval) {
...
}
}
На данный момент я проверил поддержку при выполнении кода с декораторами через:
php -a
Декораторы в PHP