บทช่วยสอนPHP

PHP HOME แนะนำ PHP การติดตั้ง PHP PHP ไวยากรณ์ ความคิดเห็น PHP ตัวแปร PHP PHP Echo / พิมพ์ ประเภทข้อมูล PHP PHP Strings หมายเลข PHP PHP คณิตศาสตร์ ค่าคงที่ PHP ตัวดำเนินการ PHP PHP If...Else...Elseif PHP Switch PHP Loops ฟังก์ชัน PHP PHP Arrays PHP Superglobals PHP RegEx

แบบฟอร์มPHP

การจัดการแบบฟอร์ม PHP การตรวจสอบแบบฟอร์ม PHP ต้องใช้แบบฟอร์ม PHP URL แบบฟอร์ม PHP/อีเมล แบบฟอร์ม PHP เสร็จสมบูรณ์

PHPขั้นสูง

วันที่และเวลา PHP รวม PHP การจัดการไฟล์ PHP ไฟล์ PHP เปิด/อ่าน สร้าง/เขียนไฟล์ PHP อัพโหลดไฟล์ PHP คุกกี้ PHP PHP Sessions ตัวกรอง PHP ตัวกรอง PHP ขั้นสูง ฟังก์ชันเรียกกลับของ PHP PHP JSON ข้อยกเว้น PHP

PHP OOP

PHP OOP คืออะไร คลาส PHP/วัตถุ ตัวสร้าง PHP PHP Destructor PHP Access Modifiers PHP Inheritance ค่าคงที่ PHP PHP Abstract Classes อินเทอร์เฟซ PHP PHP ลักษณะ PHP Static Methods PHP คุณสมบัติคงที่ PHP เนมสเปซ PHP Iterables

ฐานข้อมูลMySQL

ฐานข้อมูล MySQL MySQL Connect MySQL สร้าง DB MySQL สร้างตาราง MySQL แทรกข้อมูล MySQL รับ ID ล่าสุด MySQL แทรกหลายรายการ MySQL ที่เตรียมไว้ MySQL Select Data MySQL Where MySQL สั่งซื้อโดย MySQL ลบข้อมูล ข้อมูลอัพเดต MySQL MySQL Limit Data

PHP XML

PHP XML Parsers PHP SimpleXML Parser PHP SimpleXML - รับ PHP XML Expat PHP XML DOM

PHP - AJAX

บทนำ AJAX AJAX PHP ฐานข้อมูล AJAX AJAX XML AJAX ค้นหาสด AJAX โพล

ตัวอย่างPHP

ตัวอย่าง PHP PHP คอมไพเลอร์ แบบทดสอบ PHP แบบฝึกหัด PHP ใบรับรอง PHP

ข้อมูลอ้างอิงPHP

ภาพรวม PHP PHP Array ปฏิทิน PHP PHP วันที่ ไดเรกทอรี PHP ข้อผิดพลาด PHP ข้อยกเว้น PHP ระบบไฟล์ PHP ตัวกรอง PHP PHP FTP PHP JSON คีย์เวิร์ด PHP PHP Libxml PHP Mail PHP คณิตศาสตร์ PHP เบ็ดเตล็ด PHP MySQLi เครือข่าย PHP การควบคุมเอาต์พุต PHP PHP RegEx PHP SimpleXML PHP Stream PHP String การจัดการตัวแปร PHP PHP XML Parser PHP Zip เขตเวลา PHP

PHP OOP - คลาสนามธรรม


PHP - คลาสนามธรรมและวิธีการคืออะไร?

คลาสนามธรรมและวิธีการคือเมื่อคลาสพาเรนต์มีเมธอดที่มีชื่อ แต่ต้องการคลาสลูกเพื่อกรอกงาน

คลาสนามธรรมคือคลาสที่มีเมธอดนามธรรมอย่างน้อยหนึ่งวิธี วิธีนามธรรมคือวิธีการที่มีการประกาศ แต่ไม่ได้นำไปใช้ในโค้ด

คลาสนามธรรมหรือเมธอดถูกกำหนดด้วยabstract คีย์เวิร์ด:

ไวยากรณ์

<?php
abstract class ParentClass {
  abstract public function someMethod1();
  abstract public function someMethod2($name, $color);
  abstract public function someMethod3() : string;
}
?>

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

ดังนั้น เมื่อคลาสลูกสืบทอดมาจากคลาสนามธรรม เรามีกฎดังต่อไปนี้:

  • ต้องกำหนดวิธีการคลาสลูกด้วยชื่อเดียวกันและจะประกาศวิธีการนามธรรมหลัก
  • ต้องกำหนดวิธีการคลาสลูกด้วยตัวแก้ไขการเข้าถึงที่ จำกัด เดียวกันหรือน้อยกว่า
  • จำนวนอาร์กิวเมนต์ที่ต้องการต้องเท่ากัน อย่างไรก็ตาม คลาสลูกอาจมีอาร์กิวเมนต์เสริมเพิ่มเติม

ลองดูตัวอย่าง:

ตัวอย่าง

<?php
// Parent class
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string;
}

// Child classes
class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!";
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "Proud to be Swedish! I'm a $this->name!";
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "French extravagance! I'm a $this->name!";
  }
}

// Create objects from the child classes
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>

ตัวอย่างที่อธิบาย

คลาส Audi, Volvo และ Citroen สืบทอดมาจากคลาสรถยนต์ ซึ่งหมายความว่าคลาส Audi, Volvo และ Citroen สามารถใช้คุณสมบัติ $name สาธารณะรวมถึงเมธอด __construct() สาธารณะจากคลาส Car เนื่องจากการสืบทอด

แต่ intro() เป็นวิธีนามธรรมที่ควรกำหนดในคลาสย่อยทั้งหมดและควรส่งคืนสตริง



PHP - ตัวอย่างคลาสนามธรรมเพิ่มเติม

ลองดูตัวอย่างอื่นที่วิธีนามธรรมมีข้อโต้แย้ง:

ตัวอย่าง

<?php
abstract class ParentClass {
  // Abstract method with an argument
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  public function prefixName($name) {
    if ($name == "John Doe") {
      $prefix = "Mr.";
    } elseif ($name == "Jane Doe") {
      $prefix = "Mrs.";
    } else {
      $prefix = "";
    }
    return "{$prefix} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>

ลองดูตัวอย่างอื่นที่เมธอด abstract มีอาร์กิวเมนต์ และคลาสย่อยมีอาร์กิวเมนต์ทางเลือกสองอาร์กิวเมนต์ที่ไม่ได้กำหนดไว้ในเมธอด abstract ของพาเรนต์:

ตัวอย่าง

<?php
abstract class ParentClass {
  // Abstract method with an argument
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
  // The child class may define optional arguments that are not in the parent's abstract method
  public function prefixName($name, $separator = ".", $greet = "Dear") {
    if ($name == "John Doe") {
      $prefix = "Mr";
    } elseif ($name == "Jane Doe") {
      $prefix = "Mrs";
    } else {
      $prefix = "";
    }
    return "{$greet} {$prefix}{$separator} {$name}";
  }
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>