PHP: Referenci�k - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links 
search for in the  
previousReferenci�k a konstruktorbanMit lehet referenci�kkal tenninext
Last updated: Fri, 30 Aug 2002
view the printer friendly version or the printer friendly version with notes or change language to English | Brazilian Portuguese | Chinese | Czech | Dutch | Finnish | French | German | Italian | Japanese | Korean | Polish | Romanian | Russian | Spanish | Swedish | Turkish

Fejezet 15. Referenci�k

Mik a referenci�k

A referenci�k lehet�s�get adnak PHP-ben azonos v�ltoz� tartalom el�r�s�re k�l�nb�z� nevek alatt. Ezek szimb�lumt�bla bejegyz�sek, nem olyanok, mint a C nyelv mutat�i. PHP-ben a v�ltoz�k neve �s tartalma k�t k�l�nb�z� dolog, teh�t ugyanaz a tartalom kaphat k�l�nb�z� neveket. A legjobb hasonlat tal�n a UNIX �llom�nynevek �s �llom�nyok rendszere. A v�ltoz�neveket k�nyvt�r bejegyz�sekk�nt foghatod fel, a v�ltoz�k tartalm�t �llom�nyokk�nt. A referenci�k olyanok, mint UNIXban a hardlinkek.

User Contributed Notes
Referenci�k
add a note about notes
20-Dec-2001 04:46
Succesive assignement by reference and simple assignement :

$a = 'old';
$b = &$a;
$a = 'new';// now $b's value is new
$c = $b;// simple copy
$a = 'new new'; // $b is 'new new', $c is still 'new'

And now with arrays :
$a[0] = 'old';
$b = &$a;
$c = $b;//simple copy
$a[0] = 'new';// $b[0] is new, and $c[0] is still 'old'

BUT :

$a = 'old';
$b[0] = &$a;
$c = $b; // simple copy
$a = 'new';//now BOTH $b[0] and $c[0] are 'new'

A simple copying of an array (or an object) does NOT
break references for the values (or instance variables).
Use var_dump() to see which of the values in an array
are references.

Ivan

[email protected]
11-Jan-2002 01:44

You may be looking for how to iterate over an array by reference. For example, you have an array of objects, and you want to call methods that modify the objects. A normal foreach doesn't work, as the elements of the array are copied. each() doesn't work either. You have to use a for loop.

Example of what *COPIES* objects (not what you probably want):

foreach($object_list as $object) {
$object->method();
}

Example of what does not copy objects (probably what you want):

for ($c = 0; $c = count($object_list); $c++) {
$object = &$object_list[$c];
$object->method();
}

You get the picture.

[email protected]
17-Jan-2002 04:55

Caveat, if your using an associative array with the key pointing to a reference your going to want to do somehting like this:

reset($MyArray);
while($Key = key($MyArray))
{
$_MyRef = & $MyArray[$Key];
...Do Smothing...
next($MyArray);
}

cody at iensemble d0t c0m
07-Mar-2002 05:26

Another way to iterate over an array of references:

foreach (array_keys($myArray) as $key) {
doSomething($myArray[$key]);
}

This works on "normal" and associative arrays.

[email protected]_SPAM.nl
27-Mar-2002 10:37

For the Java programmers among you, there's a big difference between Java and PHP. In Java, all objects are passed by value (as in PHP). However, try this in PHP:

class Object {
var $value;
function Object() {
$this->value = 5;
}
function getValue() {
return $this->value;
}
function setValue($value) {
$this->value = $value;
}
}

function updateObject($object) {
$object->setValue($object->getValue() + 5);
echo ', ', $object->getValue();
}

$object = new Object();
echo $object->getValue();
updateObject($object);
echo ', ', $object->getValue();

It prints: '5, 10, 5'.

If you implement this same code in Java however, it will print '5, 10, 10'!

Explanation: 'passing by value' in Java means that assigning a different value to a variable inside a function will not change it outside a function. (PHP equivalent: '$object = new Object'.) But calling methods on the variable (when it's an object) can change the object (In PHP: '$object->setValue(9)'). With PHP the latter isn't true, unfortunately.

If you use objects in PHP, you have to use references almost all the time, even if you don't want to assign a new value to an outside variable, but just want to call methods (that might update the object).

[email protected]
02-Apr-2002 07:34

If you want to check whether there is a reference between two variables you can use this function.

function check_reference(&$var1, &$var2)
{
// Save old values
$var1_old = $var1;
$var2_old = $var2;

// ($var1 . ".") must not be $var2
if($var1 . "." == $var2)
$var1 .= ".";

// Change $var1
$var1 .= ".";

// Did $var2 also change?
if($var2 == $var1)
$reference = true;
else
$reference = false;

// Old values
$var1 = $var1_old;
$var2 = $var2_old;

return $reference;
}

[email protected]
08-Apr-2002 09:34

A have found interesting strange in references to classes.

class Child{
function Child(&$parent)
{
$this->parent=&$parent;
$this->parent->var=10;
}
function doit()
{
$this->parent->var=20;
}
}

class A{
function A()
{
$this->child=new Child($this);
}
function doit()
{
$this->child->doit();
echo $this->var;
}
}

$a = new A;
$a->doit();

-----------------
In result we have 10, not 20.

And, if we call $a->doit(); from constructor �():
function A()
{
$this->child=new Child($this);
$this->doit();
}
we resulting 20.

The way to takearound this is make empty constructor, move all from it to function constr(), and run some like:

$a=new A;
$a->me=&$a;
$a->constr();
$a->doit();

in constr() we have $this->child=new Child($this->me); [not Child($this)].

and, as result we have 20 as would be expected.

That's this? Am I missunderstand something or it is PHP bug?

23-Apr-2002 12:07
When you do

$a = new A();

PHP creates an object for you, and returns a COPY of that object
So (if I get it right... ) the child is actually altering the original object and not the copy that you stored in $a.

However if you do

$a =& new A();

PHP still creates an object, but returns a REFERENCE to that object.
The child is still altering the original - but you are happy, because you have got a reference the original!

so if you change the line

$a = new A();

to

$a =& new A();

you'll get the result you expected.

(BTW wouldn't it be more correct to say that when you do:

$a = new A()

PHP returns not a copy but a reference to a copy?)

vic@NO_SPAM.altoona.net
16-Jul-2002 03:20

Someone compared Java to PHP's pass by value. Java doesn't pass copies of objects to methods "by value" as PHP does. It passes a copy of the object's reference by value. It's still the same object. It's similar to passing a pointer to a structure in C.
[email protected]
16-Jul-2002 04:46

Note that creating a reference to a non-existing array element causes that element to be created with a null value. For example:

var_dump($username); // => NULL
var_dump($session); // => NULL

$username =& $session['username'];

var_dump($username); // => NULL
var_dump($session);
// => array(1) { ["username"]=> &NULL }

add a note about notes
previousReferenci�k a konstruktorbanMit lehet referenci�kkal tenninext
Last updated: Fri, 30 Aug 2002
show source | credits | stats | mirror sites
Copyright © 2001, 2002 The PHP Group
All rights reserved.
This mirror generously provided by:
Last updated: Sat Aug 31 06:19:44 2002 CEST