Inheritance ในภาษา PHP

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()


บทความเกี่ยวกับ Inheritance ในภาษา PHP

Inheritance ในภาษา C#

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับ Inheritance (การสืบทอด) ในภาษา C# ซึ่งเป็นคุณสมบัติที่สำคัญในการเขียนโปรแกรมเชิงวัตถุ Inheritance (การสืบทอด) เป็นคุณสมบัติหนึ...

Inheritance ในภาษา Java

ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับ Inheritance (การสืบทอด) ในภาษา Java ซึ่งเป็นคุณสมบัติที่สำคัญในการเขียนโปรแกรมเชิงวัตถุ Inheritance เป็นคุณสมบัติในการเขียนโป...

Inheritance ในภาษา Visual Basic

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