PHP функция с переменной в качестве значения по умолчанию для параметра

#php #function #variables #parameters

#php #функция #переменные #параметры

Вопрос:

По умолчанию функция PHP использует $_GET переменные. Иногда эту функцию следует вызывать в ситуации, когда $_GET значение не задано. В этом случае я определю необходимые переменные как параметр, подобный: actionOne(234)

Чтобы получить абстрактный код, я попробовал что-то вроде этого:

 function actionOne($id=$_GET["ID"])
  

что приводит к ошибке:

Ошибка синтаксического анализа: неожиданная T_VARIABLE

Невозможно определить параметр по умолчанию с помощью переменной?

Редактировать

actionOne Вызывается «напрямую» из URL-адреса с использованием платформы Yii. Обрабатывая $_GET переменные вне этой функции, я должен был сделать это на центральном компоненте (даже если это простая, незначительная функция), или я должен изменить фреймворк, что мне не нравится делать.

Другим способом сделать это может быть фиктивная функция (что-то вроде предварительной функции), которая вызывается по URL. Эта «фиктивная» функция обрабатывает проблему с переменной и вызывает actionOne($id) .

Ответ №1:

Нет, это невозможно, как указано на странице руководства по аргументам функции:

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

Вместо этого вы могли бы либо просто передать значение null по умолчанию, либо обновить это в вашей функции…

 function actionOne($id=null) {
    $id = isset($id) ? $id : $_GET['ID'];
    ....
}
  

…или (что еще лучше), просто укажите $_GET[‘ID’] в качестве значения аргумента, когда у вас нет конкретного идентификатора для передачи. (т. е.: Обработайте это вне функции.)

Комментарии:

1. То же самое здесь, решение нарушает инкапсуляцию, проверка должна происходить вне функции.

2. Я обновил свой пост. В моем конкретном случае ваше решение выглядит наилучшим образом… (Я скоро это проверю) В общем, я, вероятно, использовал бы форму решения @Galen. Что вы имеете в виду, говоря «просто укажите $ _GET [‘ID’] в качестве значения аргумента»? Это соответствует вашему примеру?

3. не лучше ли использовать «$id===null?$id=$_GET[«ID»]:null;» вместо $id = isset($id) ? $id : $_GET[‘ID’];? Потому что вы избегаете одного присвоения $ id, если $ id все еще установлен ($ id = $ id) !?! .. или нет никакой разницы?

4. @Bndr Я имел в виду, что вы должны назначить $ id перед вызовом функции, а не в самой функции. Что касается вашего второго пункта — если вы беспокоитесь о накладных расходах на присвоение переменной, я подозреваю, что вам не следует использовать PHP. 🙂

5. @middaparka может быть! 😉 но моя версия присвоения $ id также применима?! Или ваша версия — это «лучшая практика»?

Ответ №2:

 function actionOne( $id=null ) {
    if ($id === null) $id = $_GET['ID'];
}
  

Но, я бы, вероятно, сделал это вне функции:

 // This line would change, its just a for instance
$id = $id ? $id : $_GET['id'];
actionOne( $id );
  

Комментарии:

1. привет, спасибо …. другого способа нет? … без решения этой проблемы внутри или вне этой функции?

2. Я все еще думаю, что вы должны предоставить хорошую практику в качестве основного примера и худшую практику в качестве альтернативы!

Ответ №3:

Вы должны получить этот идентификатор перед вызовом функции. Проверка существования параметра нарушает инкапсуляцию. Вы должны сделать что-то вроде этого:

 if (isset($_GET["ID"])
{
    $id = $_GET["ID"];
}
else
{
    //$id = something else
}

function doSomethingWithID($id)
{
    //do something
}
  

Ответ №4:

Вы могли бы использовать постоянную переменную

 define('ID',$_GET["ID"]);
function($id = _ID_){
    //code
}
  

Ответ №5:

Да, это невозможно.

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

 function actionOne( $id='something') {
    //code
}
  

Комментарии:

1. статическая переменная? и вы передаете строку? как это решает проблему?

2. Единственное, что называется динамической переменной в PHP afaik, это переменная-variable, и это также не решило бы проблему.

3. Ваше решение неверно, вы передаете строку в качестве значения по умолчанию, как это отвечает на исходный вопрос?

Ответ №6:

Простые орешки!
(Может содержать незначительные ошибки или опечатки!)

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

Неправильно: function actionOne($id=$_GET["ID"])

Правильно:

 function actionOne($id) {...}
function actionOnewithID($id=NULL) {
  if (NULL==$id){actionOne($_GET["ID"]);}
  else {actionOne($id);
}
  

И если вам нужно вернуть значение:

 function actionOne($id) {...}
function actionOnewithID($id=NULL) {
  if (NULL==$id){return(actionOne($_GET["ID"]));}
  else {return(actionOne($id));
}
  

Я надеюсь, что это поможет!

Ответ №7:

кратчайший путь — это:

 function actionOne($id = null)
{
     $id = $id ?? $_GET["ID"];
     ...
}