curt Sat Aug 7 13:39:27 2004 EDT
Modified files:
/phpdoc/en/language/oop5 cloning.xml
Log:
Be more clear how __clone() works (bug #27100), and example modifications.
http://cvs.php.net/diff.php/phpdoc/en/language/oop5/cloning.xml?r1=1.2&r2=1.3&ty=u
Index: phpdoc/en/language/oop5/cloning.xml
diff -u phpdoc/en/language/oop5/cloning.xml:1.2 phpdoc/en/language/oop5/cloning.xml:1.3
--- phpdoc/en/language/oop5/cloning.xml:1.2 Sat Jul 17 00:05:28 2004
+++ phpdoc/en/language/oop5/cloning.xml Sat Aug 7 13:39:27 2004
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.2 $ -->
+<!-- $Revision: 1.3 $ -->
<sect1 id="language.oop5.cloning">
<title>Object cloning</title>
@@ -30,14 +30,13 @@
</informalexample>
<para>
- When the developer asks to create a new copy of an object, PHP 5 will check
- if a __clone() method has been defined or not. If not, it will call a
- default __clone() which will copy all of the object's properties. If a
- __clone() method is defined, then it will be responsible to set the
- necessary properties in the created object. For convenience, the engine
- will supply a function that imports all of the properties from the source
- object, so that they can start with a by-value replica of the source
- object, and only override properties that need to be changed.
+
+ When an object is cloned, PHP 5 will perform a shallow copy of all of the
+ object's properties. Any properties that are references to other variables,
+ will remain references. If a __clone() method is defined, then the newly
+ created object's __clone() method will be called, to allow any necessary
+ properties that need to be changed.
+
</para>
<example>
@@ -45,34 +44,85 @@
<programlisting role="php">
<![CDATA[
<?php
+
+class SubObject {
+ static $instances = 0;
+ public $instance;
+
+ public function __construct() {
+ $this->instance = ++self::$instances;
+ }
+
+ public function __clone() {
+ $this->instance = ++self::$instances;
+ }
+}
+
class MyCloneable {
- static $id = 0;
- function MyCloneable() {
- $this->id = self::$id++;
- }
-
- function __clone() {
- $this->address = "New York";
- $this->id = self::$id++;
- }
+ public $object1;
+ public $object2;
+
+ function __clone() {
+
+ // Force a copy of this->object, otherwise
+ // it will point to same object.
+ $this->object1 = clone($this->object1);
+ }
}
$obj = new MyCloneable();
-$obj->name = "Hello";
-$obj->address = "Tel-Aviv";
+$obj->object1 = new SubObject();
+$obj->object2 = new SubObject();
+
+$obj2 = clone $obj;
-print $obj->id . "\n";
-$obj_cloned = clone $obj;
+print("Original Object:\n");
+print_r($obj);
+
+print("Cloned Object:\n");
+print_r($obj2);
-print $obj_cloned->id . "\n";
-print $obj_cloned->name . "\n";
-print $obj_cloned->address . "\n";
?>
]]>
</programlisting>
+ &example.outputs;
+ <screen role="php">
+<![CDATA[
+Original Object:
+MyCloneable Object
+(
+ [object1] => SubObject Object
+ (
+ [instance] => 1
+ )
+
+ [object2] => SubObject Object
+ (
+ [instance] => 2
+ )
+
+)
+Cloned Object:
+MyCloneable Object
+(
+ [object1] => SubObject Object
+ (
+ [instance] => 3
+ )
+
+ [object2] => SubObject Object
+ (
+ [instance] => 2
+ )
+
+)
+]]>
+
+ </screen>
+
</example>
</sect1>