#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"];
...
}