2013-07-17 3 views
4

Если у меня есть следующее заявление:Вызов функции с переменными, которые не могут быть определены

$b = empty($a) ? "null" : "'$a'" 

Чтобы избежать копирования и вставки, я хотел бы поставить его в функцию:

function x($a) { 
    return empty($a) ? "null" : "'$a'" 
} 

Так что я могу сделать:

$b = x($a); // $a is not defined, so PHP complains 
$d = x($c); // same with $c 

Но тогда я получаю сообщение об ошибке с PHP, потому что $a не определен. Есть ли способ сделать это, за исключением использования оператора @?

EDIT: Я имею в виду ошибку, возникающую при вызове x(), а не внутри x(). Вы знаете, вы можете делать isset() и empty() на все, что не определено, и PHP никогда не будет жаловаться. Но если вы вызовете функцию с чем-то неопределенным, PHP будет жаловаться. В чем проблема.

+1

Почему вы работаете с переменной, которая не может быть определена? Что такое прецедент? –

+0

Переменные могут быть неопределенными по различным причинам. В этом случае я хотел бы рассматривать переменную как null, а не неопределенную. – forthrin

+1

Я согласен, что у вас есть произвольное количество неопределенных переменных, это запах кода. Только ввод, предоставленный пользователем, должен быть неизвестным, все остальное должно находиться в определенном состоянии. – deceze

ответ

3

Прежде всего это не ошибка, а уведомление, чтобы вы могли ее отключить.

Во-вторых, вы можете определить этот параметр как переданный по ссылке, чтобы избежать уведомления.

error_reporting(E_ALL); 

function x(&$a) { 
    var_dump('inside', $a); 
    return empty($a) ? "null" : "'$a'"; 
} 

$a = 4; 
var_dump('before', isset($a), isset($c)); 
$b = x($a); 
$d = x($c); 
var_dump('after', isset($a), isset($c)); 

var_dump($b, $d); 

выход:

string(6) "before" bool(true) bool(false) 
string(6) "inside" int(4) 
string(6) "inside" NULL 
string(5) "after" bool(true) bool(false) 
string(3) "'4'" string(4) "null" 
+0

, но почему ссылка не вызывает никаких предупреждений :) –

+2

, вероятно, потому, что вы можете использовать ссылки на дополнительные значения. вы можете передать несуществующее имя переменной, поскольку параметр и функция будут «создавать» его. например: preg_match ('/^def /', "abcdef", $ matches, PREG_OFFSET_CAPTURE, 3); print_r ($ matches); – fsw

+1

Тогда не используйте 'empty' внутри функции, потому что параметр никогда не будет« пустым », в лучшем случае это будет * falsey *. В целом мне не нравится этот подход, поскольку он также создает переменную в области вызова. Вы должны знать, какие переменные определены, а для тех, где вы не можете гарантировать это, 'isset' /' empty' - это путь. – deceze

-1

Как написано здесь http://www.php.net/manual/en/functions.arguments.php вы можете сделать что-то вроде этого:

function x($a=NULL) { 
    return empty($a) ? "null" : "'$a'" 
} 
+1

он все равно даст вам уведомление, когда вы попытаетесь вызвать x() для неопределенной переменной. – fsw

+0

Протестируйте его прямо сейчас. Не дает никаких уведомлений для меня. –

+1

Возможно, вы отключили уведомления. http://phpfiddle.org/lite/code/9nb-9rg – fsw

1

Вы также можете сделать это:

$a = 5; 
$b = "hi"; 

function var_test($var) { 
    global ${$var}; 
    return isset(${$var}) ? ${$var} : null; 
} 

var_dump(var_test("a")); 
var_dump(var_test("b")); 
var_dump(var_test("c")); 

Причина ${"var_name"} будет resovle в $var_name

+0

Это не решение для произвольных областей, а только глобальная область. – deceze

Смежные вопросы