Object Oriented PHP Step 18-22

Object Oriented PHP Step 18-22

Step 18 :

การสืบทอด - การนำกลับมาใช้ใหม่ ใน แบบของ OOP

การสืบทอดเป็นเรื่องพื้นฐานของ capability/construct ใน OOP โดยคุณสามารถใช้ class หนึ่งไปเป็นพื้นฐานของ class อื่นๆได้

ทำไมต้องใช้?

เพราะว่าทำให้เกิดการนำมาใช้ซ้ำของโค้ดพื้นฐาน หรืออีกนัยก็คือลดการเขียนสิ่งซ้ำๆนั่นแหล่ะ

ลองนึกว่า ถ้าคุณต้องการเขียน class 'employee' ดังนั้น เราก็จะกล่าวได้ว่า 'employee' ก็คือรูปแบบ หรือชนิดเดียวกับ 'person' เพราะว่ามีค่าพื้นฐานที่เหมือนกัน (จากตัวอย่าง ก็คือชื่อคนนั่นเอง ที่มีเหมือนกันระหว่าง 'person' กับ 'employee')

ดังนั้น ผลพลอยได้ก็คือ ทำให้โค้ดมีจำนวนที่น้อยลง เพราะว่าเรามีการใช้โค้ดชุดเดิมซ้ำอีกครั้ง ในสอง class (หรือมากกว่า) ซึ่งนี่คือสิ่งที่แตกต่างจาก PHP แบบเก่าๆที่เขียนกันมา

1.คุณได้เขียนโค้ดที่จำเป็นต้องใช้เพียงรอบเดียวเท่านั้น

2.โค้ดสามารถนำกลับมาใช้ใหม่ได้ ไม่จำกัดจำนวน class โดยที่ยังมีต้นฉบับเพียงแค่จุดเดียวเท่านั้น โดยอาจจะมองได้ว่ามันก็คล้ายกับการใช้ PHP include() เลย


ลองดูโค้ดบางส่วนนี้

// 'extends' คือ key ที่บอกว่ายอมให้มีการสืบทอดออกมาได้ class employee extends person {  function __construct($employee_name) {  $this->set_name($employee_name);  } }


Step 19:

เอาโค้ดมาใช้ซ้ำโดยการสืบทอด ตอน 2

เพราะว่า class 'employee' นั้นใช้พื้นฐานของ class 'person' ได้ ดังนั้น 'employee' ก็จะมีค่า public , protected properties และ method ของ 'person' ด้วย

**เราจะเรียก 'employee' ว่า *type* of person

โค้ดดังนี้

class employee extends person {  function __construct($employee_name){  $this->set_name($employee_name);  } }


ดังนั้นแล้ว เราก็จะสามารถใช้ set_name() ใน 'employee' ได้ แม้ว่าเรายังไม่ประกาศ method นี้ใน 'employee' class ก็ตาม เป็นเพราะว่าเราได้สร้าง set_name() เอาไว้ใน class 'person' แล้ว

** 'person' class เรียกว่า 'base' class หรือ 'parent' class ของ 'employee' class

การสืบทอดนี้ ถือว่ามีส่วนสำคัญในการทำให้งานเราลดความซับซ้อนน้อยลง


Step 20:

การนำโค้ดกลับมาใช้ใหม่ โดยใช้การสืบทอด ตอน 3

ลองพิจารณาโค้ดที่ด้านล่าง เราสามารถใช้ get_name ใน 'employee' object ได้ เหมือนกับ 'person'

<title>OOP in PHP</title>  <?php include("class_lib.php"); ?>  </head>  <body>  <?php   // ใช้ PHP Object ใน php page  $stefan = new person("Stefan Mischook");  echo "Stefan's full name: " . $stefan->get_name();    $james = new employee("Johnny Fingers");  echo "---> " . $james->get_name();  ?>  </body> </html>

