Lesson 4
Revising Basic Design Patterns: Composition in PHP
Lesson Overview and Goals

Hello, welcome back! Today, we will decode the fundamentals of Revising Basic Design PatternsComposition! A vital component of software design patterns, composition aids us in creating complex classes using simpler ones. Our journey today includes understanding the concept of composition, its value in software development, and how to practically implement it in PHP.

Garnering Clarity on the Composition Design Pattern

To kick-start our exploration, let's understand Composition. In object-oriented programming (OOP), composition allows a class to include other classes, paving the way for the creation of complex systems out of simpler components. For example, when building a car, we bring together independent pieces like the Engine, Wheels, and Seats — a perfect reflection of composition in everyday life. Note that in composition, should the parent object (the car) be destroyed, the child objects (the components) also cease to exist.

Acing the Composition Design in PHP

Now, let's translate the theory into a PHP code application. Transforming the previously mentioned car example, a Car class in PHP is created by making objects of the Engine, Wheels, and Seats classes. The Car class owns these child objects; their existence is dependent on the Car.

php
1<?php 2 3class Engine 4{ 5 public function start() 6 { 7 echo "Engine starts\n"; // Engine start message 8 } 9 10 public function stop() 11 { 12 echo "Engine stops\n"; // Engine stop message 13 } 14} 15 16class Wheels 17{ 18 public function rotate() 19 { 20 echo "Wheels rotate\n"; // Wheel rotation message 21 } 22} 23 24class Seats 25{ 26 public function adjust($position) 27 { 28 echo "Seats adjusted to position " . $position . "\n"; // Seat adjustment message 29 } 30} 31 32class Car 33{ 34 private $engine; 35 private $wheels; 36 private $seats; 37 38 public function __construct() 39 { 40 $this->engine = new Engine(); 41 $this->wheels = new Wheels(); 42 $this->seats = new Seats(); 43 } 44 45 public function start() 46 { 47 $this->engine->start(); // Call to start engine 48 $this->seats->adjust("upright"); // Adjust seat position 49 $this->wheels->rotate(); // Get wheels rolling 50 } 51} 52 53$myCar = new Car(); 54$myCar->start(); // Begin car functions 55 56// Prints: 57// Engine starts 58// Seats adjusted to position upright 59// Wheels rotate 60?>

In the above code, the Car class encapsulates Engine, Wheels, and Seats objects, which are independent but part of the Car class, forming a composition pattern.

In the composition model, components like Engine, Wheels, and Seats can exist independently. These classes are not subclasses of Car but are simply used by the Car to achieve its functionality. This is an important feature of composition because it allows for the reuse of these components in other contexts. For instance, the Engine class could be used in other vehicles like Truck or Boat without needing to inherit from a specific Car class.

Discerning Composition from Inheritance

In OOP, Composition and Inheritance are two significant ways to express relationships between classes. While inheritance implies an "is-a" relationship, composition suggests a "has-a" relationship. For instance, a Car is a Vehicle (inheritance), but a Car has an Engine (composition).

Lesson Summary and Practice

Superb job! You've now decoded the composition and even implemented it in PHP! Next, you'll encounter stimulating exercises where you'll gain hands-on experience with composition in PHP. Stay curious, and keep practicing to fortify your concepts!

Enjoy this lesson? Now it's time to practice with Cosmo!
Practice is how you turn knowledge into actual skills.