Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
Python and Tcl - public course schedule [here]
Private courses on your site - see [here]
Please ask about maintenance training for Perl, PHP, Lua, etc
Getting the OO design write - with PHP a example

One of the great beauties of Object Oriented Design is that you can say "I want to handle a type of data that's based on an xxx", and if someone's already written (and made available) the code for an xxx, all you have do do is define the additions and differences, rather than starting from scratch. So this means that OO is great for applications where you have a whole lot of different types of thing with similar, but never the less different, behavior.

Let's say, for example, that I'm writing a whole lot of code to help Henry, who lives with his girlfriend Emma, a cat, and a whole lot of dogs, look after his dependents. Before you accuse me of being sexist, I'm sorry to have to tell you that whilst Henry is gainfully employed at the moment, Emma is between jobs as she used to work for Sun4U:

OK - glad we cleared that one up ;-) ...

So Henry has Emma, Gypsy (a lurcher), Wover, Spot (a dalmatian!), Rufus, "Oy - you", and Charlie the cat.

Now - design MATTERS - and Henry should start with a common base for shared code and build on that. In fact, he was on our recent Object Oriented Design in PHP course and went away with a class called "animal" that forms a good basis for his project. So:

• A cat is a type of animal
• A dog is a type of animal
• A girlfriend is similar to an animal
• A lurcher is a type of dog but has subtle differences
• A dalmatian is a type of dog (but behaves just like any other dog)

And from that, Henry can draw up a diagram that shows how his classes relate to each other. The black circles on this diagram show each of the classes, and the lines rising from each link to the classes that are extended from it (i.e. inherit from it). You'll note that we do not have a separate class for "dalmatian" as a dalmatian is just another dog, but we do have a separate class for a lurcher as they're vocally different to other dogs.

Object Oriented design - getting your classes and method structure rightHaving decided on the layout of the classes, Henry now needs to decide what actions he wants to be able to perform on each of his dependents. As he does so, he'll add the method names that correspond to each action into the tree, minimizing the number of times he needs to add each method. For things like "getname", he can simply refer to a piece of common code in the "animal" class. For his constructor (that's __construct in PHP), it's most efficient for him to put a common piece of code in the base class "animal", but then add in a method to override it for "girlfriend", as girlfriends are always assumed to weigh 53 kgs (the weight of a supermodel, according to Henry's on line research) and be aged 21, whereas you can be more honest with an animal. The expected lifespan of dogs (including lurchers), cats, and humans differs by species, so there's going to be a separate "geteage" or get-effective-age in the dog, cat and girlfriend classes ... and so, onwards, goes the design.

