PHP: Параметри та аргументи функції. Php помилка - Неприпустимий аргумент foreach() Значення, що повертається функцією

Ваше повідомлення правильне.

На жаль, якщо вам потрібно використовувати необов'язковий параметр у кінці списку параметрів, вам потрібно вказати все до останнього параметра. Як правило, якщо ви хочете змішувати та зіставляти, ви даєте їм значення за умовчанням "" або null і не використовуєте їх усередині функції, якщо вони є значенням за промовчанням.

Неможливо «пропустити» аргумент, крім вказати значення за замовчуванням як false або null .

Оскільки PHP не вистачає синтаксичного цукру, коли справа доходить до цього, ви часто побачите щось на кшталт цього:

Checkbox_field(array("name" => "some name", ....));

Який, як красномовно сказав у коментарях, використовує масиви для емуляції названих аргументів.

Це дає максимальну гнучкість, але в деяких випадках може не знадобитися. Принаймні, ви можете перемістити все, що, на вашу думку, не очікується здебільшого до кінця списку аргументів.

Ні, неможливо пропустити аргументи в такий спосіб. Ви можете пропустити передавальні аргументи тільки в томуякщо вони знаходяться в кінці списку параметрів.

Для цього була офіційна пропозиція: https://wiki.php.net/rfc/skipparams, який отримав відмову. Сторінка пропозиції пов'язана з іншими питаннями SO на цю тему.

Нічого не змінилося щодо можливості пропустити необов'язкові аргументи, проте для правильного синтаксису і для того, щоб вказати NULL для аргументів, які я хочу пропустити, ось як це я зроблю:

