Подавление ошибок аргумента функции php, эмуляция empty () isset () - PullRequest
9 голосов
/ 10 сентября 2008

Я почти уверен, что ответ на этот вопрос - нет, но в случае, если есть какой-то гуру PHP

возможно ли написать функцию таким образом, чтобы в нее можно было передавать недопустимые аргументы или несуществующие переменные, и php не будет выдавать ошибку без использования '@'

Очень похоже на пустое и isset do. Вы можете передать только что созданную переменную, и она не выдаст ошибку.

ex:

empty($someBogusVar); // no error

myHappyFunction($someBogusVar); // Php warning / notice

Ответы [ 14 ]

9 голосов
/ 23 ноября 2008

Вы не получаете никакой ошибки, когда переменная передается по ссылке (PHP создаст новую переменную без уведомления):

 function myHappyFunction(&$var)
 {       
 }

Но я рекомендую не злоупотреблять этим для сокрытия ошибок программирования.

7 голосов
/ 11 сентября 2008

Подводя итог, правильный ответ: нет, вы не должны (см. Предостережение ниже).

Есть обходные пути, уже упомянутые многими людьми в этой теме, такие как использование ссылочных переменных или isset () или empty () в условиях и подавление уведомлений в конфигурации PHP. Это в дополнение к очевидному обходному пути, используя @, который вам не нужен.

Обобщение интересного комментария с Джерри : Передача переменной по ссылке действительно допустима, если вы проверяете значение переменной внутри функции и правильно обрабатывает неопределенные или нулевые случаи , Только не используйте передачу ссылок как способ отключения PHP (это то, на что мой оригинал не должен указывать).

3 голосов
/ 10 сентября 2008

Вы можете сделать это, используя func_get_args, например:

error_reporting(E_ALL);
ini_set('display_errors', 1);

function defaultValue() {
    $args = func_get_args();

    foreach($args as $arg) {
        if (!is_array($arg)) {
            $arg = array($arg);
        }
        foreach($arg as $a) {
            if(!empty($a)) {
                return $a;
            }
        }
    }

    return false;
}

$var = 'bob';

echo defaultValue(compact('var'), 'alpha') . "\n"; //returns 'bob'
echo defaultValue(compact('var2'), 'alpha') . "\n"; //returns 'alpha'
echo defaultValue('alpha') . "\n"; //return
echo defaultValue() . "\n";

Эта функция продвигается на один шаг дальше и выдаст вам первое непустое значение из любого числа аргументов (вы всегда можете заставить его принять только два аргумента, но для меня это выглядит более полезным)

РЕДАКТИРОВАТЬ: исходная версия не использовала компактный, чтобы попытаться создать массив аргументов, и STILL выдал ошибку. Отчеты об ошибках поднялись на ступеньку выше, и эта новая версия с compact немного менее аккуратна, но все же делает то же самое и позволяет указать значение по умолчанию для несуществующих переменных.

2 голосов
/ 08 декабря 2009

Существуют допустимые случаи, когда проверка становится громоздкой и необоснованной.
Поэтому я написал эту маленькую магическую функцию:

/**
 * Shortcut for getting a value from a possibly unset variable.
 * Normal:
 *   if (isset($_GET['foo']) && $_GET['foo'] == 'bar') {
 * Short:
 *   if (value($_GET['foo']) == 'bar') {
 *
 * @param mixed  $variable 
 * @return mixed  Returns null if not set
 */
function value(&$variable) {
    if (isset($variable)) {
        return $variable;
    }
}

Не требуется никаких изменений для myHappyFunction ().
Вам придется изменить

myHappyFunction($someBogusVar);

до

myHappyFunction(value($someBogusVar));

Заявление о вашем намерении. что делает это хорошей практикой в моей книге.

1 голос
/ 20 мая 2009

возможно ли написать функцию таким образом, чтобы в нее могли быть переданы недопустимые аргументы или несуществующие переменные, и php не будет выдавать ошибку без использования '@'

Да, вы можете!

porneL правильный [править: У меня недостаточно очков, чтобы дать ссылку на его ответ или проголосовать, но он на этой странице]

Он также прав, когда предупреждает: «Но я не рекомендую злоупотреблять этим, чтобы скрыть ошибки программирования». однако по этой же причине следует избегать подавления ошибок с помощью оператора контроля ошибок (@).

