ข้ามไปที่เนื้อหาหลัก

ฝึกเขียน PHP OOP ด้วยการนับอายุตามปฏิทิน และคำนวณวันที่เกษียณอายุราชการแบบง่ายๆ


ฝึกเขียน PHP OOP คำนวณอายุ


ซอร์สโค๊ดในบทความนี้จะแบ่งเป็น 2 ไฟล์นะครับ
โดยจะแยกไฟล์ที่เก็บคลาสออกจาก ส่วนที่ใช้แสดงผล ดังนี้


สร้างไฟล์สำหรับเก็บคลาสชื่อ birthday_process.php


<?php

Class BirthdayProcess{

    private $birthday;
   
    public $age_year;
    public $age_month;
   
    /**
     * @param $date Array ส่งข้อมูลชุดที่ต้องการคำนวณมาในคลาส
     */
    public function __construct($date)
    {
        $this->birthday = $date;    //yyyy-mm-dd
    }
   
    /**
     * หาค่าอายุจากวันเกิด  โดยจะใช้หลักการนับตามปฏิทิน
     * @return Object จะได้ค่า age_year, age_month, age_day
     */
    public function process_age()
    {
        $dte = explode('-', $this->birthday);    //yyyy-mm-dd
        $time = strtotime($this->birthday);
       
        //จำนวนเดือน
        $mon = ($dte[1] >= date('m') ? 12 - ($dte[1] - date('m')) : date('m') - $dte[1]);
       
        //หาจำนวนปี และคำนวณเดือนใหม่ กรณีที่ยังไม่เต็มเดือน
        if(date("md") < "$dte[1]$dte[2]"){        //ยังไม่ถึงวันเกิด
            $age = ((date("Y") - $dte[0]) - 1);    //ต้อง ลดปีลงหนึ่ง
            if(date("d") < "$dte[2]") $mon--;    //ถ้า วันที่ปัจจุบัน น้อยกว่าวันที่เกิด  แสดงว่ายังไม่เต็มเดือน ให้ลดตัวเลขเดือน ลงหนึ่ง
        }else{// เดือนวัน เลยเดือนวันเกิด
            $age = (date("Y") - $dte[0]);        //ไม่ต้องลดปี เพราะถึงวันเกิดแล้ว
            if($mon >= 12) $mon = 0;            //ถ้าเกิน 12 เดือน ให้กำหนดเป็น 0
            if(date("d") < "$dte[2]") $mon--;    //ถ้าวันที่ปัจจุบัน น้อยกว่าวันที่เกิด  แสดงว่ายังไม่เต็มเดือน ให้ลดตัวเลขเดือน ลงหนึ่ง
        }
       
        //หาจำนวนวัน
        if(date("d") < "$dte[2]"){                //ถ้าวันปัจจุบัน น้อยกว่าวันเกิด (คือข้ามเดือนใหม่)
            $last_day = date('t', strtotime("-1 month"));    //หาตัวเลขวันที่ล่าสุดในปฏิทินของเดือนที่ผ่านมา
            if($last_day > $dte[2]){                        //ถ้าวันสุดท้ายของเดือน มากกว่าวันเกิด
                $day = ($last_day - $dte[2]) + date('j');    //เอาค่าวันที่ที่เหลือ ของเดือนก่อนหน้า มารวมกับวันที่ในเดือนปัจจุบัน
            }else{                                            //ถ้าไม่มากกว่า ก็แสดงว่าวันเกิดอยู่วันสดท้าย หรือเดือนนั้นวันที่น้อยกว่าวันเกิด
                $day = date('j');                            //ก็นับวันปัจจุบันไปเลย ไม่ต้องบวกเพิ่ม
            }
        }else{                                    //วันที่ เลยวันเกิดไปแล้ว แสดงว่าอยู่ช่วงสิ้นเดือน
            $day = date('d') - $dte[2];            //ให้เอาวันที่ - วันเกิดไปเลย จะได้ส่วนต่างเป็นจำนวนวัน
        }
        $this->age_year    = $age;
        $this->age_month = $mon;
        $this->age_day    = $day;
    }
   
    /**
     * หาปีที่เกษียณอายุ โดยกำหนดให้เป็นสิ้นเดือนกันยายนของปีนั้นๆ
     * @return String คืนค่าวันที่เกษียณอายุ
     */
    public function get_retire()
    {
        $age = _RETIRE_YEAR;    //รับค่าอายุที่จะเกษียณ
        if(substr($this->birthday, 5, 2) >= 10) $age += 1;// ถ้าเลยปีงบประมาณแล้ว ให้ไปอยู่ในปีข้างหน้า   
        $date_retire = (substr($this->birthday, 0, 4) + $age) . "-09-30";    //สิ้นปีงบประมาณ หน่วยงานราชการ
        return $date_retire;
    }
   
    /**
     * ตรวจสอบอายุว่ามากกว่าเกณฑ์ที่กำหนดแล้วหรือยัง
     * @return Boolean คืนค่าเป็นจริงเมื่ออายุผ่านเกณฑ์
     */
    public function validate_age($age = 18)
    {
        $time_allow = strtotime("+$age years", strtotime($this->birthday));
        return (time() > $time_allow);//ถ้าวันปัจจุบัน มากกว่าวันที่ครับเกณฑ์ จะคือค่าเป็น จริง
    }
   
    /**
     * เปลี่ยนรูปแบบวันที่ให้มีเครื่องหมาย / และเป็นปี พ.ศ.
     */
    public function set_thai_date($string)
    {
        $arr = explode("-", $string);
        return $arr[2].'/'.$arr[1].'/'.($arr[0]+543);
    }
   
}
/* END OF Class BirthdayProcess */
?>