Define("DEFAULT_DATA_LIMIT", "50"); define("DEFAULT_DATA_PAGE", "1"); /** * getData * get a page of data * * Parameters: * name - (required) name of data to obtain * limit - (optional) send NULL to get the default limit: 50 * page - (optional) ndull до get the default page: 1 * Returns: * a page of data as array */ function getData($name, $limit = NULL, $page = NULL) ( $limit = ($limit==NULL) ? DEFAULT_DATA_LIMIT: $limit; $page = ($page==NULL) ?

Це можна назвати так: getData("some name", NULL, "23"); і кожен, хто викликає функцію в майбутньому, не повинен пам'ятати значення за умовчанням щоразу або константу, оголошену для них.

Проста відповідь: Ні. Але чому пропустити, коли перевстановлення аргументів досягає цього?

Ваш – « Неправильне використання аргументів функції за промовчанням» і не працюватиме так, як ви очікуєте.

Сторона примітки з документації PHP:

При використанні аргументів за промовчанням будь-які значення за промовчанням мають бути у правій частині будь-яких аргументів, відмінних від значень за промовчанням; в іншому випадку все працюватиме не так, як очікувалося.

Розглянемо таке:

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 інші, може працювати і є іншою альтернативою, але може не відповідати тому, що ви хочете. Він завжди встановлює значення за промовчанням рівним null, якщо його не визначено.

Як згадувалося вище, ви не зможете пропустити параметри. Я написав цю відповідь, щоб надати деяке додавання, яке було надто великим для розміщення в коментарі.

@Frank Nocke пропонує викликати функцію з її параметрами за промовчанням, наприклад, маючи

Function a($b=0, $c=NULL, $d="")( //...

ви повинні використовувати

$ var = a (0, NULL, "ddd");

який функціонуватиме так само, як опустити перші два параметри ($b і $c).

Незрозуміло, які з них є стандартними значеннями (задано значення 0 щоб вказати значення за замовчуванням, чи це важливо?).

Також існує небезпека того, що проблема значень за замовчуванням пов'язана із зовнішньою (або вбудованою) функцією, коли значення за промовчанням можуть змінюватися автором функції (або методу). Тому, якщо ви не зміните свій виклик у програмі, ви можете ненавмисно змінити його поведінку.

Деяке обхідне рішення може полягати у визначенні деяких глобальних констант, таких як DEFAULT_A_B, які будуть «за промовчанням для параметра B параметра функції A» і «опустити» таким чином:

$ var = a (DEFAULT_A_B, DEFAULT_A_C, "ddd");

Для класів це простіше та елегантніше, якщо ви визначаєте константи класу, тому що вони є частиною глобальної області, наприклад.

Class MyObjectClass ( const DEFAULT_A_B = 0; function a($b = self::DEFAULT_A_B)( // method body ) ) $obj = new MyObjectClass(); $var = $obj->a(MyObjectClass::DEFAULT_A_B); // etc.

Зверніть увагу, що ця константа за умовчанням визначена рівно один раз протягом всього коду (немає значення навіть в оголошенні методу), тому у разі несподіваних змін ви завжди будете забезпечувати функцію/метод правильним значенням за промовчанням.

Ясність цього рішення, звісно, ​​краще, ніж надання необроблених значень за умовчанням (наприклад, NULL , 0 т. буд.), які щось говорять читачеві.

(Я згоден, що виклик як $var = a(,"ddd"); буде найкращим варіантом)

Для будь-якого параметра, пропущеного (ви повинні) піти з параметром за промовчанням, щоб бути в безпеці.

(Settling for null, де параметр за замовчуванням дорівнює "" або аналогічний або навпаки, приведе вас у проблему...)

Ви не можете пропускати аргументи, але можете використовувати параметри масиву, і вам потрібно визначити лише один параметр, який є масивом параметрів.

Function myfunction($array_param) ( echo $array_param["name"]; echo $array_param["age"]; ............. )

І ви можете додати стільки параметрів скільки вам потрібно, вам не потрібно їх визначати. Коли ви викликаєте функцію, ви ставите свої параметри так:

Myfunction(array("name" => "Bob", "age" => "18", .........));

Ну, як всі вже сказали, що те, що ви хочете, не буде можливим у PHP без додавання будь-яких кодових рядків у функції.

Але ви можете розмістити цей фрагмент коду у верхній частині функції, щоб отримати ваші функції:

Foreach((new ReflectionFunction(debug_backtrace()["function"]))->getParameters() as $param) ( if(empty($($param->getName())) && $param->isOptional()) $($param->getName()) = $param->getDefaultValue();

Так що в основному з debug_backtrace() я отримую ім'я функції, в якій цей код розміщений, щоб потім створити новий об'єкт ReflectionFunction і цикл, хоча всі аргументи функції.

У циклі я просто перевіряю, чи є аргумент функції empty() та аргумент «необов'язковий» (означає, що він має значення за умовчанням). Якщо так, я просто надаю значення за умовчанням аргументу.

демонстрація

Встановіть межу в null

Function getData($name, $limit = null, $page = "1") ( ... )

та виклик цієї функції

GetData("some name", null, "23");

якщо ви хочете встановити межу, яку ви можете передати як аргумент

GetData("some name", 50, "23");

Як було сказано раніше, нічого не змінилося. Остерігайтеся, однак, дуже багато параметрів (особливо додаткових) – сильний індикатор запаху коду.

Можливо, ваша функція занадто багато:

/ / First build context $ dataFetcher-> setPage (1); // $ dataFetcher-> setPageSize (50); // не використовує її // , щоб зробити $ $Fetcher->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 = новий 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 */);

Цей фрагмент:

Функція getData ($name, $ options) ($ default = масив ("limit" => 50, "page" => 2,); $ args = array_merge ($ default, $ options); print_r ($ арг); ) getData("foo", array()); getData ("foo", array ("limit" => 2)); getData ("foo", array ("limit" => 10, "page" => 10));

Масив ( => 50 [сторінка] => 2) масив ( => 2 [сторінка] => 2) масив ( => 10 [сторінка] => 10)

Це те, що я зробив би:

Сподіваюся, це допоможе комусь

Спробуй це.

Function getData($name, $limit = NULL, $page = "1") ( if (!$limit)( $limit = 50; ) ) getData("some name", "", "23");

Ви не можете пропустити середній параметр у виклику функції. Але ви можете обійти це:

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"; ) )

Як зазначив @IbrahimLawal. Найкраще просто встановити їх на null значення. Просто перевірте, чи має значення значення null, в якому ви використовуєте свої встановлені значення за замовчуванням.

Надіюсь це допоможе.

GetData("some name");

просто не передавайте їх, і значення за замовчуванням буде прийнято

>

Php функції

>

Php скрипти

func_get_arg

func_get_arg-- Повертає елемент зі списку аргументів

Опис

mixed func_get_arg (int arg_num)

Повертає arg_num -ий аргумент зі списку аргументів функції користувача. Нумерація аргументів функції починається із нуля. func_get_arg()генерує попередження при виклику поза визначенням функції.

Якщо arg_num більше кількості переданих аргументів, буде згенеровано попередження та func_get_arg()поверне FALSE .

function foo ()
{
$numargs = func_num_args();
echo"Number of arguments: $numargs
\n" ;
if($numargs >= 2) (
echo"Second argument is:". func_get_arg (1) . "
\n" ;
}
}

Foo (1, 2, 3);
?>

func_get_arg()може бути використана спільно з func_num_args()і func_get_args()для створення функцій із змінною кількістю аргументів.

User Contributed Notes

bishop
11-Dec-2004 08:58

Regarding a "deferment" operator for dvogel at ssc dot wisc dot edu, pick your poison:

/ / using ternary operators
function pick ($a, $b) ( return ( isset($a)? $a: $b); )
$ a = (pick ($ b, $ c)? pick ($ c, $ d): null);
?>
// Використання varargs function
function pick ($a) (
$a rg c= func_num_args();
for($i = 0; $i< $a rg c; $i++) (
$a rg = func_get_arg($i);
if (! is_null ($a rg)) {
return $a rg ;
}
}

Return null;
}

$a = pick ($b, $c, $d);
?>


mw atto lanfear dotto com
08-Dec-2004 01:56

func_get_arg() Does no appear to be allowed to be used as a function argument itself within class constructors in PHP 5.0.2 (wonk-ay!):

class ABC
{
function __construct()
{
foreach(func_get_args () as $name => $value )
{
echo <<

$name : $value


EOT;
}
}
}

class DEF extends ABC
{
function __construct()
{
parent:: __construct ( func_get_arg (0),
func_get_arg (1),
func_get_arg (2));
}
}

$d ef = new DEF (123123, "asdfasdf", "blahblahblah");

The above script generates:

Fatal error: func_get_arg(): Can't be used as a function parameter in c:\Inetpub\wwwroot\phpwasrc\chapter10\xxx on line 23

Там є, але, немає проблем, коли проходять ці параметри до регулярних функцій.
dvogel at ssc dot wisc dot edu
22-Oct-2004 01:54

I've always wants a deferment or cascade operator so that I could use this expression:

$a = $b ## $c ## $d;

І все, що в праві assignment operator може бути виявлено в left-most value that is not null. It is essentially a collapsed version of this:

if($b) (
$a =$b;
} else {
if($c) (
$a =$c;
} else {
if($d) (
$a = $d;
} else {
$a = null;
}
}
}

In leiu of this, I'm trying to make a function that takes a variable number of arguments and returns the first that is not null. these reference.

Тільки Solution I може думати про те, що існують параметри to reference of the arrayПерший. e.g.

$a = array (...);
$ b = 0;
$c =
first_not_null($a, $b);

Does anyone know a better solution?
harald at triptop dot org
15-Sep-2004 02:09

func_get_arg is useful, ifви знаєте, як жити за словами, або if the order doesn"t matter. i use this function (or func_get_args) for example to create own sprintf wrappers.

ifВи хочете, щоб перейти до variable number of arguments to function it"s in my opinion better, to submit it as a key/value array e.g.:

functioncall ( array("param1" => "...",...));
?>

And "extract" the array inside the all.php?act=funct&argument= Ви не хочете, щоб tricks як type-checking for parameter-recognition, в цьому випадку.
04-Jun-2004 05:16

I actually think that there is need forТакі "в цілому everything" функцій. I use them mostly as tools for rapid prototyping.
And there is a method with which you may be able to pass several strings to a function: ereg ();
Another use for such functions is to create little code snippets forінші люди з них. Вони будуть, щоб функціонувати будь-який longer ifвони не можуть використовувати параметр. They just don"t name it when calling the all.php?act=funct&argument=
Це результати в усіх функціях, які є дуже міцними в їхньому використанні. Normally ви повинні мати короткий код snippet (e.g. ip-blocking snippets). Через цей тип програмування ви маєте всі функції.
26-May-2004 08:29

Velmi clever unless you need to specify at least two parameters of the same type - which is which? Очевидно, ви можете запропонувати деякі додатки, але всі ті, що gets ugly. What if you need a string ONLY if a boolean was also supplied? Type-checking becomes main focus of your function, shit. ForЗахист clean code ви повинні specify a clean interface до ваших функцій, і вирішують, на який і куди є прописаний як argument. Yes, you can always code a do_absolutely_everything() function, але is there any sense?
anders at ingemann dot fakestuff dot de
30-Apr-2004 03:18

A pretty cool thing for user defined functions is only to submit the needed parameters. If You call a function that has three optional parameters you have to define the two first ones (even ifвони повинні stay як defined standard in the function) before your are able to tell the function what the third important parameter is. Instead you might as well just find out the pattern or the type of the submitted parameter which variable it should be assigned to.
like this:

function whatever ()
{
for($i = 0; $i< func_num_args (); $i ++)
{
if (is_bool (func_get_arg($i))) $log_ip = func_get_arg($i);
if (is_int (func_get_arg($i))) $limit = func_get_arg($i);
if (is_string (func_get_arg($i))) $name = func_get_arg($i);
}
}
?>

Now you can call the function with any parameter you want.
e.g.:

in that case$limit would be defined with 3600.

It doesn"t matter if you do this:


or this:

or this:

You may also use ereg(). Через те, що ви можете використовувати більше одного параметра як string.
hmm probably ereg() is the best solution...
never mind.
just check it out ;-)
mightye (at) mightye (dot) org
12-Mar-2004 08:45

func_get_arg() returns a * copy* of the argument, мої досліди не є способом відновити references to a variable number of arguments.

Я мав модульну систему в моїй грі , де я маю можливість перейти до variable number of arguments to functions in module, and pass them by reference if the module asks for it by reference, but you can't accept optional parameters as references, nor can can you retrieve the reference on a variable number of arguments.
martin at classaxe dot com
07-Jun-2002 09:55

Ця функція при elegantne doesn"t в itself avoid the problem of generating warning messages where variables not set, unless of course you switched warnings off:
error_reporting(E_ERROR);

The answer for those of who like to see necessary warnings?
Call it like this:
@allSet($w, $x, $y, $z)

Параметри зазначаються у визначенні функції, всередині круглих дужок, і є локальними змінними, тобто. вони видно лише у її тілі, якщо параметрів кілька, всі вони вказуються через кому. У разі виклику функція може отримувати аргументи, за допомогою яких ініціалізуються параметри.

Що таке параметри ми розглянули, тепер дізнаємося, якими значеннями вони ініціалізуються. Значення, які будуть присвоєні параметрам називаються аргументами - це може бути, наприклад, рядковий або цілочисленний літерал, змінна або якийсь складніший вираз, що складається зі змінних і операторів, але який може бути обчислений інтерпретатором PHP для отримання значення, яким буде ініціалізований параметр. Простіше кажучи, аргумент – це передане функції значення:

Передача аргументів

PHP підтримує два способи передачі аргументів функції. Перший – передача аргументів за значенням (працює за умовчанням), другий – передача аргументів за посиланням. Також PHP підтримує стандартні значення. Давайте розглянемо всі три варіанти докладніше.

За замовчуванням аргументи передаються у функцію за значенням (це означає, якщо ви зміните значення параметра всередині функції, то поза нею передане значення залишиться тим самим):

$color колір"; // Значення змінної не змінилося?>

Якщо необхідно дозволити функції змінювати передані аргументи за її межами, ви повинні надсилати їх за посиланням. Для того, щоб аргумент був переданий за посиланням, необхідно вказати знак & (амперсанд) перед ім'ям параметра визначення функції:

Функції можуть визначати значення аргументів за промовчанням. Щоб встановити значення за умовчанням, у визначенні функції потрібно лише присвоїти параметру бажане значення:

\n"; ) echo tea(); // виведе значення за замовчуванням echo tea("чорний"); ?>

Примітка: всі параметри, для яких встановлено значення аргументів за замовчуванням, повинні бути правішими за аргументи, для яких значення за замовчуванням не задані, тому що в іншому випадку ваш код може працювати не так, як ви того очікували:

Значення, що повертається функцією

Коли виконання функції завершується, вона може повернути деяке значення (результат роботи функції) програмі, що її викликала. Оператор return всередині функцій служить визначення значення, повертаного функцією. Як значення, що повертається може бути будь-який тип. Він має наступний синтаксис:

Return вираз;

Оператор return може бути розташований у будь-якому місці функції. Коли до нього доходить керування, функція повертає значення (якщо вказано) і завершує виконання. Якщо оператор return не вказано або не вказано значення, що повертається, то функція поверне значення NULL . Для використання значення, що повертається, результат виконання функції можна привласнити наприклад змінної:

// => 16. function foo($num) ( if($num === 10) return "$num дорівнює 10"; else return "$num не дорівнює 10"; echo "hello"; // ця рядок коду ніколи не виконається) echo foo(6);

Чи є це можливо в PHP 4/5 для конкретної назви опційного параметра, коли calling, skipping on ou don't want to specify (like in python) ?

Function foo($a,$b="", $c="") ( // whatever ) foo("hello", $c="bar"); // we want $b as the default, but specify $c

No, it is not possible: if you want to pass the third parameter, you have to pass the second one. І названі параметри не можуть бути ними.

A “solution” може бути використаний тільки для одного параметра, array, і завжди pass it… Але не буде визначено все в цьому.

Function foo($params) ( var_dump($params); )

And calling it this way:

Foo(array("a" => "hello",)); foo(array("a" => "hello", "c" => "glop",)); foo(array("a" => "hello", "test" => "another one",));

Will get you this output:

Array "a" => string "hello" (length=5) array "a" => string "hello" (length=5) "c" => string "glop" (length=4) array "a" => string "hello" (length=5) "test" => string "another one" (length=11)

But I don’t really like this solution:

  • You will lose the phpdoc
  • Your IDE не може бути забезпечений будь-яким часом... Which is bad

So I’d go with this only in very specific cases — for functions with lots of optionnal parameters, for instance…

No, PHP не може pass arguments by name.

Якщо ви маєте функцію, що має безліч arguments і всі вони мають низку цінностей, які можуть вважати, що функція залежить від array of arguments instead:

Function test (array $args) ( $defaults = array("a" => "", "b" => "", "c" => ""); $args = array_merge($defaults, array_intersect_key($args) , $defaults));list($a, $b, $c) = array_values($args); // an alternative to list(): extract($args); , $ c )

Тільки тільки ви можете деякий час, щоб скористатися настройками з наміченими кнопками і які немає.

З PHP, на основі arguments is what matters. Ви можете визначати особливу особливу увагу від місця, але не встановлюються, ви можете скинути argumentи, щоб пройти до NULL, як довгий, як ви не думаєте про вашу функцію в NULL value.

Foo("hello", NULL, "bar");

As of PHP 5.4ви маєте шорстку та array syntax (не має шкоди для особливих arrays з кількома деякими “array” and instead use “”).

Ви можете mimic named parameters in many ways, 1 good and simple way might be:

Bar("one", ["a1" => "two", "bar" => "three", "foo" => "four"]); // output: twothreefour function bar ($a1, $kwargs = ["bar" => null, "foo" => null]) ( extract($kwargs); echo $a1; echo $bar; echo $foo; )

It's not exactly pretty, але it does the trick, some might say.

Class NamedArguments ( static function init($args) ( $assoc = reset($args); if (is_array($assoc))) ( $diff = array_diff(array_keys($assoc), array_keys($args))); if (empty ($diff)) return $assoc; trigger_error("Invalid parameters: ".join(",",diff), E_USER_ERROR); optional1 = "", $optional2 = "") ( extract(NamedArguments::init(get_defined_vars()))); printf("required: %s; optional1: %s; optional1, $optional2); ) ) Test::foobar("required", "optional1", "optional2"); Test::foobar(array("required" => "required", "optional1" => "optional1", "optional2" => "optional2"));

Ви можете потрапити на phpdoc і здатність до набору додатків до проходження object об'єкта array, e.g.

Class FooOptions ($opt1 = "x"; $opt2 = "y"; /* etc */);

Що також lets you do strict typ checking у вашу функцію call, if you want to:

Function foo (FooOptions $opts) ( ... )

З курсу, ви можете скористатися платою для того, щоб з extra verbosity налаштувати на FooOptions об'єкт. There's no totally-free ride, unfortunately.

Зазвичай вам може бути, але я думаю, що багато способів, щоб пройти назви arguments до функції PHP. Personally I relay on the definition using arrays and just call what I need to pass:

Class Test( public $a = false; private $b = false; public $c = false; public $d = false; public $e = false; public function _factory()( $args = func_get_args(); $args = $ args; $this->a = array_key_exists("a",$args) : $0is->b = array_key_exists("b",$args["b" ] : 0; $this->c = array_key_exists("c",$args) : $0is->d = array_key_exists("d",$args[) d"] : 0; $this->e = array_key_exists("e",$args) ? $args["e"] : 0; ) public function show()( var_dump($this); ) ) $test = new Test(); $args["c"]=999; $test->_factory($args); $test->show();

Якщо ми маємо пройти 10 arguments, і три з них є дані, які дійсно потрібні, НЕ NOT EVEN SMART, щоб пройти в функцію деякого як

Return myfunction(false, false, 10, false, false, "date", false, false, false, "desc");

З approach I'm giving, ви можете зробити any of the 10 arguments into an array:

$arr["count"]=10; $arr["type"]="date"; $arr["order"]="desc"; return myfunction($arr);

I have a post в моїм blog explaining цей процес в more details.

Here's what I've been using. Функція визначення такої одної опційної array argument, які specifies the optional named arguments:

Function func($arg, $options = Array()) ( $defaults = Array("foo" => 1.0, "bar" => FALSE); $options = array_merge($default, $options); // Normal function body here. Use $options["foo"] and // $options["bar"] to fetch named parameter values.

Ви можете регулярно говорити без будь-яких назв arguments:

Func("xyzzy")

Для того, щоб запропонувати додатковий argument, pass it в опційній array:

Func("xyzzy", Array("foo" => 5.7))

No no really. Там є кілька варіантів, які ви можете використовувати.

Test(null,null,"hello")

Or pass an array:

Test(array("c" => "hello"));

Then, the function could be:

Function test($array) ( $c = isset($array[c]) ? $array[c] : ""; )

Or add a function in between, but i would not suggest this:

Function ctest($c) ( test("","",$c); )

Try function test ($a="",$b="",&$c="")()

Putting & before the $c

I dont think so…
Якщо ви потребуєте телефонувати, для прикладу, функція substr, що має 3 params, і want to set the $length without set $start, you'll be forced to do so.

Substr($str,0,10);

a nice way to override this is to always use arrays for parameters

Simple answer. No you can’t.
Ви можете спробувати зробити це, щоб пройти в об'єкті/завжди або використовувати деякі інші регуляції внесення змін.

Also, try to use nulls rather than empty strings as it's more definite to test for their existence using is_null()

Function test ($a=null,$b=null,$c=null)( if (is_null($a) ( //do something about $a ) if (is_null($b) ( //do something about $b ) if (is_null($c) ( //do something about $c ) )

Test(null,null,"Hello");

У дуже шорти, деяківідомі, за допомогою рефлексії і типових змін. However I think this is probably no what you are after.

Щоб вирішити вашу проблему, це можливо, щоб програти в 3-х arguments як функцій handle the missing one inside your function yourself

You can't do it the python way. Anway, ви можете pass an associative array і без використання array entries by their name:

Function test ($args=array("a"=>"","b"=>"","c"=>"")) ( // do something ) test(array("c"=>"Hello "));

Це не зменшує типування, але в ньому більше, ніж описано, має arguments' назви visible і readable in the call.

Here is a work around:

Function set_param_defaults($params) ( foreach($params["default_values"] as $arg_name => $arg_value) ( ​​if (!isset($params[$arg_name]))) ( $params[$arg_name] = $arg_value; ) ) return $params; ) function foo($z, $x = null, $y = null) ( $default_values ​​= ["x" => "default value for x", "y" => "default value for y" ];$params=set_param_defaults(get_defined_vars()) ; ("set z value", null, "set y value"); print "\n"; foo("set z value", "set x value");

ALTERNATIVELY:
Personally I would go with this method.

Function foo($z, $x_y) ( $x_y += ["x" => "default value for x", "y" => "default value for y"]; print "$z\n"; print $ x_y["x"] . "\n"; print "\n"; foo("set z value", ["x" => "set x value"]);

Print outs for both examples.

  • set z value
  • default value for x
  • set y value
  • set z value
  • set x value
  • default value for y

Just use the associative array pattern Drupal uses. Для опційних дефектних arguments, just accept an $options argument which is an associative array. Використовуйте array + operador на set any missing keys в array.

Function foo ($a_required_parameter, $options = array()) ( $options += array("b" => "", "c" => "",); // whatever ) foo("a", array( "c" => "c's value")); // Не потребує програвання b при specifying c.



Подібні публікації