วันอาทิตย์ที่ 7 พฤศจิกายน พ.ศ. 2553

PHP OOP tutorial

object หรือ instance ของ class


$q1 และ $q2 เป็น object ของ class Quote
ซึ่ง class ก็เป็นเหมือนนามธรรม อย่างเช่น รถยนต์ซึ่งมีคุณสมบัติต่างๆ
ส่วน object ก็เหมือนรูปธรรมอย่างเช่น รถยนต์คันหนึ่งซึ่งมีคุณสมบัติรถยนต์
จะเห็นว่า object $q1 และ $q2 จะมีตัวแปร s เป็นคุณสมบัติเฉพาะตัว
เราอาจจะเปรียบเทียบ s เป็นลายของรถยนต์
ซึ่งเสมือนกับว่า $q1 เป็นรถยนต์คันหนึ่งมีลาย hello
ซึ่งเสมือนกับว่า $q2 เป็นรถยนต์คันหนึ่งมีลาย doraemon
และมี squote เป็นการทำงานของ class อาจจะเทียบเป็นการแสดงลายของรถยนต์
แม้ว่ามีการทำงานเหมือนกัน แต่การแสดงลายจะแสดงต่างกัน เพราะรถยนต์แต่ละคันมีลายต่างกันนั่นเอง


<?php

class Quote{
   protected $s = '';
   function __construct($s){
        $this->s = $s;
   }
   function squote(){
        return "'".$this->s."'";
   }
}
$q1 = new Quote('hello');
$q2 = new Quote('doraemon');
echo $q1->squote();
echo ', ';
echo $q2->squote();

?>


จะใช้ private protected หรือ public


โดยปกติไม่ควรตั้งสมาชิกตัวแปรให้เป็น public เพราะจะทำให้สามารถทำให้ object อื่นๆ สามารถเข้ามาแก้ไขเปลี่ยนแปลงสมาชิกตัวแปรของ object ได้โดยตรง
อย่างไรก็ตามถ้าสมาชิกตัวแปรเป็นตัวแปรที่ใช้เป็น configuration หรือการกำหนด setting การทำงานของ object ให้กำหนดเป็น public เพื่อความสะดวก
ทำให้ object ต่างๆ สามารถเข้ามาแก้ไข configuration ได้ทันที ไม่จำเป็นที่เราจะต้องสร้าง function เพื่อ set ค่าจำนวนมาก


<?php
class Car{
  protected $color = 'red';
  private $wheal = 4;
  public $tag = 'great car';
}

class Bmw extends Car{
  protected $color = 'blue';
  public $tag = 'bmw car';
}
?>

อย่างไรก็ตามการกำหนดค่าผ่านตัวแปร public จะมีข้อเสียก็คือการกำหนดชื่อตัวแปรผิดได้ เพราะ php จะไม่มีการแจ้งเตือนเมื่อมีการกำหนดค่าตัวแปรใหม่ซึ่งไม่มีใน class
เราสามารถทำให้เกิดการ warning เมื่อกำหนดค่าตัวแปรที่ไม่มีใน class ได้ โดยใช้  member overloading


<?php
class Car{
  protected $color = 'red';
  private $wheal = 4;
  public $tag = 'great car';
public function __set($name, $val){
echo "<br/>Error: Setting undefined member $name to $val";
}
}

$c = new Car();
$c->taggg = 'normal car';
?>


member accessibility ที่แนะนำให้ใช้เป็นประจำได้แก่ protected เพื่อช่วยให้ class ที่สืบทอด class ที่เราสร้างขึ้นสามารถใช้ตัวแปรได้เช่นกัน
อย่างไรก็ตามในบางครั้งอาจจะมีตัวแปรพิเศษซึ่งเราใช้เป็นตัวแปรชั่วคราวสำหรับเทคนิคการโปรแกรมบางอย่าง
ซึ่งไม่ต้องการให้ class ที่สืบทอด class นี้รู้จักตัวแปรหรือนำตัวแปรไปใช้ เราจะตั้งตัวแปรนี้เป็น private

ตัวแปรที่เป็น protected และ private ก็สามารถถูกเปลี่ยนแปลงค่าจากภายนอกได้เช่นกันโดยผ่านทาง method ที่เป็น public
ข้อดีของการใช้ public method ในการเข้าถึงตัวแปร private หรือ protected ก็คือสามารถกรองข้อมูลที่จะถูกกำหนดค่าของสมาชิกตัวแปร
ในตัวอย่างข้างนี้เราใช้ function __set (member overloading function) และ setColor (public function)
เพื่อทำการกรองข้อมูลที่ถูกกำหนดค่าเข้ามาให้เป็นตัวอักษรตัวเล็กเสมอ


<?php
class Car{
protected $color = 'red';
private $wheal = 4;
public $tag = 'great car';
public function __set($name, $val){
if ($name == 'color'){
$this->color = strtolower($val);
}
}
public function setColor($c){
$this->color = strtolower($c);
}
public function getColor(){
return $this->color;
}
}
$c = new Car();
$c->color = 'GREEN';
echo ',',$c->getColor();
$c->setColor('BLUE');
echo ',',$c->getColor();

?>

ไม่มีความคิดเห็น:

แสดงความคิดเห็น