2017-01-11 2 views
3

Как заголовок спрашивает: нормально ли вызывать функцию, передаваемую по ссылке, еще не определенную?PHP: Действителен для вызова функции, передающей по ссылке переменную, еще не определенную?

Предположим, что переменная будет установлена ​​внутри Функция в любом случае.

я выкладываю пример кода, чтобы дать контекст вопроса:

function doStuff(&$error) 
{ 
    $error = false; 

    // Start doing stuff... 
    // ... 

    if(/* SOMETHING WRONG */) 
    { 
     $error = "Something went wrong"; 
    } 

} 


doStuff($err); // $err is not defined! 


if($err !== false) 
{ 
    // Handle the error, ex. 

    echo $err; 
    exit; 
} 

Я попробовал на кли с error_reporting (E_ALL); и никаких ошибок не было.

Еще я прошу подтверждение, если это безопасно, не имеют недостатков, не плохой шаблон кодирования ...

+0

Передача аргументов по ссылке ** есть ** плохой шаблона кодирования/привычка. Для человека, который читает строку 'doStuff ($ err)', не будет намека на то, что функция изменит переменную, переданную как аргумент. Кроме того, нет никакого намека на то, что функция не принимает литерал или константу в качестве аргумента. – axiac

+0

@axiac Если вы вызываете случайные функции, не читая их документацию, вам ничего не может помочь. Реферируемые параметры являются абсолютно правильной техникой для определенных ситуаций. – deceze

+0

Это очень полезно, когда вы хотите вернуть логическое значение и обновить некоторые данные массива. Однако это также можно выполнить с помощью объекта (oop), который хранит любые ошибки, и вы можете добавлять методы для дополнительной функциональности. Например. $ errorObj = new ErrorMessage(); DoStuff ($ errorObj); – Nitin

ответ

2

Переменные, которые передаются в качестве ссылочных параметров, не должны быть предварительно инициализированы; что вы делаете, все в порядке. Классическим примером такого случая использования является preg_match:

int preg_match (string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]]) 

Параметр &$matches используется сорт в качестве вторичного дополнительного выходного канала в дополнение к нормальному значению return (An int). Так как это один из основных применений значений пропускания по ссылке, разработчики языка позаботились, что она может быть использована в наиболее простом способе:

if (preg_match($foo, $bar, $match)) { 
    echo $match[0]; 
} 

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

$match = null; 
if (preg_match($foo, $bar, $match)) { 
    echo $match[0]; 
} 
+0

ситуация «раздражающего кода» - это именно то, чего я избегаю, как в коде, который я опубликовал в качестве примера.Спасибо за подробный ответ – Paolo

-1

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

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

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

  • Нет связанных вопросов^_^