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

Проследување по референца

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

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

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

language.references.pass.php

Проследување по референца

Можете да проследите променлива по референца на функција за да може функцијата да ја промени променливата. Синтаксата е следнава:

<?php

function foo(&$var)
{
$var++;
}

$a=5;

foo($a);
// $a is 6 here

?>

Забелешка: Нема знак за референца при повикување на функција - само при дефиниции на функции. Дефинициите на функции се доволни за правилно проследување на аргументот по референца.

Следниве работи можат да се проследат по референца:

  • Променливи, т.е. foo($a)
  • Референции вратени од функции, т.е.:

    <?php

    function foo(&$var)
    {
    $var++;
    }

    function &
    bar()
    {
    $a = 5;
    return
    $a;
    }

    foo(bar());

    ?>
    Повеќе за враќање по референца.

Ниту еден друг израз не треба да се проследува по референца, бидејќи резултатот е недефиниран. На пример, следниве примери за проследување по референца се невалидни:

<?php

function foo(&$var)
{
$var++;
}

function
bar() // Note the missing &
{
$a = 5;
return
$a;
}

foo(bar()); // Produces a notice

foo($a = 5); // Expression, not variable
foo(5); // Produces fatal error

class Foobar {}

foo(new Foobar()) // Produces a notice as of PHP 7.0.7
// Notice: Only variables should be passed by reference

?>

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

tnestved на yahoo точка com
пред 11 години
By removing the ability to include the reference sign on function calls where pass-by-reference is incurred (I.e., function definition uses &), the readability of the code suffers, as one has to look at the function definition to know if the variable being passed is by-ref or not (I.e., potential to be modified).  If both function calls and function definitions require the reference sign (I.e., &), readability is improved, and it also lessens the potential of an inadvertent error in the code itself.  Going full on fatal error in 5.4.0 now forces everyone to have less readable code.  That is, does a function merely use the variable, or potentially modify it...now we have to find the function definition and physically look at it to know, whereas before we would know the intent immediately.
ccb_bc на hotmail точка com
пред 6 години
<?php 
// PHP >= 5.6

// Here we use the 'use' operator to create a variable within the scope of the function. Although it may seem that the newly created variable has something to do with '$x' that is outside the function, we are actually creating a '$x' variable within the function that has nothing to do with the '$x' variable outside the function. We are talking about the same names but different content locations in memory.
$x = 10;
(function() use ($x){
    $x = $x*$x;
    var_dump($x); // 100
})();
var_dump($x); // 10

// Now the magic happens with using the reference (&). Now we are actually accessing the contents of the '$y' variable that is outside the scope of the function. All the actions that we perform with the variable '$y' within the function will be reflected outside the scope of this same function. Remembering this would be an impure function in the functional paradigm, since we are changing the value of a variable by reference.
$y = 10;
(function() use (&$y){
    $y = $y*$y;
    var_dump($y); // 100
})();
var_dump($y); // 100
?>
Анонимен
3 години пред
Parameters passed by references can have default values.
You can find out if a variable was actually passed by using func_num_args():

<?php

function refault( & $ref = 'Do I have to be calculated?'){
  echo 'NUM ARGS:  '. func_num_args()."\n";
  echo "ORI VALUE: {$ref}\n";
  if( func_num_args() > 0 )  $ref = 'Yes, expensive to calculate result: ' . sleep(1);
  else $ref = 'No.';
  echo "NEW VALUE: {$ref}\n";
}

$result = 'Do I have to be calculated?';
refault( $result );
echo "RESULT:    {$result}\n";
// NUM ARGS:  1
// ORI VALUE: Do I have to be calculated?
// NEW VALUE: Yes, expensive to calculate result: 0
// RESULT:    Yes, expensive to calculate result: 0

refault();
// NUM ARGS:  0
// ORI VALUE: Do I have to be calculated?
// NEW VALUE: No.
?>
mike на eastghost точка com
пред 10 години
beware unset()  destroys references

$x = 'x';
change( $x );
echo $x; // outputs "x" not "q23"  ---- remove the unset() and output is "q23" not "x"

function change( & $x )
{
    unset( $x );
    $x = 'q23';
    return true;
}
Џејсон Стилман
пред 6 години
Within a class, passing array elements by reference which don't exist are added to the array as null. Compared to a normal function, this changes the behavior of the function from throwing an error to creating a new (null) entry in the referenced array with a new key.

<?php

class foo { 
    public $arr = ['a' => 'apple', 'b' => 'banana'];
    public function normalFunction($key) {
        return $this->arr[$key];
    }
    public function &referenceReturningFunction($key) {
        return $this->arr[$key];
    }
}

$bar = new foo();
$var = $bar->normalFunction('beer'); //Notice Error. Undefined index beer
$var = &$bar->referenceReturningFunction('beer'); // No error. The value of $bar is now null
var_dump($bar->arr);
/**
[
  "a" => "apple",
  "b" => "banana",
  "beer" => null,
],
*/

?>
This is in no way a "bug" - the framework is performing as designed, but it took careful thought to figure out what was going on. PHP7.3
На оваа страница

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

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

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

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

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