diff --git a/assets/templates/_table_of_contents.phtml b/assets/templates/_table_of_contents.phtml
index d6b368f..21c04f8 100644
--- a/assets/templates/_table_of_contents.phtml
+++ b/assets/templates/_table_of_contents.phtml
@@ -11,8 +11,9 @@
Loops
Arrays
Functions
- Classes
- Classes - Visibility
+ Classes: Introduction
+ Classes: Inheritance
+ Classes: Visibility
Credits
diff --git a/code/classes-inheritance.php b/code/classes-inheritance.php
new file mode 100644
index 0000000..f1eed47
--- /dev/null
+++ b/code/classes-inheritance.php
@@ -0,0 +1,62 @@
+drive();
+
+// Even though the child class inherits a parent class' properties and methods,
+// the child can still override the parent.
+class Tractor extends Vehicle
+{
+ public function drive()
+ {
+ echo "driving slowly...\n";
+ }
+}
+
+// Outputs "driving slowly..." instead of "driving...".
+$tractor = new Tractor();
+$tractor->drive();
+
+// A class can use a parent's property or method from the "$this" variable.
+class Motorcycle extends Vehicle
+{
+ public function pushPedal()
+ {
+ $this->drive();
+ }
+}
+
+// Outputs "driving...".
+$cycle = new Motorcycle();
+$cycle->pushPedal();
+
+// If you override a parent's property or method, the "$this" variable will refer to the child's
+// implementation of the property or method. To call the parent's property or method explicity,
+// use the "parent" keyword.
+class Racecar extends Vehicle
+{
+ public function drive()
+ {
+ parent::drive();
+
+ echo "driving even faster...\n";
+ }
+}
+
+// Outputs "driving..." and "driving even faster...".
+$racecar = new Racecar();
+$racecar->drive();
diff --git a/code/classes-visibility.php b/code/classes-visibility.php
index 24e1d90..2833608 100644
--- a/code/classes-visibility.php
+++ b/code/classes-visibility.php
@@ -33,11 +33,28 @@ class Phone2
}
}
-// The "protected" and "private" keywords work a little differently, but we
-// will learn more about "protected" when we discuss inheritance.
-// However, they both prevent functions and properties from being accessed outside an object.
+// The "protected" and "private" keywords work a little differently.
+// They both prevent functions and properties from being accessed outside an object.
+// However, a method or property marked "protected" can still be accessed by a child object.
class Phone3
{
private $number;
+
protected $caller;
+
+ public function setNumber($number)
+ {
+ $this->number = $number;
+ }
+}
+
+// In class "Smartphone", the "caller" property is accessible because the parent class
+// has it marked as "protected". However, "Smartphone" cannot access the the "number" property
+// because it is still listed as private.
+class Smartphone extends Phone3
+{
+ public function setCaller($caller)
+ {
+ $this->caller = $caller;
+ }
}
diff --git a/config.php b/config.php
index f3742b9..39b7303 100644
--- a/config.php
+++ b/config.php
@@ -79,13 +79,20 @@ return [
'subtitle' => 'Object-oriented programming',
'description' => '',
'previous' => 'functions',
+ 'next' => 'classes-inheritance',
+ ]),
+ Page::create('classes-inheritance', null, 'classes-inheritance.php', [
+ 'title' => 'Classes Inheritance',
+ 'subtitle' => 'Extend your objects',
+ 'description' => '',
+ 'previous' => 'classes',
'next' => 'classes-visibility',
]),
Page::create('classes-visibility', null, 'classes-visibility.php', [
'title' => 'Classes Visibility',
'subtitle' => 'Privatizing your objects',
'description' => '',
- 'previous' => 'classes',
+ 'previous' => 'classes-inheritance',
'next' => '',
]),
],