Я новичок в Stack Overflow, но я надеюсь, что неправильный ответ не будет оценен как самый высокий на странице, в то время как правильный ответ не получает голосов. (

1 голос
/ 10 сентября 2008

Нет, потому что это не имеет ничего общего с функцией; ошибка возникает из-за попытки отменить ссылку на несуществующий ключ массива. Вы можете изменить уровень предупреждений в вашей настройке PHP, чтобы избежать этих ошибок, но вам лучше просто не делать этого.

Сказав это, вы могли бы сделать что-то вроде

function safeLookup($array, $key)
{
  if (isset($array, $key))
    return $array[$key];

  return 0;
}

И использовать его вместо поиска ключа массива

defaultValue(safeLookup($foo, "bar"), "baz);

Теперь мне нужно принять душ :)

0 голосов
/ 05 июня 2012

С помощью одной строки вы можете добавить его: myHappyFunction($someBogusVar="");

Надеюсь, это то, что вы ищете. Если вы прочитаете документацию php в разделе значения аргумента по умолчанию , вы увидите, что назначение значения по умолчанию для аргумента функции помогает предотвратить сообщение об ошибке при использовании функций.

В этом примере вы можете увидеть разницу в использовании аргумента по умолчанию и его преимущества:

Код PHP:

<?php
function test1($argument)
{
    echo $argument;
    echo "\n";
}

function test2($argument="")
{
    echo $argument;
    echo "\n";
}

test1();
test1("Hello");
test1($argument);
$argument = "Hello world";
test1($argument);

test2();
test2("Hello");
test2($argument);
$argument = "Hello world";
test2($argument);
?>

Вывод для test1() строк:

Предупреждение : отсутствует аргумент 1 для test1 ().
Привет.
,
Привет, мир.

Вывод для test2() строк:

.
Привет.

Привет, мир.

Это также может использоваться в сочетании с isset() и другими функциями для достижения желаемого.

0 голосов
/ 31 мая 2009

Если вы просто добавите значение по умолчанию к параметру, вы можете пропустить его при вызове функции. Например:

function empty($paramName = ""){
    if(isset($paramName){
        //Code here
    }
    else if(empty($paramName)){
        //Code here
    }
}
0 голосов
/ 02 февраля 2009

Хотя ответ на оригинальный вопрос «нет», есть варианты, о которых никто не упомянул.

Когда вы используете знак @, все, что PHP делает, - это перезаписывает уровень error_reporting и временно устанавливает его на ноль. Вы можете использовать "ini_restore('error_reporting');", чтобы вернуть его к тому, что было до использования @.

Это было полезно для меня в ситуации, когда я хотел написать вспомогательную функцию для проверки и определения, установлена ​​ли переменная, и имеет ли она также некоторые другие свойства, в противном случае возвращает значение по умолчанию. Но, отправка неустановленной переменной через вызывало уведомление PHP, поэтому я использовал @ для подавления этого, но затем установил error_reporting обратно к исходному значению внутри функции.

Что-то вроде:

$var = @foo($bar);

function foo($test_var)
{
     ini_restore('error_reporting');

     if(is_set($test_var) && strlen($test_var))
     {
          return $test_var;
     }
     else
     {
          return -1;
     }
}

Итак, в приведенном выше случае, если $bar не установлено, я не получу сообщение об ошибке при вызове foo() с несуществующей переменной. Тем не менее, я получу ошибку из функции, в которой я ошибочно набрал is_set вместо isset.

Это может быть полезным вариантом, охватывающим то, что первоначальный вопрос задавал по духу, если не на самом деле.

0 голосов
/ 10 сентября 2008

Шон, ты мог бы сделать:

$result = ($func_result = doLargeIntenseFunction()) ? $func_result : 'no result';

EDIT:

Я уверен, что мог бы быть великий обсуждение троичных операторов vrs вызовы функций. Но суть этого Вопрос заключался в том, чтобы увидеть, можем ли мы создать функция, которая не выдаст ошибку, если несуществующее значение передается в без использования '@'

И я сказал вам, проверьте это с isset(). Первая часть троичного условия не проверяет нуль или не ноль, она проверяет true или false. Если вы попытаетесь проверить true или false на нулевое значение в PHP, вы получите эти предупреждения. isset() проверяет, возвращает ли переменная или выражение нулевое значение или нет, и возвращает логическое значение, которое может быть оценено первой частью вашей троицы без каких-либо ошибок.

...