php_class

[PHP Class and Object] The Basic

class

php class

การสร้าง class คือ ขึ้นด้วย class ตามด้วยชื่อ class แล้วก็ {} ข้างในจะมีพวก property และ method ก็เหมือนตัวแปรและ function สำหรับ class ตัวนี้ การตั้งชื่อสามารถขึ้นต้นด้วยตัวอักษรหรือ _ ( underscore )

<?php
class SimpleClass
{
    // property declaration
    public $var = 'a default value';

    // method declaration
    public function displayVar() {
        echo $this->var;
    }
}
?>

ตัวอย่างการประกาศสิ่งที่อยู่ข้างในก็คือ ตัวแปรที่เราใช้ภายใน class และก็ function สำหรับ class นั้นๆ ส่วนตัวแปร $this คือการเรียกอ้างอิงตัวมันเอง เช่น เราจะเข้าถึง $var ถ้า method ใดๆต้องการใช้ค่าหรือเปลี่ยนแปลงค่า ก็เรียก $this->var อย่างนี้ครับแต่จะมีการเรียกใช้อีกแบบเราเรียกว่า pseudo-variable เป็นการเรียกใช้ตรงๆได้เลย แต่เราต้องไปรู้จัก static keyword คำนี้ก่อนไว้อธิบายทีหลังอีกทีนะครับ

<?php
class A
{
    function foo()
    {
        if (isset($this)) {
            echo '$this is defined (';
            echo get_class($this);
            echo ")\n";
        } else {
            echo "\$this is not defined.\n";
        }
    }
}

class B
{
    function bar()
    {
        // Note: the next line will issue a warning if E_STRICT is enabled.
        A::foo();
    }
}

$a = new A();
$a->foo();

// Note: the next line will issue a warning if E_STRICT is enabled.
A::foo();
$b = new B();
$b->bar();

// Note: the next line will issue a warning if E_STRICT is enabled.
B::bar();
?>

การเรียก [class_name]::[method_name] เช่น A::foo() แบบนี้แหละถ้าหากเราไม่ประกาศ method เป็น static เราจะเจอคำเตือนไม่ก็ error ซึ่งตอนนี้เรายังไม่รู้จักเจ้า static ก็ไม่เป็นไร แค่รู้ไว้ว่ามันทำอย่างนี้ได้แต่ไม่แนะนำ

new

คำว่า new ใช้ในการ instance จาก class ที่เราต้องการใช้ คือ เวลาเราสร้าง class ไว้เนี้ยมันเหมือนตัว concept ที่ยังไม่ถูกเอาไปใช้งาน จนกว่าเราจะใช้คำว่า new ในการเรียกใช้ class นั้นๆ ตัวอย่างเช่น เรามี class human ดังนี้

<?php

class Human 
{

  private gender;
  private height;

  public function walk() {
    

  }
}

เรายังไม่ได้ใช้งานเจ้า class Human นะครับแค่เป็นเหมือน concept ที่เราคิดไว้ ถ้าจะนำมาใช้ต้องเป็นแบบนี้

$john = new Human();

$john->walk();

$john ก็จะปั้มเป็น human หนึ่งคนออกมา สังเกตุว่าเราจะใช้พวก class ในการคิด concept เพื่อให้รู้ว่าเจ้า class ทำอะไร หรือใช้งานในหลายๆกรณีที่เป็นเรื่องเดิมๆได้ กลับมาเรื่อง new เราสามารถประกาศได้หลายแบบดังนี้

<?php
$instance = new SimpleClass();

// This can also be done with a variable:
$className = 'SimpleClass';
$instance = new $className(); // new SimpleClass()
?>

เราสามารถประกาศ new self หรือ new parent ได้เหมือนกัน แต่ผมก็ไม่เคยเห็นนะ

อีกนิดสำหรับเรื่องการปั้ม ( ขอใช้คำนี้แล้วกันเหมือน class คือ แม่พิมพ์คุ๊กกี้อ่ะครับ คือเรายังไม่เทแป้ง แต่ถ้าหากเรา new คือการเทแป้งในแม่พิมพ์ที่เราคิดไว้ออกมาเป็นชิ้นๆ ) เราสามารถทำแบบ reference ได้ด้วย

<?php

$instance = new SimpleClass();

$assigned   =  $instance;
$reference  =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

