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

ฝึกเขียน 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 นะครับ และด้านล่างนี้ก็เป็นระบบต่างๆที่แจกให้นำไปลองใช้ลองศึกษากันครับ

สอนเขียน PHP แสดงการจองห้องประชุมแบบไฮไลท์ตามช่วงเวลา (แบบเชื่อมต่อฐานข้อมูล MySQL)

ตัวอย่าง ผลลัพธ์ที่ได้จากการจองในฐานข้อมูล ตาราง tb_room สร้างตารางรายชื่อห้องประชุม สำหรับ id นั้นเป็น Primarykey จะกำหนดให้สร้างอัตโนมัติ ทุกครั้งที่เราเพิ่มชื่อห้องประชุมใหม่ -- -- Database: `tobedev_example` -- -- -------------------------------------------------------- -- -- Table structure for table `tb_room` -- CREATE TABLE IF NOT EXISTS `tb_room` (   `id` int(11) NOT NULL,   `name` varchar(30) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- -- Dumping data for table `tb_room` -- INSERT INTO `tb_room` (`id`, `name`) VALUES (1, 'ห้องประชุม 1'), (2, 'ห้องประชุม 2'), (3, 'ห้องประชุม 3'), (4, 'ห้องประชุม 4'), (5, 'ห้องประชุม 5'); -- -- Indexes for dumped tables -- -- -- Indexes for table `tb_room` -- ALTER TABLE `tb_room`   ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `tb_room` -- ALTER TABLE `tb_room`   MODIFY `i...

การดึงข้อมูล MySQL มาแสดงในปฏิทิน Fullcalendar ด้วย PHP

หลักการทำงาน เรียกข้อมูลจากตาราง tb_event ด้วยฟังก์ชั่นของ MySQLi ข้อมูลจากฐานข้อมูลจะถูกวนลูปเก็บไว้ใน $data และจะถูกส่งไปที่ Fullcalendar ด้วยการแปลงข้อมูลจาก PHP ให้อยู่ในรูปแบบ JSON อาร์เรย์ด้วยฟังก์ชั่น json_encode() PHP Code <?php //Database $data = array(); $link = mysqli_connect("127.0.0.1", "tobedev", "1234", "tobedev_example"); mysqli_set_charset($link, 'utf8'); if (!$link) {     echo "Error: Unable to connect to MySQL." . PHP_EOL;     echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;     echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;     exit; } $query = "SELECT * FROM tb_event"; if ($result = $link->query($query)) {     /* fetch object array */     while ($obj = $result->fetch_object()) {        $data[] = array(                 ...