PHP.mk документација

Параметри и аргументи на функција

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

functions.arguments.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека functions.arguments.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
Параметри и аргументи на функција

Референца за `functions.arguments.php` со подобрена типографија и навигација.

functions.arguments.php

Параметри и аргументи на функција

The function parameters are declared in the function signature. Information may be passed to functions via the argument list, which is a comma-delimited list of expressions. The arguments are evaluated from left to right and the result is assigned to the parameters of the function, before the function is actually called (eager evaluation).

PHP supports passing arguments by value (the default), проследување по референцаПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во default argument values. Variable-length argument lists and . Празен стринг ( are also supported.

Забелешка:

As of PHP 7.3.0, it is possible to have a trailing comma in the argument list for a function calls:

<?php
$v
= foo(
$arg_1,
$arg_2,
);
?>

As of PHP 8.0.0, the list of function parameters may include a trailing comma, which will be ignored. That is particularly useful in cases where the list of parameters is long or contains long variable names, making it convenient to list parameters vertically.

Example #1 Function parameter list with trailing comma

<?php
function takes_many_args(
$first_arg,
$second_arg,
$a_very_long_argument_name,
$arg_with_default = 5,
$again = 'a default string', // This trailing comma was not permitted before 8.0.0.
)
{
// ...
}
?>

Passing arguments by reference

By default, function arguments are passed by value (so that if the value of the argument within the function is changed, it does not get changed outside of the function). To allow a function to modify its arguments, they must be passed by reference.

To have an argument to a function always passed by reference, prepend an ampersand (&) to the parameter name in the function definition:

Example #2 Passing function arguments by reference

<?php
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo
$str; // outputs 'This is a string, and something extra.'
?>

It is an error to pass a constant expression as an argument to a parameter that expects to be passed by reference.

Default parameter values

A function may define default values for parameters using syntax similar to assigning a variable. The default is used only when the parameter's argument is not passed. Note that passing null does not assign the default value.

Example #3 Use of default parameters in functions

<?php
function makecoffee($type = "cappuccino")
{
return
"Making a cup of $type.\n";
}
echo
makecoffee();
echo
makecoffee(null);
echo
makecoffee("espresso");
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

Making a cup of cappuccino.
Making a cup of .
Making a cup of espresso.

Default parameter values may be scalar values, arrays, специјалниот тип null, и од PHP 8.1.0, објектите кои користат new ClassName() syntax.

Пример #4 Користење на нескаларни типови како стандардни вредности

<?php
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
return
"Making a cup of ".join(", ", $types)." with $device.\n";
}
echo
makecoffee();
echo
makecoffee(array("cappuccino", "lavazza"), "teapot");?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

Making a cup of cappuccino with hands.
Making a cup of cappuccino, lavazza with teapot.

Пример #5 Користење на објекти како стандардни вредности (од PHP 8.1.0)

<?php
class DefaultCoffeeMaker {
public function
brew() {
return
"Making coffee.\n";
}
}
class
FancyCoffeeMaker {
public function
brew() {
return
"Crafting a beautiful coffee just for you.\n";
}
}
function
makecoffee($coffeeMaker = new DefaultCoffeeMaker)
{
return
$coffeeMaker->brew();
}
echo
makecoffee();
echo
makecoffee(new FancyCoffeeMaker);
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

Making coffee.
Crafting a beautiful coffee just for you.

Стандардната вредност мора да биде константен израз, а не (на пример) променлива, член на класа или повик на функција.

Имајте предвид дека сите опционални параметри треба да бидат специфицирани по сите задолжителни параметри, инаку тие не можат да се изостават од повиците. Разгледајте го следниот пример:

Пример #6 Неправилна употреба на стандардни параметри на функции

<?php
function makeyogurt($container = "bowl", $flavour)
{
return
"Making a $container of $flavour yogurt.\n";
}

echo
makeyogurt("raspberry"); // "raspberry" is $container, not $flavour
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

Fatal error: Uncaught ArgumentCountError: Too few arguments
 to function makeyogurt(), 1 passed in example.php on line 42

Сега, споредете го горенаведеното со ова:

Пример #7 Правилна употреба на стандардни параметри на функции

