If I write a regular assignment statement such as:
$postbag = $mailinglist;
or
postbag = mailinglist
(depending on the programming language), what am I doing?
"Copying a variable, you plonker!" I hear you saying ... and indeed you're right, but what's really happening? Sometimes, I'll be duplicating the contents of a variable, and other times I'll be simply be providing a second name for the same piece of data stored in memory. Most of the time, your code will run the same way whichever of these things happens, but on some occasions it will make a difference.
In a language such as
Python, which is Object Oriented from the core, an assignment of the sort shown above applies a second name to the same piece(s) of information stored on the "heap". And that means that if you run a method that alters the data that
either of the names points to, you'll be altering the data that
both of the names point to. Here's how I explain that in class:
"Your mother is called Julie Jones. So you refer to her as 'Mum' but I refer to her as 'Mrs_Jones'. Two names, same person. If you pour a tin of bright pink paint over 'Mum' and I then ask about the state of 'Mrs_Jones', I'll get back the answer 'Bright pink and livid' because 'Mum' and 'Mrs_Jones' are one and the same"
There is a slight caution here ... in Python, many of the more primitive object types (and tuples too) are immutable - which means they cannot be altered in-situ. So that although an assignment will leave you with two names for one piece of data, the act of altering it will actually produce a new, different object so (in effect) split the names at that point.
In a language such as
Perl 5, an assignment of the sort shown above duplicates that data. If it's a big piece of data, this can be very inefficient. But it means that if you alter the data via one name after you have done the copy, you'll not be altering the data held under the other name. Let's give you an example of that one:
"I have here an original copy (!) of the Magna Carta and it's very valuable. I know you would like to see it and study it in detail, but you have a reputation for drawing all over documents. So I'm going to put it into the photocopier and give you a perfect copy. Then when you put red markings all over it to correct the spelling mistakes that King John made, it's only your copy that you've effected and my precious original remains in tact"
In
PHP, the object model changed between version 4 and version 5. So PHP 4 works like Perl 5, and PHP 5 works like Python on objects - that's considered to be the correct way to do things and indeed purists will tell you that PHP 4 is "broken"! There a program from our PHP courses -
[here] - which performs differently depending on which version of PHP you're running!
OK - so the copying of the reference is "right" according to the pedantic computer scientists. But what if you want to truely make a duplicate of an object in Python or PHP 5 so that you can amend the copy, starting off with the original as your base. You need to
clone the object.
In PHP:
$nextinlitter = clone $first_adopted;
as opposed to
$lisas_lurcher = $first_adopted;
There's a complete example showing that on our web site ...
[source] and
[run it]. And that was updated yesterday(!) and is a subject covered on our
Object Oriented Programming in PHP course.
In Python, you can clone an object using the
deepcopy function from the copy module; see
[source example]. You can also "shallow copy" a list using list slice notation - example
[here]; in this case, you're just copying a collections of pointers rather than descending into a whole tree.
Illustrative image - I came across the pink daisy - a public domain picture (but I would like to offer credit
[here] to PDPhoto.org - while looking for a picture of a lady covered in pink paint, which turned out to be a fruitless quest!
(written 2010-08-14, updated 2010-08-20)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
H108 - Objects in PHP [67] Object Oriented Programming in PHP - (2004-09-29)
[124] PHP v Java - (2004-11-20)
[205] PHP5 lets you say no - (2005-02-07)
[343] Should I use structured or object oriented? - (2005-06-10)
[421] Don't repeat code - use loops or functions - (2005-08-21)
[485] North, Norther and Northest - PHP 5 Objects - (2005-11-04)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[720] Planning a hotel refurb - an example of a Gant chart in PHP - (2006-05-14)
[836] Build on what you already have with OO - (2006-08-17)
[1027] Cue the music, I'm happy. - (2007-01-09)
[1153] Object Oriented Model - a summary of changes from PHP4 to PHP5 - (2007-04-18)
[1217] What are factory and singleton classes? - (2007-06-04)
[1535] OO PHP demonstration - comparing objects and more - (2008-02-08)
[1682] Accounts in PHP - an OO demo - (2008-06-19)
[1819] Calling base class constructors - (2008-10-03)
[1820] Sorting objects in PHP - (2008-10-04)
[1925] Introduction to Object Oriented Programming - (2008-12-06)
[2160] PHP - getclass v instanceof - (2009-05-07)
[2169] When should I use OO techniques? - (2009-05-11)
[2171] Cleaning up redundant objects - (2009-05-11)
[2172] PHP4 v PHP5 - Object Model Difference - (2009-05-11)
[2380] Object Oriented programming - a practical design example - (2009-08-27)
[2434] Abstract classes, Interfaces, PHP and Java - (2009-10-03)
[2435] Serialization - storing and reloading objects - (2009-10-04)
[2632] Shipping a test harness with your class in PHP - (2010-02-12)
[2641] Object Oriented Programming in PHP - (2010-02-19)
[2680] Static class members in PHP - a documented example - (2010-03-16)
[2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
[2741] What is a factory? - (2010-04-26)
[2774] PHP - Object Oriented Design in use - (2010-05-21)
[2922] Getting the OO design write - with PHP a example - (2010-08-14)
[3142] Private and Public - and things between - (2011-01-22)
[3210] Catchable fatal error in PHP ... How to catch, and alternative solutions such as JSON - (2011-03-22)
[3211] Computer Graphics in PHP - World (incoming data) to Pixel (screen) conversion - (2011-03-24)
[3607] Designing your application - using UML techniques - (2012-02-11)
[3608] Design Patterns - what are they? Why use them? - (2012-02-12)
[3609] How do classes relate to each other? Associated Classes - (2012-02-12)
[3840] Autoload in PHP - (2012-08-17)
[3841] Copying, duplicating, cloning an object in PHP - (2012-08-18)
[3843] Caching Design Patterns - (2012-08-20)
[3953] Objects in PHP - Revision - (2012-12-16)
[4057] stdClass in PHP - using an object rather than an associative array - (2013-04-02)
[4073] Learning about Object Orientation in PHP - a new set of examples - (2013-04-28)
[4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
[4366] Changing what operators do on objects - a comparison across different programming languages - (2014-12-26)
[4626] Singleton design pattern - examples and uses - (2016-01-20)
[4627] Caching results in an object for efficiency - avoiding re-calculation - (2016-01-20)
[4628] Associative objects - one object within another. - (2016-01-20)
Some other Articles
Well House - the picturesJob applicants - wondering why they applyFresh air and beautiful places in WiltshireDoes copying a variable duplicate the contents?Sorting - naturally, or into a different orderLondon to Calne, Corsham, Melksham, Bradford-on-Avon, Chippenham by public TransportDownloading a report from the web for further local analysisUpload Image, Store in database, redisplay in browser. PHP and MySQLTesting the robustness of our hotel and training systems - holiday and sickness times