ออบเจ็ค ในภาษา PHP

9 January 2017

ในบทนี้ คุณจะได้เรียนเกี่ยวกับออบเจ็คในภาษา 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 ในการประกาศตัวแปรหรือเมธอดภายในคลาส

บทความนี้เป็นประโยชน์หรือไม่? Yes · No