Inheritance

Inheritance คือคุณสมบัติการสืบทอดในการเขียนโปรแกรมเชิงวัตถุ โดยที่คลาสสามารถสืบทอดคุณสมบัติ (Property) หรือตัวแปรและเมธอด (Method) มาจากคลาสหลัก (Parent class) ได้ Inheritance เป็นคุณสมบัติที่สำคัญในการเขียนโปรแกรมเชิงวัตถุ ซึ่งเป็นแนวคิดในการลดความซ้ำซ้อนของโค้ดและการนำโค้ดกลับมาใช้ใหม่ (Reuse)

เมื่อคลาสถูกสืบทอดไปโดยคลาสใหม่ (Sub class) ตัวแปรและเมธอดในคลาสหลักทั้งหมดที่มีระดับการเข้าถึงเป็น public และ protected จะถูกสืบทอด ยกเว้น private และ Constructor เท่านั้นที่ไม่สามารถสืบทอดได้ นอกจากนี้ใน Sub class เรายังสามารถกำหนดตัวแปรและเมธอดการทำงานเพิ่มเติมได้

นี่เป็นรูปแบบการสืบทอดของคลาสในภาษา PHP

class SubClass extends ParentClass {
    // Class members
}

ในตัวอย่าง เป็นรูปแบบการสืบทอดของคลาสในภาษา PHP เมื่อ SubClass เป็นคลาสที่สร้างขึ้นใหม่ที่สืบทอดสมาชิกมาจาก ParentClass และคำสั่ง extends เป็นคำสั่งที่ใช้ในการสืบทอดคลาส

การสืบทอดคลาสในภาษา PHP

ต่อไปมาดูตัวอย่างการสืบทอดคลาสในภาษา PHP ซึ่งเราจะมีคลาส Person สำหรับเก็บข้อมูลของผู้ใช้ และเราจะสร้างคลาสใหม่ที่สืบทอดคุณสมบัติจากคลาสนี้

<?php

class Person {

    public $firstName;
    public $lastName;
    public $country;

    function __construct($firstName, $lastName) {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }

    public function getFullName() {
        return $this->firstName . " " . $this->lastName;
    }

}

class Programmer extends Person {

    public $language;
    public $yearExperience;

    function __construct($firstName, $lastName) {
        parent::__construct($firstName, $lastName);
    }

    public function about() {
        return $this->getFullName() .
            " is a $this->language programmer\n";
    }

}

$person = new Programmer("Mateo", "Marcus");
$person->country = "Ukraine";
$person->language = "PHP";
$person->yearExperience = 5;

echo $person->about();
echo "He has worked in $person->country";
echo " for $person->yearExperience years\n";

$person2 = new Programmer("Danny", "Burden");
$person2->country = "Germany";
$person2->language = "Java";
$person2->yearExperience = 8;

echo $person2->about();
echo "He has worked in $person2->country";
echo " for $person2->yearExperience years\n";

?>

ในตัวอย่างเรามีคลาส Person ซึ่งเป็นคลาสหลัก และเราได้สร้างคลาส Programmer ที่สืบทอดคุณสมบัติจากคลาสดังกล่าว

class Person {

    public $firstName;
    public $lastName;
    public $country;

    function __construct($firstName, $lastName) {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }

    public function getFullName() {
        return $this->firstName . " " . $this->lastName;
    }

}

ในคลาส Person ตัวแปรและเมธอดทั้งหมดจะถูกสืบทอดไปยังคลาส Programmer เพราะได้มีการประกาศเป็น public นั่นหมายความว่าในคลาส Programmer จะมีตัวแปรและเมธอดเหมือนที่คลาสหลักของมันมี สำหรับ Constructor นั้นไม่สามารถสืบทอดได้

class Programmer extends Person {

    public $language;
    public $yearExperience;

    function __construct($firstName, $lastName) {
        parent::__construct($firstName, $lastName);
    }

    public function about() {
        return $this->getFullName() .
            " is a $this->language programmer\n";
    }

}

ในคลาส Programmer ได้มีการประกาศตัวแปรและเมธอดเพิ่มเติม และในเมธอด about() เราได้เข้าถึงเมธอด getFullName() ที่ได้สืบทอดมาจากคลาสหลัก นั่นหมายความว่าเราสามารถเข้าถึงสมาชิกทั้งหมดจากคลาสหลักหรือคลาสของมันด้วยคำสั่ง $this

และเพราะว่า Constructor ไม่สามารถสืบทอดได้ เราจึงต้องสร้างอันใหม่สำหรับคลาส Programmer และเรียกใช้ Constructor ของคลาสหลักด้วยคำสั่ง parent::__construct() เพื่อกำหนดค่าเริ่มต้นให้กับออบเจ็ค

Mateo Marcus is a PHP programmer
He has worked in Ukraine for 5 years
Danny Burden is a Java programmer
He has worked in Germany for 8 years

