brightnessClass & Object

ชนากานต์ วิเชียร์รัตน์ 640710503

PHP

Object ใน PHP จะมี common key อยู่ 2 ตัวที่ทำงานร่วมกัน คือ

  • State

  • Behavior

ตามตัวอย่างใน https://www.phptutorial.netarrow-up-right เขายกตัวอย่างบัญชีธนาคารที่มี state เป็น

  • Account number

  • Balance

และมี behavior เป็น

  • Deposit

  • Withdraw เป็นต้น

*ขออนุญาตใช้ obj. แทน object นะคะ ขอบคุณค่ะ*

เพื่อให้เห็นภาพชัดเจนยิ่งขึ้น จะขอยกตัวอย่างการ define obj. จากโค้ดของเว็บ https://www.w3schools.com/phparrow-up-right

<?php
class Fruit {
  // Properties
  public $name;
  public $color;

  // Methods
  function set_name($name) {
    $this->name = $name;
  }
  function get_name() {
    return $this->name;
  }
}

$apple = new Fruit();
$banana = new Fruit();
$apple->set_name('Apple');
$banana->set_name('Banana');

echo $apple->get_name();
echo "<br>";
echo $banana->get_name();
?>

ตัวอย่างโค้ดนี้ จะสังเกตเห็นว่า class Fruit มี obj. อยู่ 2 ตัวด้วยกัน ซึ่งก็คือ $apple และ $banana

Q : ทำไมถึงบอกว่าเป็น 2 ตัวนี้?

A : ก็เพราะว่า obj. ของ class จะถูกสร้างขึ้นด้วย keyword => “new”

อีกเรื่อง คือ class 1 class สามารถมีหลาย obj. ได้ด้วยนะ


ทีนี้มาดูเรื่อง Class กันบ้าง

ก่อนอื่นมาทำความเข้าใจเกี่ยวกับ class กันสักหน่อย

Q : อะไรคือ class?

A : class ก็คือ blueprint ที่ใช้สำหรับสร้าง obj. ซึ่งมันจะกำหนด properties และ method ต่างๆของ obj. นั้นๆ

อันที่จริงเราสามารถพบ obj. ที่มีลักษณะเดียวกันหลายชนิดก็ได้เช่นกัน

Q : …หมายความว่ายังไง?

A : โอเค งั้นเริ่มจากคำถามง่ายๆ ถ้าถามว่าธนาคารมี 1 บัญชีธนาคารไหม?

คำตอบคือ ไม่! ธนาคารมีหลายบัญชีมาก ในแต่ละบัญชีก็จะมีเลขบัญชีและยอดเงินคงเหลือที่แตกต่างกันออกไป ของใครของมัน

และเจ้าบัญชีธนาคารหลายๆบัญชีพวกนี้นี่แหละ พวกมันถูกสร้างขึ้นด้วย blueprint เดียวกัน ซึ่งถ้าบอกว่าเรา มี class แม่ชื่อว่า BankAccount ในด้านของ OOP เราสามารถบอกได้อีกว่าบัญชีธนาคารแต่ละบัญชีคือ obj. ของ class BankAccount นั่นเอง

พอเข้าใจไหม? ถ้าไม่ งั้นดูตามนี

จากภาพด้านบน จะเห็นว่ามันแสดงความสัมพันธ์ระหว่าง class BankAccount และ obj. ของมัน จาก class BankAccount เราสามารถสร้าง obj. ของ BankAccount หลายตัวได้และ obj. แต่ละตัวก็จะมีหมายเลขบัญชีและยอดเงินคงเหลือของตัวมันเอง

ต่อมาในส่วนของการ define class ก็ไม่มีอะไรยุ่งยาก เราแค่ใช้ keyword ว่า "class" แล้วตามด้วยชื่อ ของ class ก็เป็นอันจบ ยกตัวอย่าง 2 class ด้านล่าง

Q : ชื่อ class เขียนแบบนี้ -> className ได้ไหม?

A : ไม่ได้จ้า

เมื่อเราจะ define class สัก class นึงขึ้นมาเราควรทำตามกฎ ดังนี้

  • ชื่อ class ควรอยู่ในรูปแบบ Upper Camel Case โดยคำแต่ละคำต้องขึ้นต้นด้วย “ตัวพิมพ์ใหญ่” ดู จาก code ด้านบนเป็นตัวอย่าง -> ClassName, BankAccount

  • ถ้าชื่อ class เป็นคำนาม ก็ควรให้อยู่รูปเอกพจน์

  • เราต้องกำหนด class แต่ละ class ในไฟล์ PHP แยกกัน

  • ส่วนข้อนี้ เหมือนกับที่เคยบอกไปแล้ว นั่นก็คือ จากคลาส BankAccount เราสามารถสร้าง obj. บัญชีธนาคารใหม่ได้โดยใช้ keyword => “new” แบบนี้

