Референции в PHP
Много спорове за референциите в PHP започват с „референциите са объркващи”. Всъщност , референциите са много елементарна концепция за схващане.
Референциите в PHP са средство за достигане до съдържанието на променлива чрез различни имена. Тези имена ще са псевдоними на базовата променлива и ще сочат към нея. Освен това те могат да бъдат използвани за по-кратко записване на имена на променливи. Така те ще бъдат достъпни по-удобно и по-практично до съдържанието на техните базови променливи, ако имената на базовите променливи е дълго и сложно.
Тези разработчици , които са запознати с езици за програмиране, като C++ или Java ще забележат, че референциите в PHP не са аналогични с указателите.
Всички имена на променливи в PHP са автоматично свързани със стойности в паметта. Използвайки референции, ние може да свържем две имена на променлива към същата стойност в паметта. Трябва да знаем , че име на променлива и съдържание на променлива са две различни неща.
За да разберем как работят референциите трябва да знаем първо как PHP работи с променливите, които не са достъпни като референции, а по стойност.
Взимане на стойност от друга променлива
Пример 1 :
CODE1
2
3
4
5
6
7
8
| <?php
$a = 1;
$b = $a;
$b++;
еcho $a; // ще изведе 1
еcho $b; // ще изведе 2
?> |
Предаване на стойност като аргумент на функция
Пример 2 :
CODE1
2
3
4
5
6
7
8
9
10
11
| <?php
function addFive( $num ) {
$num += 5;
}
$original_num = 10;
addFive( $original_num);
print( $original_num); // Ще изведе 10
?> |
Предаване на стойност като аргумент на метод от обект
Пример 3 :
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| <?php
class DefensiveAttack {
/**
* My IP address
*
* @access protected
* @var string
*/
var $mMyIpAddress = '127.0.0.1';
/**
* Set my IP address
*
* @access public
* @param string $ip
*/
function SetMyIpAddress($ip) {
$this->mMyIpAddress = $ip;
}
/**
* Clear my ip
*
* @access public
*/
function ClearMyIP() {
$this->mMyIpAddress = '';
}
}
$my_ip = '212.116.142.*';
$object = new DefensiveAttack();
$object->SetMyIpAddress($my_ip);
echo $object->mMyIpAddress;// Ще изведе 212.116.142.*
echo $my_ip;// Ще изведе 212.116.142.*
$object->ClearMyIP(); //Изтриваме съдържанието на $mMyIpAddress
echo $object->mMyIpAddress;// Няма да изведе нищо
echo $my_ip;// Ще изведе 212.116.142.*
?> |
Сега започнем да разглеждаме предаването на стойности като референция.
Достъп до стойност на друга променлива като референция към нея.
Пример 1:
CODE1
2
3
4
5
6
7
8
| <?php
$a = 1;
$b = &$a;
$b++;
еcho $a; // ще изведе 2. При увеличаването на стойността на $b променяме стойността на $a
еcho $b; // ще изведе 2
?> |
Пример 2:
CODE1
2
3
4
5
6
7
8
9
| <?php
$A=array('a' => 'aaa', 'b' => 'bbb');
$b=&$A['b']; // $b сочи към елемент “b” от масив $A
$b=0; // $A['b']=0;
echo $A['b']; // изкарва на екрана 0
?> |
За да се създаде референция , не е нужно да съществува стойност към която да сочи.
CODE1
2
3
4
5
6
7
8
9
| <?php
$A=array('a' => 'aaa', 'b' => 'bbb');
$b=&$A['c']; // $b сочи към 'c' индекса на масива $A
// Сега масива $A съдържа ‘c’ индекс, но той е празен.
echo " Съдържанието на 'c' индекса от масива $A : (".$A['c'].")";
?> |