Look at the completed design, and you'll see that I have added yellow lines to show you how the various methods work when you call them up on an object of type lurcher:
• The constructor is inherited from the base animal class
• getweight, getname and olderthan also come from the base animal class
• geteage comes from the dog class ... and ...
• says is actually defined in the lurcher class (overriding the one that's in the base animal class!)

I can now write a test piece of code to see how my design stacks up - this is a sort of specification check to ensure that I've not missed anything out:
  $hounds = array(new lurcher("Gypsy",30,4),
    new dog("Wover",60,20),
    new dog("Spot",15,9),
    new girlfriend("Emma"),
    new cat("Charlie",4,12),
    new dog("Rufus",10,10),
    new dog("Oy - you",6,8));
  foreach ($hounds as $hound) {
    $called = $hound->getname();
    $heavy = $hound->getweight();
    $old = $hound->geteage();
    $sound = $hound->says();
    print ("$called weighs ${heavy}kgs, is aged $old and says $sound\n");

Having got the design worked out carefully, I can then write the class code secure in the knowledge that I won't have too many nasty surprises and changes of direction also on the way. The example code that I wrote during the course, basically translating the diagram above may be seen [here].

The output from the code above ... and, yes, I have checked it, looks as follows:
  Gypsy weighs 30kgs, is aged 28 and says [nothing]
  Wover weighs 60kgs, is aged 140 and says "moo"
  Spot weighs 15kgs, is aged 63 and says "moo"
  Emma weighs 53kgs, is aged 21 and says "Will you come shopping with me"
  Charlie weighs 4kgs, is aged 72 and says "miaow"
  Rufus weighs 10kgs, is aged 70 and says "moo"
  Oy - you weighs 6kgs, is aged 56 and says "moo"

My example code also contains the logic to find the older (of two) and the oldest (of a whole array) of animals (or objects which are subtypes of animals). There's a little more about that on a previous article [here].
(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
  [4628] Associative objects - one object within another. - (2016-01-20)
  [4627] Caching results in an object for efficiency - avoiding re-calculation - (2016-01-20)
  [4626] Singleton design pattern - examples and uses - (2016-01-20)
  [4366] Changing what operators do on objects - a comparison across different programming languages - (2014-12-26)
  [4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
  [4073] Learning about Object Orientation in PHP - a new set of examples - (2013-04-28)
  [4057] stdClass in PHP - using an object rather than an associative array - (2013-04-02)
  [3953] Objects in PHP - Revision - (2012-12-16)
  [3843] Caching Design Patterns - (2012-08-20)
  [3841] Copying, duplicating, cloning an object in PHP - (2012-08-18)
  [3840] Autoload in PHP - (2012-08-17)
  [3609] How do classes relate to each other? Associated Classes - (2012-02-12)
  [3608] Design Patterns - what are they? Why use them? - (2012-02-12)
  [3607] Designing your application - using UML techniques - (2012-02-11)
  [3211] Computer Graphics in PHP - World (incoming data) to Pixel (screen) conversion - (2011-03-24)
  [3210] Catchable fatal error in PHP ... How to catch, and alternative solutions such as JSON - (2011-03-22)
  [3142] Private and Public - and things between - (2011-01-22)
  [2921] Does copying a variable duplicate the contents? - (2010-08-14)
  [2774] PHP - Object Oriented Design in use - (2010-05-21)
  [2741] What is a factory? - (2010-04-26)
  [2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
  [2680] Static class members in PHP - a documented example - (2010-03-16)
  [2641] Object Oriented Programming in PHP - (2010-02-19)
  [2632] Shipping a test harness with your class in PHP - (2010-02-12)
  [2435] Serialization - storing and reloading objects - (2009-10-04)
  [2434] Abstract classes, Interfaces, PHP and Java - (2009-10-03)
  [2380] Object Oriented programming - a practical design example - (2009-08-27)
  [2172] PHP4 v PHP5 - Object Model Difference - (2009-05-11)
  [2171] Cleaning up redundant objects - (2009-05-11)
  [2169] When should I use OO techniques? - (2009-05-11)
  [2160] PHP - getclass v instanceof - (2009-05-07)
  [1925] Introduction to Object Oriented Programming - (2008-12-06)
  [1820] Sorting objects in PHP - (2008-10-04)
  [1819] Calling base class constructors - (2008-10-03)
  [1682] Accounts in PHP - an OO demo - (2008-06-19)
  [1535] OO PHP demonstration - comparing objects and more - (2008-02-08)
  [1217] What are factory and singleton classes? - (2007-06-04)
  [1153] Object Oriented Model - a summary of changes from PHP4 to PHP5 - (2007-04-18)
  [1027] Cue the music, I'm happy. - (2007-01-09)
  [836] Build on what you already have with OO - (2006-08-17)
  [720] Planning a hotel refurb - an example of a Gant chart in PHP - (2006-05-14)
  [656] Think about your design even if you don't use full UML - (2006-03-24)
  [485] North, Norther and Northest - PHP 5 Objects - (2005-11-04)
  [421] Don't repeat code - use loops or functions - (2005-08-21)
  [343] Should I use structured or object oriented? - (2005-06-10)
  [205] PHP5 lets you say no - (2005-02-07)
  [124] PHP v Java - (2004-11-20)
  [67] Object Oriented Programming in PHP - (2004-09-29)

Q909 - Object Orientation and General technical topics - Object Orientation: Composite Objects
  [4450] Deciding whether to use parameters, conditional statements or subclasses - (2015-03-05)
  [4394] Philosophy behind object design - and how I applied in to a Java example - (2015-01-14)
  [4377] Designing a base class and subclasses, and their extension, in C++ - (2015-01-01)
  [3979] Extended and Associated objects - what is the difference - C++ example - (2013-01-18)
  [3251] C++ - objects that are based on other objects, saving coding and adding robustness - (2011-04-17)
  [3152] Jargon busting - (2011-01-30)
  [2865] Relationships between Java classes - inheritance, packaging and others - (2010-07-10)
  [2170] Designing a heirarcy of classes - getting inheritance right - (2009-05-11)
  [1348] Screw it or Glue it? Access to Object variables - a warning - (2007-09-12)
  [1345] Perl and Shell coding standards / costs of an IT project - (2007-09-11)
  [592] NOT Gone phishing - (2006-02-05)
  [477] Class, static and unbound variables - (2005-10-25)

Back to
Does copying a variable duplicate the contents?
Previous and next
Horse's mouth home
Forward to
Fresh air and beautiful places in Wiltshire
Some other Articles
Journey times to Melksham, Wiltshire
Well House - the pictures
Job applicants - wondering why they apply
Fresh air and beautiful places in Wiltshire
Getting the OO design write - with PHP a example
Sorting - naturally, or into a different order
London to Calne, Corsham, Melksham, Bradford-on-Avon, Chippenham by public Transport
Downloading a report from the web for further local analysis
Upload Image, Store in database, redisplay in browser. PHP and MySQL
4759 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page

This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2019: 404 The Spa • Melksham, Wiltshire • United Kingdom • SN12 6QL
PH: 01225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/2922_Get ... ample.html • PAGE BUILT: Sat May 27 16:49:10 2017 • BUILD SYSTEM: WomanWithCat