note 61496 deleted from language.oop5.basic by bjori

From: 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.

« previous php.notes (#109770) next »