ออบเจ็ค ในภาษา PHP
ในบทนี้ คุณจะได้เรียนเกี่ยวกับออบเจ็คในภาษา PHP เราจะนำคลาสที่ได้สร้างไว้ในบทก่อนหน้ามาสร้างเป็นออบเจ็คเพื่อใช้งาน
ออบเจ็คคืออะไร
ออบเจ็ค (Object) คือตัวแปรประเภทหนึ่งที่สร้างมาจากคลาสหรือ Class Instance ออบเจ็คมีการอ้างถึงสมาชิกของมันที่เป็นตัวแปรและเมธอด ซึ่งในภาษา PHP นั้นทุกอย่างต่างก็เป็นออบเจ็คไม่ว่าจะเป็น ตัวแปร อาเรย์ หรือฟังก์ชัน และคลาสเป็นเหมือนประเภทข้อมูลที่นำมาสร้างออบเจ็ค ดังนั้นออบเจ็คหลายออบเจ็คอาจจะมีการสร้างมาจากคลาสเดียวกัน (Class base)
ในภาษา PHP ออบเจ็คนั้นเป็นข้อมูลประเภท Reference type ที่อ้างถึงตำแหน่งของข้อมูลในหน่วยความจำ นั่นหมายความว่าออบเจ็คเดียวกันอาจจะมีได้หลายตัวแปรออบเจ็ค
การสร้างออบเจ็ค
ต่อไปมาดูตัวอย่างการสร้างออบเจ็คซึ่งเราจะนำคลาส User
จากบทก่อนหน้าที่เราได้สร้างไว้มาสร้างออบเจ็ค
<?php
class User {
public $firstName;
public $lastName;
public $homeTown;
private $birthYear;
public function indroduce() {
echo "I'm $this->firstName $this->lastName\n";
echo "I live in $this->homeTown\n";
}
public function setBirthYear($birthYear) {
$this->birthYear = $birthYear;
}
public function getAge() {
$currentYear = 2017;
$age = $currentYear - $this->birthYear;
return $age;
}
}
$user1 = new User();
$user1->firstName = "Mateo";
$user1->lastName = "Marcus";
$user1->homeTown = "Berlin";
$user1->setBirthYear(1988);
$user1->indroduce();
echo "My age is " . $user1->getAge() . "\n";
$user2 = new User();
$user2->firstName = "Rasmus";
$user2->lastName = "Lerdorf";
$user2->homeTown = "Qeqertarsuaq";
$user2->setBirthYear(1968);
echo "Name: $user2->firstName $user2->lastName\n";
echo "Home town: $user2->homeTown\n";
echo "Age: " . $user2->getAge() . "\n";
?>
ในตัวอย่าง เราได้สร้างออบเจ็คจากคลาส User
ซึ่งเป็นคลาสในการเก็บข้อมูลของผู้ใช้ เช่น ชื่อ นามสกุล เมื่อง และปีเกิด และฟังก์ชันในการทำงาน ซึ่งเราได้นำคลาสมาสร้างสองออบเจ็คคือ $user1
และ $user2
$user1 = new User();
ในคำสั่งนี้เป็นการสร้างออบเจ็ค $user1
จากคลาส User
โปรแกรมจะทำการสร้างตัวแปรและเมธอดสำหรับออบเจ็คนี้ และเราใช้ $user1
เป็นตัวแปรในการเข้าถึงค่าต่างๆ ของออบเจ็ค
$user1->firstName = "Mateo";
$user1->lastName = "Marcus";
$user1->homeTown = "Berlin";
$user1->setBirthYear(1988);
$user1->indroduce();
echo "My age is " . $user1->getAge() . "\n";
เราได้กำหนดค่าให้กับตัวแปร (Property) ของออบเจ็ค $user1
โดยการเข้าถึงตัวแปรและเมธอดภายในออบเจ็ค จะใช้สัญลักษณ์ ->
ตามด้วยชื่อของตัวแปรหรือเมธอด สำหรับตัวแปรนั้นจะไม่มีเครื่องหมาย $
นำหน้า
$user2 = new User();
$user2->firstName = "Rasmus";
$user2->lastName = "Lerdorf";
$user2->homeTown = "Qeqertarsuaq";
$user2->setBirthYear(1968);
และเราสร้างออบเจ็ค $user2
สำหรับเก็บข้อมูลของอีกคน โดยทั้งออบเจ็คทั้งสองจะมีโครงสร้างข้อมูลที่เหมือนกัน ซึ่งแต่ละออบเจ็คจะมีตัวแปรและเมธอดของมันเอง แต่ที่แตกต่างกันคือข้อมูลภายในออบเจ็ค
echo "Name: $user2->firstName $user2->lastName\n";
echo "Home town: $user2->homeTown\n";
echo "Age: " . $user2->getAge() . "\n";
ในการแสดงผล เราเข้าถึงค่าของออบเจ็คโดยตรงผ่านตัวแปรออบเจ็ค $user2
สำหรับการเข้าถึงค่าของตัวแปรภายในออบเจ็คนั้นจะสามารถเข้าถึงได้สำหรับตัวแปรที่มีการกำหนดระดับการเข้าถึงเป็น public
เท่านั้น และเนื่องจากตัวแปร $birthYear
มีระดับการเข้าถึงเป็น private
เราจะไม่สามารถเข้าถึงตัวแปรได้โดยตรงได้จากตัวแปรของออบเจ็ค
$user->birthYear = 1968;
คำสั่งนี้จะไม่ทำงานและเกิดข้อผิดพลาดขึ้น เพราะว่าตัวแปรที่มีระดับการเข้าถึงเป็น private
จะไม่สามารถเข้าถึงจากภายนอกคลาสได้
I'm Mateo Marcus
I live in Berlin
My age is 29
Name: Rasmus Lerdorf
Home town: Qeqertarsuaq
Age: 49
นี่เป็นผลลัพธฺ์ในการทำงานของโปรแกรม
การสร้างออบเจ็คกับ Constructor
ต่อไปจะเป็นตัวอย่างการสร้างออบเจ็คกับคลาสที่มี Constructor ในภาษา PHP มันใช้สำหรับกำหนดค่าเริ่มต้นให้กับออบเจ็คในตอนที่ออบเจ็คถูกสร้าง และเราจะทำลายออบเจ็คเพื่อให้ Destructor ของออบเจ็คทำงาน
<?php
class User {
public $firstName;
public $lastName;
public $homeTown;
private $birthYear;
public function __construct($firstName, $lastName) {
echo "Object created\n";
$this->firstName = $firstName;
$this->lastName = $lastName;
}
public function __destruct() {
echo "$this->firstName's object destroyed\n";
}
public function indroduce() {
echo "I'm $this->firstName $this->lastName\n";
echo "I live in $this->homeTown\n";
}
public function setBirthYear($birthYear) {
$this->birthYear = $birthYear;
}
public function getAge() {
$currentYear = 2017;
$age = $currentYear - $this->birthYear;
return $age;
}
}
$user1 = new User("Mateo", "Marcus");
$user1->homeTown = "Berlin";
$user1->setBirthYear(1988);
$user1->indroduce();
echo "My age is " . $user1->getAge() . "\n";
unset($user1);
?>
ในตัวอย่างเป็นการสร้างออบเจ๊คจากคลาส User
เช่นเดิม แต่ในตอนนี้เราได้เพิ่ม Constructor และ Destructor ภายในคลาสด้วย
$user1 = new User("Mateo", "Marcus");
ในคำสั่งนี้ เป็นการสร้างออบเจ็คกับคลาสที่มี Constructor ซึ่งเราต้องส่งพารามิเตอร์ที่ได้กำหนดไว้ใน Constructor เสมอ และ Constructor จะถูกเรียกใช้งานทันทีหลังจากที๋โปรแกรมจองหน่วยความจำสำหรับตัวแปรของออบเจ็ค $user1
สำเร็จ
unset($user1);
หลังจากใช้งานเสร็จแล้ว เราใช้ฟังก์ชัน unset()
ในการยกเลิกการประกาศหรือลบออบเจ็คออกไปจากหน่วยความจำ ซึ่งจะทำให้ Destructor ถูกเรียกใช้งาน และออบเจ็คถูกลบ
Object created
I'm Mateo Marcus
I live in Berlin
My age is 29
Mateo's object destroyed
นี่เป็นผลลัพธ์ในการทำงานของโปรแกรม
คำสั่ง $this การอ้างถึงสมาชิกของออบเจ็ค
ในภาษา PHP คำสั่ง $this
เป็นคำสั่งในการอ้างถึงตัวแปรหรือเมธอดภายในคลาส จากตัวอย่างของคลาส User
เราได้เข้าถึงตัวแปรต่างๆ ของออบเจ็คภายในคลาส
public function setBirthYear($birthYear) {
$this->birthYear = $birthYear;
}
public function getAge() {
$currentYear = 2017;
$age = $currentYear - $this->birthYear;
return $age;
}
ในตัวอย่าง เราเข้าถึงตัวแปร $birthYear ด้วยคำสั่ง $this->birthYear
สำหรับกำหนดค่าให้กับออบเจ็คและนำค่าจากออบเจ็คมาแสดงผล สำหรับเมธอดก็เช่นกัน คุณสามารถเข้าถึงเมธอดอื่นๆ ภายในคลาสได้ เช่น $this->methodName()
Static methods and variables
ในการประกาศตัวแปรและเมธอดในคลาสนั้น เราสามารถใช้คำสั่ง static
เพื่อประกาศได้ โดยทั่วไปแล้วเราใช้คำสั่ง static
เพื่อสร้างตัวแปรหรือเมธอดที่ทำงานไม่ขึ้นกับออบเจ็ค นั่นหมายความว่าตัวแปรหรือเมธอดดังกล่าวนั้นไม่ได้เป็นสมาชิกของออบเจ็ค เพียงแต่มันอาศัยอยู่ในคลาสด้วยเท่านั้น มาดูตัวอย่างการใช้งาน static เมธอดในภาษา PHP
<?php
class User {
public $firstName;
public $lastName;
public function getFullName() {
return $this->firstName . ' ' . $this->lastName;
}
public static function helloUser($name) {
echo 'Hello ', $name, '\n';
}
}
$user = new User();
$user->firstName = 'Bob';
$user->lastName = 'Conley';
echo $user->getFullName(), '\n';
echo User::helloUser('Tommy');
echo User::helloUser($user->getFullName());
?>
ในตัวอย่าง คลาส User
นั้นมีสองตัวแปรสำหรับเก็บชื่อและเมธอดสำหรับรับค่าชื่อแบบเต็ม ซึ่งเหล่านี้ถูกสร้างโดยไม่ได้ใช้คำสั่ง static
นำหน้า ดังนั้นสมาชิกเหล่านี้เป็นของออบเจ็ค และเรามีเมธอด helloUser()
ซึ่งเป็น static เมธอดโดยการใช้คำสั่ง static
นำหน้าตัวแปรหรือเมธอดที่ต้องการให้เป็น static โดยเมธอดนี้ใช้สำหรับแสดงข้อความทักทายชื่อที่ส่งเข้ามา สังเกตว่ามันไม่ได้มีส่วนเกี่ยวข้องกับตัวแปรหรือเมธอดอื่นๆ ในคลาสเลย
echo User::helloUser('Tommy');
echo User::helloUser($user->getFullName());
ในการเรียกใช้งาน static เมธอดนั้นสามารถทำได้โดยใช้ชื่อคลาส ตามด้วยเครื่องหมาย ::
แล้วตามด้วยชื่อของเมธอดปกติ
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับออบเจ็ค วิธีการสร้างออบเจ็คและการสร้างออบเจ็คกับ Constructor และการใช้งานคำสั่ง $this
ภายในคลาสสำหรับการอ้างถึงสมาชิกของคลาสปัจจุบัน และความแตกต่างระหว่างการใช้คำสั่ง static และ none static ในการประกาศตัวแปรหรือเมธอดภายในคลาส