note 61496 added to language.oop5.basic
| From: | ksam at mail dot ru | Date: | Sun, 05 Feb 2006 17:32:39 +0000 |
| Subject: | note 61496 added to language.oop5.basic | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-103041@lists.php.net to get a copy of this message | ||
Not sure if referencing is working correctly. It is said that objects are sent to functions by
reference and returned in the same way. Take a look at simple example:
class MyClass {
private $cA;
public function setA( $cValue) { $this->cA = $cValue; }
public function getA() { return $this->cA; }
}
function changeMyClass( &$oMyClass, $cVal) {
$oMyClass->setA( $cVal);
return $oMyClass;
}
$oMyClass = new MyClass();
$oMyClass->setA( 'A');
$oMyClassRef = &$oMyClass;
$oMyClassCopy = $oMyClass;
$oMyClassClone = clone $oMyClass;
echo "oMyClass: " . $oMyClass->getA() . "<br>";
echo "oMyClassRef: " . $oMyClassRef->getA() . "<br>";
echo "oMyClassCopy: " . $oMyClassCopy->getA() . "<br>";
echo "oMyClassClone: " . $oMyClassClone->getA() . "<br>";
echo "<br>";
$oMyClassReturn = changeMyClass( $oMyClass, 'B');
echo "oMyClass: " . $oMyClass->getA() . "<br>";
echo "oMyClassRef: " . $oMyClassRef->getA() . "<br>";
echo "oMyClassCopy: " . $oMyClassCopy->getA() . "<br>";
echo "oMyClassClone: " . $oMyClassClone->getA() . "<br>";
echo "oMyClassReturn: " . $oMyClassReturn->getA() . "<br>";
echo "<br>";
$oMyClassCopy->setA( 'C');
echo "oMyClass: " . $oMyClass->getA() . "<br>";
echo "oMyClassRef: " . $oMyClassRef->getA() . "<br>";
echo "oMyClassCopy: " . $oMyClassCopy->getA() . "<br>";
echo "oMyClassClone: " . $oMyClassClone->getA() . "<br>";
echo "oMyClassReturn: " . $oMyClassReturn->getA() . "<br>";
echo "<br>";
$oMyClass = NULL;
echo "oMyClass: " . ( isset( $oMyClass) ? "set" : "not set").
"<br>";
echo "oMyClassRef: " . ( isset( $oMyClassRef) ? "set" : "not set").
"<br>";
echo "oMyClassCopy: " . ( isset( $oMyClassCopy) ? "set" : "not set") .
"<br>";
echo "oMyClassClone: " . ( isset( $oMyClassClone) ? "set" : "not set")
. "<br>";
echo "oMyClassReturn: " . ( isset( $oMyClassReturn) ? "set" : "not
set") . "<br>";
echo "<br>";
echo ( int) is_object( $oMyClass) . "<br>";
echo ( int) is_object( $oMyClassRef) . "<br>";
echo ( int) is_object( $oMyClassCopy) . "<br>";
echo ( int) is_object( $oMyClassClone) . "<br>";
echo ( int) is_object( $oMyClassReturn) . "<br>";
echo "<br>";
echo "oMyClassCopy: " . $oMyClassCopy->getA() . "<br>";
echo "oMyClassClone: " . $oMyClassClone->getA() . "<br>";
echo "oMyClassReturn: " . $oMyClassReturn->getA() . "<br>";
It will output:
oMyClass: A
oMyClassRef: A
oMyClassCopy: A
oMyClassClone: A
oMyClass: B
oMyClassRef: B
oMyClassCopy: B
oMyClassClone: A
oMyClassReturn: B
oMyClass: C
oMyClassRef: C
oMyClassCopy: C
oMyClassClone: A
oMyClassReturn: C
oMyClass: not set
oMyClassRef: not set
oMyClassCopy: set
oMyClassClone: set
oMyClassReturn: set
0
0
1
1
1
oMyClassCopy: C
oMyClassClone: A
oMyClassReturn: C
So, If you create reference manually it will share the same object. If you destroy source =>
reference is unlinked and does not point any object. In case of function we are dealing with hybrid
reference which is still pointing to some object even after destroying source.
Instead of "$oMyClass = NULL" unset function could be called but it simply unsets oMyClass
variable and even reference still refer to an initial object.
----
Server IP: 64.246.30.37
Probable Submitter: 70.131.59.168
----
Manual Page -- http://www.php.net/manual/en/language.oop5.basic.php
Edit -- http://master.php.net/manage/user-notes.php?action=edit+61496
Delete: added to the manual -- http://master.php.net/manage/user-notes.php?action=delete+61496&report=yes&reason=added+to+the+manual
Delete: bad code -- http://master.php.net/manage/user-notes.php?action=delete+61496&report=yes&reason=bad+code
Delete: spam -- http://master.php.net/manage/user-notes.php?action=delete+61496&report=yes&reason=spam
Delete: useless -- http://master.php.net/manage/user-notes.php?action=delete+61496&report=yes&reason=useless
Delete: non-english -- http://master.php.net/manage/user-notes.php?action=delete+61496&report=yes&reason=non-english
Delete: already in docs -- http://master.php.net/manage/user-notes.php?action=delete+61496&report=yes&reason=already+in+docs
Delete: other reasons -- http://master.php.net/manage/user-notes.php?action=delete+61496&report=yes
Reject -- http://master.php.net/manage/user-notes.php?action=reject+61496&report=yes
Search -- http://master.php.net/manage/user-notes.php