note 61496 added to language.oop5.basic

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

« previous php.notes (#103041) next »