นี่คือตัวอย่างที่ classic เพื่อแสดงว่า OOP สามารถนำลดการเขียนโค้ดลงได้อย่างไร (ไม่ต้องเขียน method สองรอบ) และเราก็ยังสามารถแบ่งโค้ดออกมาเป็น module ได้ เพื่อให้ง่ายต่ออการดูแลปรับปรุงแก้ไขอีกด้วย


step 21:

Overriding method

ในบางครั้ง (โดยเฉพาะเมื่อเราใช้การสืบทอด) เราจำเป็นที่จะต้องเปลี่ยนการทำงานบางส่วนของ method จาก class พื้นฐานไป

ตัวอย่าง เราให้ set_name() method ใน 'employee' class ทำงานบางอย่าง ที่แตกต่างจากที่ทำใน 'person' class

เรา override set_name() ของ 'person'class ได้โดยการประกาศ method เดียวกันกับ 'employee'


โค้ด บางส่วน

<?php  class person {  protected function set_name($new_name) {  if (name != "Jimmy Two Guns") {  $this->name = strtoupper($new_name);  }  }  } 


 class employee extends person {  protected function set_name($new_name) {  if ($new_name == "Stefan Sucks") {  $this->name = $new_name;  }  }  } ?>

จะเห็นได้ว่า set_name() ที่อยู่ใน 'employee' class นั้นต่างจาก parent class 'person'


Step 22:

Overriding method ตอน 2

บางครั้งเราจะเป็นต้องเข้าถึงข้อมูลใน base class ที่เราได้ override ไปแล้ว  

ในตัวอย่างนี้ เรา overrode set_name() method ใน employee class ดังนั้น เราจะใช้งาน


person::set_name($new_name);


เพื่อเรียกใช้งาน parent class (person) ที่ยังไม่ถูก override


<?php   class person {  // explicitly adding class properties are optional - but is good practice  var $name;    function __construct($persons_name) {  $this->name = $persons_name;   }      public function get_name() {    return $this->name;   }      //protected methods and properties restrict access to those elements.   protected function set_name($new_name) {     if (name !=  "Jimmy Two Guns") {      $this->name = strtoupper($new_name);     }   }  }   // 'extends' is the keyword that enables inheritance  class employee extends person {  protected function set_name($new_name) {  if ($new_name ==  "Stefan Sucks") {  $this->name = $new_name;  }        else if ($new_name ==  "Johnny Fingers") {  person::set_name($new_name);  }    }     function __construct($employee_name) {  $this->set_name($employee_name);  } } ?>


เราใช้ สัญลักษณ์ :: เพื่อกำหนดชื่อ class ที่ต้องการให้ PHP หา method ดังกล่าว

'person::set_name()'

เป็นการบอก PHP ว่าให้หา set_name() ใน 'person' class

หรือใช้จุดเชื่อม ถ้าคุณต้องการจะอ้างถึง class ที่เป็น parent ของ class ที่กำลังใช้งานอยู่ โดยใช้ 'parent' keyword

protected function set_name($new_name) {   if ($new_name ==  "Stefan Sucks") {  $this->name = $new_name;    }       else if ($new_name ==  "Johnny Fingers") {  parent::set_name($new_name);   }   }


ทั้งหมดที่กล่าวมานี้ เป็นเพียงพื้นฐายของ OO PHP เท่านั้น และยังมีข้อมูลอีกมากที่จะต้องศึกษาเพิ่มเติม เพื่อให้สามารถทำงานจริงได้

และต้องระลึกอย่างหนึ่งว่าการเรียนรู้ที่ดีและเร็วที่สุดก็คือการทดลองเขียนโค้ด

แนะนำว่าให้ลองสร้างสัก 10 object ง่ายๆขึ้นมา เพื่อลองเอามาใช้ใน PHP page และจะรู้ว่ามันจะง่ายขึ้นเรื่อยๆ

บทความทั้งหมดนี้ แปล และเรียบเรียงมาจาก  http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-4.php
This article translate and remade from http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-4.php

Create: Modify : 2010-07-14 10:40:55 Read : 8041 URL :