note 61496 deleted from language.oop5.basic by bjori
| From: | bjori@php.net | Date: | Wed, 26 Apr 2006 16:48:34 +0000 |
| Subject: | note 61496 deleted from language.oop5.basic by bjori | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-109770@lists.php.net to get a copy of this message | ||
Note Submitter: ksam at mail dot ru
----
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.