สังเกตุตัวแปร $reference เราใช้ =& นั่นแหละว่ามันไม่ได้ทำการ copy ออกมาแต่เป็นการอ้างอิงถึงตัว object ที่ให้ค่ามา ถ้าหากตัวแปร $instance มีการเปลี่ยนแปลงค่าใดๆ ตัวแปร $reference จะถูกเปลี่ยนตามด้วย ส่วน $assigned เหมือนการปั้มออกมาแล้วไม่เกี่ยวข้องกับตัว class parent ของมันมาดูคำตอบของตัวอย่างข้างบนกัน

NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned will have this value"
}

ใน PHP 5.3  ขึ้นไปมีการประกาศได้หลายแบบดังนี้

<?php
class Test
{
    static public function getNew()
    {
        return new static;
    }
}

class Child extends Test
{}

$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);

$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);

$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>

คำตอบจะได้แบบนี้

bool(true)
bool(true)
bool(true)

Properties and methods

การประกาศ property และ method สามารถใช้ชื่อเหมือนกันได้ เราสามารถแยกการใช้ด้วยบริบท ( context ) ฟังดู geek งง เอาง่ายๆคือเราแยกมันด้วยการใส่ () หรือไม่ใส่พอ ตัวอย่าง

class Foo
{
    public $bar = 'property';
    
    public function bar() {
        return 'method';
    }
}

$obj = new Foo();
echo $obj->bar, PHP_EOL, $obj->bar(), PHP_EOL;

เสริมเรื่อง context นิดนึงแต่ก่อนผมไม่เข้าใจมันมีความหมายว่าอะไรยังไง จะเขียนบอกคนอื่นเพื่อมีคนไม่เข้าใจเหมือนผม เจ้า context คือ บริบทหรือการที่เราทำสิ่งหนึ่งเกี่ยวข้องกับเรื่องหนึ่งและคำหรือความหมายของคำจะเปลี่ยนตามไปเช่น

สมมติคำว่า ซ่อม, ส้อม ( เสียงมันเหมือนกันแต่บริบทต่างกัน )

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

เราสามารถประกาศ anonymous function หรือ function ที่ไม่มีชื่อ ได้ตัวอย่าง

class Foo
{
    public $bar;
    
    public function __construct() {
        $this->bar = function() {
            return 42;
        };
    }
}

$obj = new Foo();
$func = $obj->bar;
echo $func(), PHP_EOL;

result 
42

extends

การสืบทอด class เราจะใช้คำว่า extends โดยจะไม่สามารถสืบทอดหลายๆตัวพร้อมกันได้ โดยเราสามารถประกาศ override property , method ได้ แต่ถ้าตัว class parent ( class ที่สืบทอดมา ) มีการประกาศว่า final method นั้นๆจะไม่สามารถเปลี่ยนแปลงได้หรือไม่สามารถ override ได้ และเราสามารถเข้าถึงพวก method ของ parent class ด้วยการเรียกว่า parent:: ตามด้วยชื่อ property , method นั้นๆ

<?php
class ExtendClass extends SimpleClass
{
    // Redefine the parent method
    function displayVar()
    {
        echo "Extending class\n";
        parent::displayVar();
    }
}

$extended = new ExtendClass();
$extended->displayVar();
?>

result

Extending class
a default value

สรุป

เราเรียนรู้วิธีสร้าง class ไปเพื่ออะไร ? เพื่อลดการทำงานของ code ลงไม่ให้ซับซ้อน แต่กระนั้นคนเขียนโปรแกรมมักจะใช้ๆไปโดยไม่ได้สนใจเท่าไร เหมือนผม โดยในบทนี้ยังไม่ได้ยกตัวอย่างของการเรียนรู้เท่าไร แต่ติดตามได้จะค่อยๆสรุปมาเรื่อยๆนะครับ

อยากฝึก PHP ต่อไปดูได้ที่นี่ครับ

https://oxygenyoyo.com/general/php-ep-one-foundamental-web/

https://www.w3schools.com/php/php_oop_classes_objects.asp

Loading

เป็นโปรแกรมเมอร์ที่ตามหาคุณค่าของชีวิตและความฝันในวัยเด็ก ชอบเล่นเกม เรียนรู้ทุกอย่าง ชอบเจอคนใหม่ๆ งานสังคมทุกชนิด ออกกำลังกายในวันว่าง อ่านหนังสือ มีเว็บรีวิวหนังสือด้วย www.readraide.in.th