สำหรับส่วนที่สองจะใช้สำหรับแสดงผล โดยจะเรียกคลาสจะไฟล์ birthday_process.php มาใช้งานอีกที โค๊ดดังนี้


<?php
/* ---- โหลดคลาสที่ต้องการใช้งาน ---- */
include 'classes/birthday_process.php';


/* ---- เตรียมข้อมูลสำหรับเรียกใช้ ---- */
define('_RETIRE_YEAR', 60);    //อายุที่เกษียณ
$valid_age = 18;            //ตรวจสอบอายุ
       
/* ---- ประมวลผลข้อมูล ตามวันที่ที่ส่งเข้ามา ---- */   
$date = isset($_GET['date']) ? $_GET['date'] : date('Y-m-d');//วันที่ ที่ต้องการดูข้อมูล

$obj = new BirthdayProcess($date);
$obj->process_age();

$retire_date = $obj->set_thai_date($obj->get_retire());

$age_validate_msg = "";
if($obj->validate_age($valid_age) == false){
    $age_validate_msg = "<font color='red'>อายุยังไม่ครบ $valid_age ปี</font>";
}else{
    $age_validate_msg = "อายุครบ $valid_age ปีบริบูรณ์";
}
?>

<!DOCTYPE html>
<html>
  <head>
    <title>การเขียนโปรแกรม PHP ประมวลผลข้อมูลต่างๆ จากวันเดือนปีเกิด</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style>
        .year{ color : blue;}
        .month{ color : orange;}
        .day{ color : red;}
        .data{ color : blue;}
        table{
            border-collapse: collapse;
        }
        td{ border: 1px solid #cccccc; }
    </style>
  </head>
  <body>
    <div style="padding : 10px">
    เลือกวันที่ =>
    | <a href="<?php echo $_SERVER['PHP_SELF'];?>?date=1985-08-28">1985-08-28</a>
    | <a href="<?php echo $_SERVER['PHP_SELF'];?>?date=1985-10-12">1985-10-12</a>
    | <a href="<?php echo $_SERVER['PHP_SELF'];?>?date=1986-02-09">1986-02-09</a>
    | <a href="<?php echo $_SERVER['PHP_SELF'];?>?date=1998-06-07">1998-06-07</a> |
    </div>
    <div style="clear:both"/>
    <div id="content" style="border: 2px solid #cccccc; float: left; padding : 20px">
        <h1>การเขียนโปรแกรม PHP <br/>ประมวลผลข้อมูลต่างๆ จากวันเดือนปีเกิด
        <br/><font color="blue"><?php echo $date;?></font></h1>
        <table width="500">
        <tr>
            <td>อายุ </td>
            <td>
                <span class="year"><?php echo $obj->age_year;?></span> ปี
                <span class="month"><?php echo $obj->age_month;?></span> เดือน
                <span class="day"><?php echo $obj->age_day;?></span> วัน
            </td>
        </tr>
        <tr>
            <td>วันที่เกษียณอายุ </td>
            <td><span class="data"><?php echo $retire_date;?></span>  </td>
        </tr>
        <tr>
            <td>ตรวจสอบอายุ </td>
            <td><span class="data"><?php echo $age_validate_msg;?></span>  </td>
        </tr>
        </table>
    </div>
    <br/>
  </body>
</html>


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




"PHP ไม่ได้สร้างสุดยอดโปรแกรม
แต่ PHP ช่วยให้งานคุณง่ายขึ้นต่างหาก"

PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม

สนใจสั่งซื้อเพียง 3,990 บาท



PHP CI MANIA PHP Code Generator 

โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
ราคาสุดคุ้มเพียง 3,990 บาท 
http://www.phpcodemania.com

ความคิดเห็น

  1. เปลี่ยนฟอนต์เถอะครับ ตาลายเลยบทความเนื้อหามีเยอะเเละน่าสนใจดี เเต่อ่านยากมากเเละมั่วกับฟอนต์ทีครุขระไปมาเล็กใหญ่ เอียงมังตรงมังสลับเปนรายตัวเเบบนี้อ่านนานๆอ้วกได้เลยครับ

    ตอบลบ
    คำตอบ
    1. ขอบคุณสำหรับข้อเสนอแนะครับ

      ลบ

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

โพสต์ยอดนิยมจากบล็อกนี้

แจกฟรี!! ระบบต่างๆที่พัฒนาด้วย PHP สำหรับนำไปใช้ในงานต่างๆ

       สำหรับหลายท่านที่ขอโค้ดเข้ามาทาง Inbox ของเฟซบุ๊กแฟนเพจ หรือถามถึงระบบต่างๆหลังไมค์มานั้น ส่วนใหญ่ก็มีแจกอยู่แล้วในเว็บบอร์ด ThaiCreate.Com นะครับ และด้านล่างนี้ก็เป็นระบบต่างๆที่แจกให้นำไปลองใช้ลองศึกษากันครับ

สร้างแบบฟอร์มล็อกอิน HTML + PHP

       ผมจะสร้างระบบตัวอย่างเพื่อแสดงให้เห็นการทำงานของสคริปต์ PHP ที่ใช้ในการล็อกอินอย่างง่ายๆ นะครับ โดยที่ผมจะสร้างโฟลเดอร์ใหม่ขึ้นในไดร์ฟที่เราได้กำหนดให้เป็น Directory Root สำหรับรันสคริปต์ PHP ซึ่งผมกำหนดเอาไว้ที่ D:\www ดังนั้นผมจะสร้างโฟลเดอร์ teacher_assistant ขึ้นมาใหม่จะได้พาธเป็น D:\www\teacher_assistant สำหรับการเข้าถึง จะใช้ URL ดังนี้ http://localhost/teacher_assistant หลังจากสร้างโฟลเดอร์เสร็จเรียบร้อยก็จะเริ่มกระบวนการเตรียมโครงสร้างโปรเจ็กต์ด้วยเครื่องมือช่วยเขียนโปรแกรมชื่อว่า eclipse ซึ่งดูวิธีการสร้างโปรเจ็กต์ได้จากบทความ เริ่มต้นสร้างโปรเจ็กต์ ด้วยโปรแกรม eclipse เครื่องมือเขียนโปรแกรม php ในบทความเป็นการสร้างโปรเจ็กต์ที่มีพาธเป็นโฟลเดอร์ login แต่ในที่นี้ต้องเป็นพาธให้ตรงกับโฟลเดอร์ใหม่ที่เราได้สร้างขึ้นด้วยนะครับ

PHP กับการคิดส่วนลดเป็นเปอร์เซ็น 5%, 10%, 20% ตามช่วงราคาที่กำหนด

<?php     $total_price = 1000;     $discount = 0;         if($total_price >= 500 && $total_price < 1001){         $discount = 5;     }elseif($total_price >= 1001 && $total_price <= 5000){         $discount = 10;     }elseif($total_price >= 5001){         $discount = 20;     }         $discount_bath = ($total_price*$discount)/100; ?> <pre> ซื้อสินค้าครบ 0 ถึง 499 บาท ไม่ได้ส่วนลด ซื้อสินค้าครบ 500 ถึง 1000 บาท ได้ส่วนลด 5% ซื้อสินค้าครบ 1001 ถึง 5000บาท ได้ส่วนลด 10% ซื้อสินค้าครบ 5001 บาทขึ้นไป ได้ส่วนลด 20% </pre> <h3>รวมราคาสินค้า = <?php echo number_format($total_price,2);?></h3> <h5>ส่วนลด = <?php echo $discount;?>%  (<?php echo $discount_bath;?> บาท)</h5> <h2>ราคาหลังส่วนลด = <?php echo number_format($total_price - $discount_bath,2);?>บาท</h2> "PHP ไม่ได้สร้างสุดยอดโปรแกรม แต่ PHP ช่วยให้งานคุณง่ายขึ้นต