<?php
function makeyogurt($flavour, $container = "bowl")
{
return
"Making a $container of $flavour yogurt.\n";
}

echo
makeyogurt("raspberry"); // "raspberry" is $flavour
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

Making a bowl of raspberry yogurt.

Од PHP 8.0.0, именувани аргументи може да се користи за прескокнување на повеќе опционални параметри.

Пример #8 Правилна употреба на стандардни параметри на функции

<?php
function makeyogurt($container = "bowl", $flavour = "raspberry", $style = "Greek")
{
return
"Making a $container of $flavour $style yogurt.\n";
}

echo
makeyogurt(style: "natural");
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

Making a bowl of raspberry natural yogurt.

Од PHP 8.0.0, декларирањето на задолжителни параметри по опционални параметри е deprecated. Ова генерално може да се реши со отфрлање на стандардната вредност, бидејќи таа никогаш нема да се користи. Еден исклучок од ова правило се параметрите од форма Type $param = null, каде што null стандардната вредност го прави типот имплицитно nullable. Оваа употреба е застарена од PHP 8.4.0, и експлицитна nullable тип треба да се користи наместо тоа.

Пример #9 Декларирање на опционални параметри по задолжителни параметри

<?php

function foo($a = [], $b) {} // Default not used; deprecated as of PHP 8.0.0
function foo($a, $b) {} // Functionally equivalent, no deprecation notice

function bar(A $a = null, $b) {} // As of PHP 8.1.0, $a is implicitly required
// (because it comes before the required one),
// but implicitly nullable (deprecated as of PHP 8.4.0),
// because the default parameter value is null
function bar(?A $a, $b) {} // Recommended

?>

Забелешка: Од PHP 7.1.0, изоставувањето на параметар кој не специфицира стандардна вредност фрла ArgumentCountErrorво претходните верзии ова предизвикуваше предупредување.

Забелешка: Параметрите што очекуваат аргумент по референца може да имаат стандардна вредност.

Variable-length argument lists

PHP има поддршка за списоци со аргументи со променлива должина во кориснички дефинирани функции со користење на ... token.

Списоците со параметри може да вклучуваат ... токен за да се означи дека функцијата прифаќа променлив број аргументи. Аргументите ќе бидат предадени во дадената променлива како array:

Пример #10 Користење на ... за пристап до променливи аргументи

<?php
function sum(...$numbers) {
$acc = 0;
foreach (
$numbers as $n) {
$acc += $n;
}
return
$acc;
}

echo
sum(1, 2, 3, 4);
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

10

... може да се користи и при повикување функции за распакување на array or Траверзабилно променлива или литерал во списокот со аргументи:

Пример #11 Користење на ... за обезбедување аргументи

<?php
function add($a, $b) {
return
$a + $b;
}

echo
add(...[1, 2])."\n";

$a = [1, 2];
echo
add(...$a);
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

3
3

Може да наведете нормални позициони параметри пред ... токенот. Во овој случај, само последните аргументи што не одговараат на позиционен аргумент ќе бидат додадени во низата генерирана од ....

Можно е да се додаде и . Секоја друга пред ... токенот. Ако е присутен, тогаш сите аргументи зафатени од ... мора да одговараат на типот на тој параметар.

Пример #12 Тип декларирани променливи аргументи

<?php
function total_intervals($unit, DateInterval ...$intervals) {
$time = 0;
foreach (
$intervals as $interval) {
$time += $interval->$unit;
}
return
$time;
}

$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo
total_intervals('d', $a, $b).' days';

// This will fail, since null isn't a DateInterval object.
echo total_intervals('d', null);
?>

Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред

3 days
Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2

Конечно, променливите аргументи исто така може да се пренесат по референца со претставување на ... со амперсанд (&).

