PHP функция с переменной в качестве значения по умолчанию для параметра - PullRequest
29 голосов
/ 02 мая 2011

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

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

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

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

Ошибка разбора: синтаксическая ошибка, неожиданный T_VARIABLE

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

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

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

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

Ответы [ 6 ]

50 голосов
/ 02 мая 2011

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

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

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

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

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

4 голосов
/ 02 мая 2011
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 );
3 голосов
/ 02 мая 2011

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

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

function doSomethingWithID($id)
{
    //do something
}
1 голос
/ 23 мая 2019

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

define('ID',$_GET["ID"]);
function($id = _ID_){
    //code
}
1 голос
/ 26 августа 2016

Легкий арахис!
(Может содержать незначительные ошибки, ошибки или опечатки!)

Вам нужна вспомогательная функция, которая будет рекурсивно вызывать основную функцию, но по умолчанию она будет иметь значение 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));
}

Надеюсь, это поможет!

1 голос
/ 02 мая 2011

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

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

function actionOne( $id='something') {
    //code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...