Maison > développement back-end > tutoriel php > Que sont les cotations PHP ? Introduction aux citations en php (exemple de code)

Que sont les cotations PHP ? Introduction aux citations en php (exemple de code)

不言
Libérer: 2023-04-04 08:06:01
original
2612 Les gens l'ont consulté

Le contenu de cet article porte sur ce qu'est la citation PHP ? L'introduction (exemples de code) citée dans php a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'elle vous sera utile.

1. Qu'est-ce qu'une référence ?

La référence en PHP fait référence à l'accès au même contenu de variable avec des noms différents.
Les noms de variables et le contenu des variables en PHP sont différents, donc le même contenu peut avoir des noms différents.
L'analogie la plus proche est celle des noms de fichiers Unix et des fichiers eux-mêmes : les noms de variables sont les entrées du répertoire et le contenu des variables est les fichiers eux-mêmes. Les références peuvent être considérées comme des liens physiques dans un système de fichiers Unix.

Les références en PHP ne sont pas comme les pointeurs en C : vous ne pouvez pas faire d'arithmétique de pointeur dessus, par exemple. La référence n'est pas une adresse mémoire réelle, mais un alias de table de symboles.

2. Caractéristiques des références

Les références PHP permettent à deux variables de pointer vers le même contenu.

$a =& $b;
Copier après la connexion

Cela signifie que $a et $b pointent vers la même variable.

$a et $b sont exactement les mêmes ici. Ce n'est pas que $a pointe vers $b ou vice versa, mais que $a et $b pointent vers le même endroit.

Si un tableau avec une référence est copié, sa valeur n'est pas déréférencée. Il en va de même pour transmettre les valeurs du tableau aux fonctions.

$a = 'a';

$arr1 = [
    'a' => $a,
    'b' => &$a, // $arr1['b'] 与 $a 指向同一个变量
];

// 将 $arr1 传值赋值给 $arr2
$arr2 = $arr1;

print_r($arr2); // $arr2 的值为 ['a' => 'a', 'b' => 'a']

// 修改 $a 的值为 'b'
$a = 'b';

print_r($arr2); // $arr2 的值为 ['a' => 'a', 'b' => 'b']


function foo($arr){
    // 将 $arr['b'] 的值改为 'c';
    $arr['b'] = 'c';
}

echo $a; // $a 的值为 'b'

// 将 $arr1 传入函数
foo($arr1);

echo $a; // $a 的值为 'c'
Copier après la connexion

Si une variable non définie est affectée par référence, passée par paramètre de référence ou renvoyée par référence, la variable sera automatiquement créée.

// 定义函数 foo(),通过引用传递参数
function foo(&$var) { }

foo($a); // 创建变量 $a,值为 NULL
var_dump($a); // NULL

foo($b['b']); // 创建数组 $b = ['b' => NULL]
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d); // 创建对象属性 $c->d = NULL
var_dump(property_exists($c, 'd')); // bool(true)
Copier après la connexion

Si une référence est affectée à une variable déclarée globale à l'intérieur d'une fonction, la référence n'est visible qu'à l'intérieur de la fonction. Cela peut être évité en utilisant le tableau $GLOBALS.

$var1 = 'var1';
$var2 = 'var2';

function global_references($use_globals)
{
    global $var1, $var2;
    if (!$use_globals) {
        $var2 = & $var1; // $var2 只在函数内部可见
    } else {
        $GLOBALS["var2"] = & $var1; // $GLOBALS["var2"]在全球范围内也可见
    }
}

global_references(false);
echo "var2 is set to '$var2'\n"; // var2 is set to 'var2'
global_references(true);
echo "var2 is set to '$var2'\n"; // var2 is set to 'var1'
Copier après la connexion

Vous pouvez considérer global $var; comme l'abréviation de $var =& $GLOBALS['var'];. Ainsi, attribuer une autre référence à $var ne modifie que la référence à la variable locale.

Attribuez une valeur à une variable avec une référence dans l'instruction foreach, et l'objet référencé est également modifié.