. Празен стринг (

PHP 8.0.0 воведе именувани аргументи како проширување на постоечките позициони параметри. Именуваните аргументи овозможуваат поминување аргументи на функција врз основа на името на параметарот, наместо позицијата на параметарот. Ова го прави значењето на аргументот само-документирано, ги прави аргументите независни од редоследот и овозможува произволно прескокнување на стандардните вредности.

Именуваните аргументи се поминуваат со претставување на вредноста со името на параметарот проследено со двоеточие. Дозволено е користење на резервирани клучни зборови како имиња на параметри. Името на параметарот мора да биде идентификатор, динамичкото специфицирање не е дозволено.

Пример #13 Синтакса на именуван аргумент

<?php
myFunction
(paramName: $value);
array_foobar(array: $value);

// NOT supported.
function_name($variableStoringParamName: $value);
?>

Пример #14 Позициони аргументи наспроти именувани аргументи

<?php
// Using positional arguments:
array_fill(0, 100, 50);

// Using named arguments:
array_fill(start_index: 0, count: 100, value: 50);
?>

Редоследот по кој се поминуваат именуваните аргументи не е важен.

Пример #15 Истиот пример како погоре со различен редослед на параметри

<?php
array_fill
(value: 50, count: 100, start_index: 0);
?>

Именуваните аргументи можат да се комбинираат со позициони аргументи. Во овој случај, именуваните аргументи мора да доаѓаат по позиционите аргументи. Исто така е можно да се специфицираат само некои од опционалните аргументи на функцијата, без оглед на нивниот редослед.

Пример #16 Комбинирање именувани аргументи со позициони аргументи

<?php
htmlspecialchars
($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8', false);
?>

Поминувањето аргумент на истиот именуван параметар повеќе пати резултира со Грешка exception.

Пример #17 Грешка фрлена при поминување аргумент на истиот именуван параметар повеќе пати

<?php

function foo($param) { ... }

foo(param: 1, param: 2);
// Error: Named parameter $param overwrites previous argument

foo(1, param: 2);
// Error: Named parameter $param overwrites previous argument

?>

Од PHP 8.1.0, можно е да се користат именувани аргументи по распакувањето на аргументите. Именуван аргумент Ако завршниот идентификатор е вовлечен, може да се користат и табулатори, но табулаторите и празнините презапишува веќе распакуван аргумент.

Пример #18 Користете именувани аргументи по распакувањето

<?php
function foo($a, $b, $c = 3, $d = 4) {
return
$a + $b + $c + $d;
}

var_dump(foo(...[1, 2], d: 40)); // 46
var_dump(foo(...['b' => 2, 'a' => 1], d: 40)); // 46

var_dump(foo(...[1, 2], b: 20)); // Fatal error. Named parameter $b overwrites previous argument
?>

Белешки од корисници 8 белешки

php на richardneill точка org
пред 10 години
To experiment on performance of pass-by-reference and pass-by-value, I used this  script. Conclusions are below. 

#!/usr/bin/php
<?php
function sum($array,$max){   //For Reference, use:  "&$array"
    $sum=0;
    for ($i=0; $i<2; $i++){
        #$array[$i]++;        //Uncomment this line to modify the array within the function.
        $sum += $array[$i];  
    }
    return ($sum);
}

$max = 1E7                  //10 M data points.
$data = range(0,$max,1);

$start = microtime(true);
for ($x = 0 ; $x < 100; $x++){
    $sum = sum($data, $max);
}
$end =  microtime(true);
echo "Time: ".($end - $start)." s\n";

/* Run times:
#    PASS BY    MODIFIED?   Time
-    -------    ---------   ----
1    value      no          56 us
2    reference  no          58 us

3    valuue     yes         129 s
4    reference  yes         66 us

Conclusions:

1. PHP is already smart about zero-copy / copy-on-write. A function call does NOT copy the data unless it needs to; the data is
   only copied on write. That's why  #1 and #2 take similar times, whereas #3 takes 2 million times longer than #4.
   [You never need to use &$array to ask the compiler to do a zero-copy optimisation; it can work that out for itself.]

2. You do use &$array  to tell the compiler "it is OK for the function to over-write my argument in place, I don't need the original
   any more." This can make a huge difference to performance when we have large amounts of memory to copy.
   (This is the only way it is done in C, arrays are always passed as pointers)

3. The other use of & is as a way to specify where data should be *returned*. (e.g. as used by exec() ).
   (This is a C-like way of passing pointers for outputs, whereas PHP functions normally return complex types, or multiple answers
   in an array)

4. It's  unhelpful that only the function definition has &. The caller should have it, at least as syntactic sugar. Otherwise
   it leads to unreadable code: because the person reading the function call doesn't expect it to pass by reference. At the moment,
   it's necessary to write a by-reference function call with a comment, thus:
    $sum = sum($data,$max);  //warning, $data passed by reference, and may be modified.

5. Sometimes, pass by reference could be at the choice of the caller, NOT the function definitition. PHP doesn't allow it, but it
   would be meaningful for the caller to decide to pass data in as a reference. i.e. "I'm done with the variable, it's OK to stomp
   on it in memory".
*/
?>
Simmo на 9000 точка 000
пред 4 години
For anyone just getting started with php or searching, for an understanding, on what this page describes as a "... token" in Variable-length arguments:
https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list
<?php

  func($a, ...$b) 

?>
The 3 dots, or elipsis, or "...", or dot dot dot is sometimes called the "spread operator" in other languages.

As this is only used in function arguments, it is probably not technically an true operator in PHP.  (As of 8.1 at least?).

(With having an difficult to search for name like "... token", I hope this note helps someone).
LilyWhite
пред 4 години
It is worth noting that you can use functions as function arguments

<?php
function run($op, $a, $b) {
  return $op($a, $b);
}

$add = function($a, $b) {
  return $a + $b;
};

$mul = function($a, $b) {
  return $a * $b;
};

echo run($add, 1, 2), "\n";
echo run($mul, 1, 2);
?>

Output:
3
2
gabriel на figdice точка org
пред 9 години
A function's argument that is an object, will have its properties modified by the function although you don't need to pass it by reference.

<?php
$x = new stdClass();
$x->prop = 1;

function f ( $o ) // Notice the absence of &
{
  $o->prop ++;
}

f($x);

echo $x->prop; // shows: 2
?>

This is different for arrays:

<?php
$y = [ 'prop' => 1 ];

function g( $a )
{
  $a['prop'] ++;
  echo $a['prop'];  // shows: 2
}

g($y);

echo $y['prop'];  // shows: 1
?>
Хејли Вотсон
пред 8 години
There are fewer restrictions on using ... to supply multiple arguments to a function call than there are on using it to declare a variadic parameter in the function declaration. In particular, it can be used more than once to unpack arguments, provided that all such uses come after any positional arguments.

<?php

$array1 = [[1],[2],[3]];
$array2 = [4];
$array3 = [[5],[6],[7]];

$result = array_merge(...$array1); // Legal, of course: $result == [1,2,3];
$result = array_merge($array2, ...$array1); // $result == [4,1,2,3]
$result = array_merge(...$array1, $array2); // Fatal error: Cannot use positional argument after argument unpacking.
$result = array_merge(...$array1, ...$array3); // Legal! $result == [1,2,3,5,6,7]
?>

The Right Thing for the error case above would be for $result==[1,2,3,4], but this isn't yet (v7.1.8) supported.
boan точка web на outlook точка com
пред 8 години
Quote:

"The declaration can be made to accept NULL values if the default value of the parameter is set to NULL."

But you can do this (PHP 7.1+):

<?php
function foo(?string $bar) {
    //...
}

foo(); // Fatal error
foo(null); // Okay
foo('Hello world'); // Okay
?>
Луна
3 години пред
When using named arguments and adding default values only to some of the arguments, the arguments with default values must be specified at the end or otherwise PHP throws an error:

<?php

function test1($a, $c, $b = 2)
{
    return $a + $b + $c;
}

function test2($a, $b = 2, $c)
{
    return $a + $b + $c;
}

echo test1(a: 1, c: 3)."\n"; // Works
echo test2(a: 1, c: 3)."\n"; // ArgumentCountError: Argument #2 ($b) not passed

?>

I assume that this happens because internally PHP rewrites the calls to something like test1(1, 3) and test2(1, , 3). The first call is valid, but the second obviously isn't.
Хејли Вотсон
пред 8 години
If you use ... in a function's parameter list, you can use it only once for obvious reasons. Less obvious is that it has to be on the LAST parameter; as the manual puts it: "You may specify normal positional arguments BEFORE the ... token. (emphasis mine).

<?php
function variadic($first, ...$most, $last)
{/*etc.*/}

variadic(1, 2, 3, 4, 5);
?>
results in a fatal error, even though it looks like the Thing To Do™ would be to set $first to 1, $most to [2, 3, 4], and $last to 5.
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.