ตาม syntax ของ code ด้านบน $account เป็นตัวแปรที่อ้างอิงถึง obj. ที่ถูกสร้างขึ้นโดย class BankAccount

ส่วน ( ) ที่ตามหลังชื่อ จะใส่หรือไม่ใส่ก็ได้นะ แบบนี้

ทำแบบนี้ก็ได้เช่นกัน

การสร้าง obj. ใหม่สามารถเรียกได้อีกอย่างนึงว่า instantiation

เอาล่ะ ไปกันต่อ เห็นไหมว่าตอนนี้ class BankAccount ของเรามันว่างเปล่าจนเกินไป นั่นก็เพราะว่า มันยังไม่มี 2 อย่างนี้ยังไงล่ะ นั่นก็คือ properties และ method

เริ่มจากการเพิ่ม properties (คุณสมบัติ) ให้กับ class ของเราก่อนดีกว่า ใน class BankAccount นี้ เราขอกำหนดให้มี properties 2 ตัวด้วยกัน คือ $accountNumber กับ $balance โดยที่ด้านหน้าของมันต้องมี access modifier กำกับอยู่ด้านหน้าด้วยนะ เพื่อเป็นตัวบอกความสามารถในการมองเห็นของ properties นั้นๆ

ในตัวอย่างนี้เราขอใช้ public จะได้เข้าถึง properties นี้จากภายนอก class ได้

และการเข้าถึง property ยังสามารถใช้ obj. operator (->) นี้ได้ด้วย เช่น ถ้าเราจะกำหนดค่าของ properties accountNumber และ balance เราสามารถทำตามโค้ดด้านล่างนี้ได้เลย

ต่อมาการเพิ่ม method ให้กับ class ถ้าสมมติว่าเราอยากให้ class ของเรามี method accountNumber() อยู่ใน class BankAccount เราก็สามารถทำได้ดังนี้

และแน่นอนว่า method ก็ต้องมี access modifier กำกับอยู่ด้านหน้าเช่นกัน

Q : ถ้าเราไม่ใส่ access modifier ไว้ด้านหน้าได้ไหม?

A : ได้จ้า มันจะเป็น default มาให้ ซึ่งก็คือ public นั่นเอง

Method ดูโล่งมากเลยตอนนี้ เรามาเพิ่ม argument ให้มันหน่อยดีกว่า

Q : ห๊ะ! argument คืออะไร?

A : อืมมม เอางี้..ลองดูโค้ดตัวอย่างกันก่อนเผื่อจะเข้าใจว่ามันคืออะไร

เห็นโค้ดแล้วพอรู้หรือยังว่า argument คืออะไร?

ตัว argument ก็คือ ตัวแปรที่ต้องการส่งค่าให้กับ function นั่นเอง โดยในตัวอย่างโค้ดนี้ method accountNumber ของเรารับ argument ชื่อ $amount มา ซึ่งเจ้าตัวนี้จะทำหน้าที่ตรวจสอบ $amount > 0 ก่อน แล้วค่อยเพิ่มยอดเงินให้กับ balance

Q : เอ๊ะ! แล้วไอ้ $this คืออะไร?

A : $this เอาไว้ใช้อ้างอิงถึง obj. ปัจจุบัน และสามารถใช้ได้เฉพาะภายใน method เท่านั้น

อ๋ออีกอย่าง ในการเรียกใช้ method เราสามาถใช้ obj. operator (->) นี้ก็ได้เหมือนกัน แบบนี้เลย

Q : แล้วถ้าเราอยากเปลี่ยนค่า properties ทำยังไงได้บ้าง?

A : ถ้าอยากจะเปลี่ยนค่า property สามารถทำได้ 2 วิธี วิธีแรก ลองดูโค้ดนี้ประกอบ

สมมติว่าเราอยากเปลี่ยน $name วิธีแรกที่เราทำได้คือ เปลี่ยนมันภายใน class เลย โดยเราจะเพิ่ม method set เข้าไป แบบโค้ดนี้

