Это одно из мест, с помощью которого привязка данных, используемая во многих новых фреймворках JavaScript, будет очень полезна для вас ...
Итак, если вы используете Angular, React или любые другие фреймворки, которые делают два способа связывания данных, эта проблема просто исправлена для вас, поэтому простым языком ваш результат undefined
на первом этапе, поэтому вы получили result = undefined
до получения данных, а затем, как только вы получите результат , он будет обновляться и присваиваться новому значению, которое отвечает на ваш вызов Ajax ...
Но как вы можете сделать это в чистом javascript или jQuery, например, как вы задали этот вопрос?
Вы можете использовать обратный вызов, обещание и недавно наблюдаемое, чтобы обрабатывать его для вас, например, в обещаниях мы имеем некоторые функции, такие как success () или then (), которые будут выполняться, когда ваши данные будут готовы для вас, с функцией обратного вызова или подписки на наблюдаемые.
Например, в вашем случае, в котором вы используете jQuery, вы можете сделать что-то вроде этого:
$(document).ready(function(){
function foo() {
$.ajax({url: "api/data", success: function(data){
fooDone(data); //after we have data, we pass it to fooDone
}});
};
function fooDone(data) {
console.log(data); //fooDone has the data and console.log it
};
foo(); //call happens here
});
Для получения дополнительной информации n изучение обещаний и наблюдаемых, которые являются новыми способами для создания асинхронных материалов.
Как отметил @IbrahimLawal. Лучше всего установить их в значения null
. Просто проверьте, было ли переданное значение null
, в котором вы используете свои установленные значения по умолчанию.
<?php
define('DEFAULT_LIMIT', 50);
define('DEFAULT_PAGE', 1);
function getData($name, $limit = null, $page = null) {
$limit = is_null($limit) ? DEFAULT_LIMIT : $limit;
$page = is_null($page) ? DEFAULT_PAGE : $page;
...
}
?>
Надеюсь, это поможет.
Как было сказано ранее , ничего не изменилось. Помните, что слишком много параметров (особенно факультативных) - сильный индикатор запаха кода.
Возможно, ваша функция слишком много:
// first build context
$dataFetcher->setPage(1);
// $dataFetcher->setPageSize(50); // not used here
// then do the job
$dataFetcher->getData('some name');
Некоторые параметры могут быть сгруппированы логически:
$pagination = new Pagination(1 /*, 50*/);
getData('some name', $pagination);
// Java coders will probably be familiar with this form:
getData('some name', new Pagination(1));
В крайнем случае вы всегда можете ввести ad-hoc объект параметра :
$param = new GetDataParameter();
$param->setPage(1);
// $param->setPageSize(50); // not used here
getData($param);
(который является просто прославленным версия менее формального метода массива параметров )
Иногда сама причина для создания параметра необязательна. В этом примере $page
действительно означает, что это необязательно? Сохраняет ли несколько символов действительно значение?
// dubious
// it is not obvious at first sight that a parameterless call to "getData()"
// returns only one page of data
function getData($page = 1);
// this makes more sense
function log($message, $timestamp = null /* current time by default */);
Вы не можете пропускать аргументы, но можете использовать параметры массива, и вам нужно определить только один параметр, который является массивом параметров.
function myfunction($array_param)
{
echo $array_param['name'];
echo $array_param['age'];
.............
}
И вы можете добавить столько параметров, которые вам нужны , вам не нужно их определять. Когда вы вызываете функцию, вы ставите свои параметры следующим образом:
myfunction(array("name" => "Bob","age" => "18", .........));
getData('some name');
просто не передают их, и значение по умолчанию будет принято
Попробуйте это.
function getData($name, $limit = NULL, $page = '1') {
if (!$limit){
$limit = 50;
}
}
getData('some name', '', '23');
Для любого параметра, пропущенного (вам нужно) пойти с параметром по умолчанию, чтобы быть в безопасности.
(Устанавливается значение null, где параметр по умолчанию «или» или наоборот, или наоборот вы в беспокойство ...)
Ничего не изменилось в отношении возможности пропустить необязательные аргументы, однако для правильного синтаксиса и для того, чтобы указать NULL для аргументов, которые я хочу пропустить, вот как я это сделаю:
define('DEFAULT_DATA_LIMIT', '50');
define('DEFAULT_DATA_PAGE', '1');
/**
* getData
* get a page of data
*
* Parameters:
* name - (required) the name of data to obtain
* limit - (optional) send NULL to get the default limit: 50
* page - (optional) send NULL to get the default page: 1
* Returns:
* a page of data as an array
*/
function getData($name, $limit = NULL, $page = NULL) {
$limit = ($limit==NULL) ? DEFAULT_DATA_LIMIT : $limit;
$page = ($page==NULL) ? DEFAULT_DATA_PAGE : $page;
...
}
Это можно вызвать так: getData('some name',NULL,'23');
, и любой, кто вызывает функцию в будущем, не должен помнить значения по умолчанию каждый раз или объявленную для них константу.
Это то, что я сделал бы:
<?php
function getData($name, $limit = '', $page = '1') {
$limit = (EMPTY($limit)) ? 50 : $limit;
$output = "name=$name&limit=$limit&page=$page";
return $output;
}
echo getData('table');
/* output name=table&limit=50&page=1 */
echo getData('table',20);
/* name=table&limit=20&page=1 */
echo getData('table','',5);
/* output name=table&limit=50&page=5 */
function getData2($name, $limit = NULL, $page = '1') {
$limit = (ISSET($limit)) ? $limit : 50;
$output = "name=$name&limit=$limit&page=$page";
return $output;
}
echo getData2('table');
// /* output name=table&limit=50&page=1 */
echo getData2('table',20);
/* output name=table&limit=20&page=1 */
echo getData2('table',NULL,3);
/* output name=table&limit=50&page=3 */
?>
Надеюсь, это поможет кому-то
Этот фрагмент:
function getData($name, $options) { $default = array( 'limit' => 50, 'page' => 2, ); $args = array_merge($default, $options); print_r($args); } getData('foo', array()); getData('foo', array('limit'=>2)); getData('foo', array('limit'=>10, 'page'=>10));
Ответ:
Array ( [limit] => 50 [page] => 2 ) Array ( [limit] => 2 [page] => 2 ) Array ( [limit] => 10 [page] => 10 )
Невозможно «пропустить» аргумент, кроме как указать значение по умолчанию, например false
или null
.
Поскольку PHP не имеет какого-то синтаксического сахара, когда дело доходит до этого, вы часто увидите что-то вроде этого:
checkbox_field(array(
'name' => 'some name',
....
));
Который, как красноречиво сказал в комментариях, использует массивы для эмулировать именованные аргументы.
Это дает максимальную гибкость, но в некоторых случаях может не понадобиться. По крайней мере, вы можете перемещать то, что, как вы думаете, не ожидалось большую часть времени до конца списка аргументов.
Простой ответ: Нет. Но почему пропустить, когда переустановка аргументов достигает этого?
У вас есть «Неправильное использование аргументов функции по умолчанию» и не будет работать так, как вы ожидаете.
Замечание из документации PHP:
При использовании аргументов по умолчанию любые значения по умолчанию должны быть в правой части любых аргументов, отличных от значения по умолчанию; в противном случае все будет работать не так, как ожидалось.
blockquote>Рассмотрим следующее:
function getData($name, $limit = '50', $page = '1') { return "Select * FROM books WHERE name = $name AND page = $page limit $limit"; } echo getData('some name', '', '23'); // won't work as expected
Выход будет:
"Select * FROM books WHERE name = some name AND page = 23 limit"
Правильное использование аргументов функции по умолчанию должно быть похоже это:
function getData($name, $page = '1', $limit = '50') { return "Select * FROM books WHERE name = $name AND page = $page limit $limit"; } echo getData('some name', '23'); // works as expected
Выход будет:
"Select * FROM books WHERE name = some name AND page = 23 limit 50"
По умолчанию значение по умолчанию справа от значений, отличных от значений по умолчанию, гарантирует, что он всегда будет перенастроить значение по умолчанию для этого переменная, если ее не определено / задано. Здесь ссылка для ссылки и откуда взялись эти примеры.
Редактирование: установка этого параметра на
null
, как показывают другие, может работать и другая альтернатива, но может не соответствовать тому, что вы хотите. Он всегда будет устанавливать значение по умолчанию равным null, если оно не определено.
Хорошо, как и все остальные сказали, что то, что вы хотите, не будет возможно в PHP без добавления каких-либо кодовых строк в функцию.
Но вы можете поместить этот кусок кода в начало чтобы получить вашу функциональность:
foreach((new ReflectionFunction(debug_backtrace()[0]["function"]))->getParameters() as $param) {
if(empty(${$param->getName()}) && $param->isOptional())
${$param->getName()} = $param->getDefaultValue();
}
Итак, в основном с помощью debug_backtrace()
Я получаю имя функции, в которой этот код помещен, чтобы затем создать новый ReflectionFunction
, но все аргументы функции.
В цикле я просто проверяю, является ли аргумент функции empty()
И аргумент «необязателен» (означает, что он имеет значение по умолчанию). Если да, я просто присваиваю значение по умолчанию аргументу.
Вы не можете пропустить средний параметр в вызове функции. Но вы можете работать с этим:
function_call('1', '2', '3'); // Pass with parameter.
function_call('1', null, '3'); // Pass without parameter.
Функция:
function function_call($a, $b='50', $c){
if(isset($b)){
echo $b;
}
else{
echo '50';
}
}
Установите ограничение на значение null
function getData($name, $limit = null, $page = '1') {
...
}
и вызовите эту функцию
getData('some name', null, '23');
, если вы хотите установить предел, который вы можете передать в качестве аргумента
getData('some name', 50, '23');
Ваше сообщение верное.
К сожалению, если вам нужно использовать необязательный параметр в самом конце списка параметров, вам нужно указать все до последнего параметра. Как правило, если вы хотите смешивать и сопоставлять, вы даете им значения по умолчанию ''
или null
и не используете их внутри функции, если они являются значением по умолчанию.