นี่เป็นผลลัพธ์การทำงานของโปรแกรมจากการสืบทอดคลาสในภาษา PHP

Overriding method

คุณสมบัติที่สำคัญในในภาษา PHP เกี่ยวกับการ Inheritance คือการที่เมธอดในคลาสหลักสามารถถูก Override ได้โดย Sub class ของมัน ซึ่งเป็นการเปลี่ยนโค้ดการทำงานในเมธอดเพื่อให้สอดคล้องกับใน Sub class แต่เมธอดยังคงมีชื่อเหมือนเดิม อย่างไรก็ตามเมธอดในคลาสหลักไม่ได้หายไป แต่มันเพียงแค่ถูกช่อนเอาไว้ในบริษทของ Sub class และสามารถเข้าถึงได้ด้วยคำสั่ง parent มาดูตัวอย่างในการ Override method ในภาษา PHP

<?php

class Square {

    public $width;
    public $height;

    public function getArea() {
        return $width * $height;
    }

}

class Cube extends Square {

    public $dept;

    public function getArea() {
        return (parent::getArea() * 2) + 
            ($this->width * $this->dept * 2) +
            ($this->height * $this->dept * 2);
    }

    public function getVolume () {
        return $this->width * $this->height * $this->dept;
    }

    public function __toString() {
        return "[width = $this->width, " .
        "height = $this->height, " . 
        "dept = $this->dept]";
    }

}

$c = new Cube();
$c->width = 4;
$c->height = 5;
$c->dept = 3;

echo "Cube " . $c . "\n";
echo "Surface area = " . $c->getArea() . "\n";
echo "Volume  = " . $c->getVolume () . "\n";

$d = new Cube();
$d->width = 8;
$d->height = 8;
$d->dept = 8;

echo "Cube " . $d . "\n";
echo "Surface area = " . $d->getArea() . "\n";
echo "Volume  = " . $d->getVolume () . "\n";

?>

ในตัวอย่างเรามีคลาส Cube ซึ่ง extend มาจากคลาส Square ในคลาสนี้เราได้ทำการ Override เมธอด getArea()

public function getArea() {
    return (parent::getArea() * 2) + 
    ($this->width * $this->dept * 2) +
    ($this->height * $this->dept * 2);
}

เราได้กำหนดการทำงานของเมธอด getArea() ใหม่สำหรับคลาส Cube เพื่อให้เป็นการหาพื้นที่ผิวของรูปทรงสี่เหลียมแทน โดยสูตรในการหาพื้นที่ก็คือการนำพื้นที่ของ 6 ด้านมาบวกกัน เราได้เรียกใช้เมธอดจากคลาสหลักด้วยคำสั่ง parent::getArea() เพราะมันเป็นพื้นที่ของด้านกว้างและยาวที่ถูก Override ไปแต่สามารถเข้าถึงด้วยคำสั่ง parent

การใช้งาน __toString() method

เมื่อเรามีการอ้างถึงตัวแปรของออบเจ็ค โปรแกรมจะทำการเรียกใช้เมธอด __toString() ซึ่งเป็นเมธอดที่ใช้ในการอธิบายเกี่ยวกับออบเจ็ค และส่งค่าเป็น String กลับมา ในภาษาเขียนโปรแกรมเชิงวัตถุโดยทั่วไปแล้ว เมธอดนี้จะถูกสร้างอัตโนมัติเมื่อออบเจ็คถูกสร้าง แต่ในภาษา PHP คุณต้องสร้าง Override เมธอด __toString() ทุกครั้งถ้าหากต้องมีการเรียกใช้ตัวแปรออบเจ็ค เหมือนในตัวอย่างต่อไปนี้ที่เราได้สร้างเมธอดในคลาส Cube

public function __toString() {
    return "[width = $this->width, " .
    "height = $this->height, " . 
    "dept = $this->dept]";
}

ในตัวอย่างเป็นเมธอด __toString() ที่ใช้อธิบายออบเจ็คเกี่ยวกับความกว้าง ความยาว และความลึกของลูกบาศก์

echo "Cube " . $c . "\n";

นีเป็นคำสั่งในการเรียกใช้งานตัวแปรออบเจ็ค $c และผลลัพธ์ที่ได้เป็นค่าของ String ที่ได้กำหนดไว้ในเมธอด __toString()

Cube [width = 4, height = 5, dept = 3]
Surface area = 54
Volume  = 60
Cube [width = 8, height = 8, dept = 8]
Surface area = 256
Volume  = 512

นี่เป็นผลลัพธ์การทำงานของโปรแกรมในการ Override เมธอด และใช้งานเมธอด __toString() ผ่านตัวแปรของออบเจ็ค

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับ Inheritance ซึ่งเป็นคุณสมบัติของการสืบทอดคลาสในภาษา PHP และเราพูดเกี่ยวกับการ Override เมธอดสำหรับการทำงานในคลาสใหม่ รวมถึงเข้าใจวัตถุประสงค์และการใช้งานของเมธอด __toString()