ที่เราเพิ่ม method set ก็เพื่อ set ค่าให้กับ $name และก็ใช้ $this เป็นตัวดึงข้อมูลจาก set หรือถ้าพูดแบบดูวิชาการๆหน่อย ก็คือ $this ใช้เป็นตัวอ้างอิงถึง property ของ obj. ปัจจุบัน อย่างโค้ดนี้ที่เราใช้ $this->name เพื่ออ้างถึง property name ปัจจุบัน ซึ่งก็คือ $apple ในตัวอย่างนี้

กับแบบที่ 2 เปลี่ยนนอก class โดยเราจะเปลี่ยนค่า property มันตรงๆ แบบนี้เลย

Q : มี keyword อื่นที่ควรรู้เอาไว้อีกไหม?

A : มี และ Keyword นี้มีชื่อว่า instanceof โดยหน้าที่ของมันคือการตรวจสอบว่า obj. นั้นๆเป็นของ class ที่มัน specific class หรือไม่


เปรียบเทียบกับภาษาอื่น

ต่อมาเราจะเปรียบเทียบ Class & Object กับภาษาอื่นๆ อย่าง C, Java, Python ทีละส่วนไปเลย (ถ้าอยากดูของ PHP ประกอบด้วย รบกวนเลื่อนขึ้นด้านบนนะคะ ขอบคุณค่ะ)

I. หลักการสร้าง Class & Object

Java

  • Class เป็น blueprint สำหรับสร้าง obj. รวมทั้งเป็นตัวกำหนด state และ behavior ด้วย

  • Object เป็น instance ของ class

Python

  • Class เป็น blueprint สำหรับสร้าง obj. รวมทั้งเป็นตัวกำหนด state และ behavior ด้วย

  • Object เป็น instance ของ class

ส่วนภาษา C นั้น อย่างที่เรารู้ๆกันอยู่ว่า นางไม่ได้รองรับ OOP โดยตรง แต่สามารถใช้ struct และ function เพื่อจำลองบาง features ได้ สั้นๆก็คือ เราไม่สามารถเอานางมาเปรียบเทียบได้โดยตรงกับ OOP ใน PHP, Java, Python

II. การกำหนดและการเข้าถึง Properties และ Methods

ไม่ว่าจะภาษา PHP, Java, Python ทั้งหมดนี้มีสิ่งที่เรียกว่า access modifier กันหมด ยกเว้น ภาษา C เจ้าเก่าเจ้าเดิมที่ไม่มีการเข้าถึง access control หรือ การกำหนด method ในโครงสร้างโดยตรง

Java

  • ใช้ Access Modifiers อย่าง public, private, protected

  • มีการใช้ this เพื่ออ้างอิงถึง obj. ปัจจุบัน

Python

  • ใช้ Access Modifiers ผ่านการตั้งชื่อ Attributes เช่น _protected, __private

  • มีการใช้ self เพื่ออ้างอิงถึง obj. ปัจจุบัน

III. การสร้าง Object (Instantiation)

PHP, Java มีการใช้ keyword ว่า "new"

Q : อ่าว แล้ว C กับ Python ล่ะ ไม่มีหรอ?

A : เจ้า Python จะเรียกใช้ class เพื่อสร้าง obj. โดยไม่ใช้ keyword ใดๆเลย

ส่วน C ด้วยความที่นางไม่ได้รองรับ OOP โดยตรง นางจึงใช้ struct และก็จัดการกับหน่วยความจำด้วยตัวนางเอง ซึ่งการจัดการหน่วยความจำของนางนั้น นางก็ทำโดยตรงผ่าน function อย่าง malloc() กับ free() จ้า

IV. keyword "instanceof"

ในภาษา PHP ไม่ได้มี instanceof อยู่ภาษาเดียวนะ เพราะ Java และ Python ก็มีจ้า

Java

มีการใช้เจ้าตัว instanceof ว่า obj. เป็น instance ของ class อะไร

Python

มีการใช้ function isinstance() เพื่อเช็คว่า obj. เป็น instance ของ class อะไร

Q : แล้วภาษา C ก็ไม่มีอีกตามเคยหรอ?

A : ถูกต้อง อย่างที่เคยบอกไปว่า C ไม่รองรับ OOP โดยตรงจึงไม่มีการตรวจสอบประเภทของ obj. เหมือน PHP, Java, Python แต่ๆๆ ถ้าอยากจะเขียน C จริงๆ ก็สาามารถใช้ type identifiers และ manual checks แค่ต้องจัดการด้วยตนเองและก็ไม่สะดวกเหมือนภาษาที่รองรับ OOP เท่านั้นเอง

Presentation

Video

อ้างอิงเว็บไซต์ทั้งหมดที่อ่าน + ดู

Last updated