$ref = 0;
$row = & $ref;
foreach ([1, 2, 3] as $row) {
    // do something
}
echo $ref; // 3 - 遍历数组的最后一个元素
Copier après la connexion

3. Passage par référence

Vous pouvez passer une variable à une fonction par référence, afin que la fonction puisse modifier la valeur de sa paramètre.

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

$a=5;
foo($a);

echo $a; // 6
Copier après la connexion
Copier après la connexion

Notez qu'il n'y a pas de symboles de référence dans l'appel de fonction - uniquement dans la définition de la fonction. La définition de la fonction à elle seule suffit pour que les paramètres soient passés correctement par référence.

Ce qui peut être passé par référence :

  • Variables

  • Référence renvoyée par une fonction

Passage de variables par référence

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

$a=5;
foo($a);

echo $a; // 6
Copier après la connexion
Copier après la connexion

Passage par référence à partir de références renvoyé dans les fonctions

function foo(&$var)
{
    $var++;
    echo $var; // 6
}

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

foo(bar());
Copier après la connexion

ne peut pas transmettre de fonctions, expressions, valeurs, etc. par référence

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

function bar() // 注意,这个函数不返回引用
{
    $a = 5;
    return $a;
}

foo(bar()); // 自 PHP 5.0.5 起导致致命错误,自 PHP 5.1.1 起导致严格模式错误,自 PHP 7.0 起导致 notice 信息

foo($a = 5); // 表达式,不是变量。PHP Notice:  Only variables should be passed by reference

foo(5); // PHP Fatal error:  Only variables can be passed by reference
Copier après la connexion

4. Retour par référence

Le retour par référence peut être utilisé lorsque vous souhaitez utiliser une fonction pour trouver la variable à laquelle une référence doit être liée.
N'utilisez pas de références de retour pour augmenter les performances, le moteur est suffisamment intelligent pour s'optimiser. Ne renvoyez les références que s’il existe une raison technique valable !

class Foo {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$foo = new Foo;
// $myValue 是 $obj->value 的引用.
$myValue = &$foo->getValue();
// 将 $foo->value 修改为 2
$foo->value = 2;
echo $myValue;  // 2
Copier après la connexion
Contrairement au passage de référence de paramètre, le retour de référence doit utiliser l'esperluette aux deux endroits - indiquant qu'une référence est renvoyée, et non la copie habituelle, et indiquant également que $myValue est lié en tant que référence, au lieu de l'affectation habituelle .

Le retour de référence ne peut renvoyer que des variables. Si vous essayez de renvoyer une référence à partir d'une fonction comme celle-ci : return intval($this->value);, vous obtiendrez une erreur car la fonction essaie de renvoyer le résultat d'une expression plutôt qu'une variable référencée. Vous ne pouvez renvoyer que des variables de référence à partir de fonctions - il n'y a pas d'autre moyen.

class Foo {
    public $value = 42;

    public function &getValue() {
        return intval($this->value); // PHP Notice:  Only variable references should be returned by reference
    }
}

$foo = new Foo;
// $myValue 是 $obj->value 的引用.
$myValue = &$foo->getValue();
Copier après la connexion

5. Non-référence

Lorsque vous supprimez une référence, cela rompt simplement la liaison entre le nom de la variable et le contenu de la variable. Cela ne signifie pas que le contenu des variables est détruit.

$a = 1;
$b = & $a;
unset($a);

echo $b; // 1
Copier après la connexion

6. J'ai constaté que

De nombreuses structures de syntaxe PHP sont implémentées via le mécanisme de référence, donc tout ce qui précède sur la liaison de référence s'applique également à ces structures.

référence globale

Lors de la déclaration d'une variable avec global $var, une référence à la variable globale est en fait établie à l'intérieur de la fonction. En d'autres termes, l'effet de cette opération est le même :

global $var;

$var =& $GLOBALS["var"];
Copier après la connexion

Cela signifie que la suppression de $var ne supprimera pas la variable globale $GLOBALS["var"].

$this

Dans une méthode d'un objet, $this est toujours une référence à l'objet qui l'appelle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal