WEB ◆ TS Library ◆ 熱衷分享 ◆ 享受教學相長 ◆ 無形的網絡擁有熱情溫度的傳遞

6-3. 物件導向OOP的學習

(一) 認識 OOP

什麼是 OOP ( object oriented programming )

字意:面向對象編程

口語理解:以物件為導向的電腦程式設計

好處目的:讓程式可以更好描述,讓工作更方便完成

OOP的處理精神:
事先準備好物件 (就是將原來描述撰寫的程式封裝起來),
接著在處理的過程中只要關心物件有什麼功能並且完成執行功能的結果, 而不用再關心物件內部的程序了。

 

什麼叫物件? 一個物件包含「外在特徵」及「內在行為」。

例如:手機
外在特徵:尺寸、顏色…..視覺看到的樣子,也就是外在的「屬性」描述。
內在行為:打電話、發短訊、上網、玩遊戲…….,也就是可以執行的「功能」。

 

面向對象、物件導向的語法 (操作方法)
1、先設計一個「class類」程式
2、通過class類程式創建獲得「物件
3、使用物件指定 -> 設定物件自己內部的屬性、樣式、定義
4、使用物件導向 -> 執行物件自己內部的方法功能

 

(二) 一個簡單的 OOP

建立一個 ref_oop 資料夾來練習

<?php
/*
 * 使用一個class類來描述一個物件
 * class 類名稱 {
 *          //描述設定外在特徵 (屬性)
 *          public $屬性名稱1
 *          public $屬性名稱2
 *          //定義內在行為 (方法、功能)
 *          public function 方法名稱1 ( ){.......}
 *          public function 方法名稱2 ( ){.......}
 * }
 * class類是用來描述一個物件的屬性樣式及方法功能 (類似於一個模具),是不能直接執行的。
 */
 
class Phone {
  //外在特徵
  public $color;  //顏色
  public $size;   //尺寸
 
  //內在行為
  public function call(){
    echo "打電話<br>";
  }
  public function playGame(){
    echo "玩遊戲<br>";
  }
}
 
/*
 * 接著運用類程式來創建物件,創建物件的語法如下
 * $物件的變數名稱 = new 類名稱 ( [參數1, 參數2, .......] );
 * 如果沒有參數, 也可撰寫成如下
 * $物件的變數名稱 = new 類名稱;
 */
$phone1 = new Phone;
echo '<pre>';
var_dump($phone1);
echo '</pre>';
 
$phone2 = new Phone;
echo '<pre>';
var_dump($phone2);
echo '</pre>';
 
/*
 * 物件的使用
 * $物件名稱 -> 物件內的成員(屬性、方法)
 */
$phone1 -> color = '金色';
echo '<pre>';
var_dump($phone1);
echo '</pre>';
 
$phone2 -> color = '銀色';
echo '<pre>';
var_dump($phone2);
echo '</pre>';
 
$phone1 -> call();
$phone2 -> playGame();
?>

 

(三) OOP 練習範例進一步運用調整

<?php
/* ....................................... */
 
class Phone {
  //外在特徵
  public $color;  //顏色
  public $size;   //尺寸
 
  //內在行為
  public function call(){
    echo $this->color."電話在打電話<br>";
  }
  public function playGame(){
    echo $this->color."電話在玩遊戲<br>";
  }
}
 
/* ....................................... */
?>

 

(四) 運用 OOP 的方法設計 mb

conn_class.php檔案先設計資料庫的連線工作

<?php
class CONNDB {
  private $db_hostname = "localhost";
  private $db_username = "root";
  private $db_password = "123456789";
  private $db_name     = "tsphp";
  private $db_charset  = "utf8";
 
  function connect(){
    $dsn = "mysql:host={$this->db_hostname};dbname={$this->db_name};charset={$this->db_charset}";
 
    try{
      $conn = new PDO($dsn, $this->db_username, $this->db_password);
      $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
      return $conn;
    }
    catch ( PDOException $e ){
      die("ERROR!!!: ". $e->getMessage());
    } 
 
  }
}
?>

mb_class.php檔案設計相關留言牆功能的類程式--顯示部份

<?php
date_default_timezone_set("Asia/Taipei");
//建立 Mb 類程式, 繼承 CONNDB 類程式
class Mb extends CONNDB {
  public $total_rows;  //類中成員:這個屬性準備紀錄總筆數
 
  //這個function負責顯示所有mb的留言======================
  function showAll(){
    try{
      $sql_str = "SELECT * FROM mb ORDER BY mb_time DESC";
      $stmt = $this->connect()->prepare($sql_str);
      $stmt->execute();
 
      $total = $stmt->rowCount();    //計算總筆數
      $this->total_rows = $total;    //指定類中成員total_rows紀錄總筆數
      $rows_mb = array();            //建立新陣列
      while($row = $stmt->fetch()){  //逐筆取出
        $rows_mb[] = $row;           //將此筆存入新陣列中
      }
      return $rows_mb;               //回傳新陣列
    }
    catch ( PDOException $e ){
      die("ERROR!!!: ". $e->getMessage());
    } 
  }
 
  //這個function負責顯示mb的總筆數========================
  function showTotalRows(){
    echo $this->total_rows;  //輸出總筆數
  }
 
}
?>

mb_index.php檔案設計留言牆首頁留言顯示畫面

<?php
include_once('conn_class.php');
include_once('mb_class.php');
$mb = new Mb;
$RS_mb = $mb -> showAll();
?>
 
<!DOCTYPE html>
<html lang="zh-Hant-TW">
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
      .mbitem { padding: 10px; border-bottom: 1px solid #999; }
      .mbForm { max-width: 800px; margin: 0 auto; }
      .mbForm input, .mbForm textarea { 
         width: 100%; margin-bottom: 5px; padding: 5px; }
    </style>
  </head>
  <body>
 
    <p style="background-color:#ccc">目前留言總筆數:<?php $mb->showTotalRows(); ?></p>
 
    <?php 
    foreach( $RS_mb as $row_RS_mb ){
    ?>
    <div class="mbitem">
      留言者: [<?php echo $row_RS_mb['mb_id']; ?>]
      <?php echo $row_RS_mb['mb_name']; ?> 
      [<?php echo $row_RS_mb['mb_time']; ?>] 
 
      <a href="mb_modify.php?mb_id=<?php echo $row_RS_mb['mb_id']; ?>" 
         class="w3-button  w3-padding-small w3-grey">修改</a>
 
      <a href="javascript:if(
               confirm('刪除後不能複原!!!\n刪除後不能複原!!!\n刪除後不能複原!!!\n\n確定刪除嗎?'))
               {
               window.location.href='mb_delete.php?mb_id=<?php echo $row_RS_mb['mb_id']; ?>';
               }" class="w3-button w3-padding-small w3-grey">刪除</a><br>
 
      <?php echo nl2br($row_RS_mb['mb_content']); ?>
 
    </div>
    <?php } ?>
 
  </body>
</html>

mb_index.php檔案上方設計留言牆新增留言畫面

<form method="post" action="mb_insert.php" class="mbForm">
  <input type="text" name="mb_name" maxlength="20" required placeholder="請輸入留言者姓名">
  <textarea name="mb_content" rows="5" required placeholder="請輸入留言內容....."></textarea>
  <input type="submit" value="確定新增留言">
  <input type="reset" value="清除重寫">
</form>

mb_class.php檔案設計相關留言牆功能的類程式--新增留言

//這個function負責新增mb===============================
function insertRow($name,$content){
  try{
    $sql_str = "INSERT INTO mb (mb_name, mb_content, mb_time) 
                      VALUES (:mb_name, :mb_content, :mb_time)";
    $stmt = $this->connect()->prepare($sql_str);
 
    $mb_name    = $_POST['mb_name'];
    $mb_content = $_POST['mb_content'];
    $mb_time    = date('Y-m-d H:i:s');
 
    $stmt->bindParam(':mb_name'    ,$mb_name);
    $stmt->bindParam(':mb_content' ,$mb_content);
    $stmt->bindParam(':mb_time'    ,$mb_time);
 
    $stmt->execute();
  }
  catch (PDOException $e ){
    die("Error!: ". $e->getMessage());
  }
}

mb_insert.php檔案設計留言牆新增留言送出處理

<?php
include_once('conn_class.php');
include_once('mb_class.php');
$mb = new Mb;
$mb_name    = $_POST['mb_name'];
$mb_content = $_POST['mb_content'];
$mb -> insertRow($mb_name, $mb_content);
header('Location:mb_index.php');
?>

mb_modify.php檔案設計留言牆修改留言畫面

<?php
include_once('conn_class.php');
include_once('mb_class.php');
$mb = new Mb;
$mb_id = $_GET['mb_id'];
$row_RS_mb = $mb -> showOne($mb_id);
?>
<!DOCTYPE html>
<html lang="zh-Hant-TW">
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
      .mbForm { max-width: 800px; margin: 0 auto; }
      .mbForm input, .mbForm textarea { 
        width: 100%; margin-bottom: 5px; padding: 5px; }
    </style>
  </head>
  <body>
 
    <form method="post" action="mb_update.php" class="mbForm">
      <input type="text" name="mb_name" maxlength="20" required placeholder="請輸入留言者姓名"
             value="<?php echo $row_RS_mb['mb_name']; ?>">
      <textarea name="mb_content" rows="5" required 
                placeholder="請輸入留言內容....."><?php echo $row_RS_mb['mb_content']; ?></textarea>
      <input type="submit" value="確定更新留言">
      <input type="reset" value="清除重寫">
      <input type="hidden" name="mb_id" value="<?php echo $row_RS_mb['mb_id']; ?>">
    </form>
 
  </body>
</html>

mb_class.php檔案設計相關留言牆功能的類程式--顯示要修改的單筆留言

//這個function負責顯示指定的單筆mb的留言=================
function showOne($id){
  try{
    $sql_str = "SELECT * FROM mb WHERE mb_id = :mb_id";
    $stmt = $this->connect()->prepare($sql_str);
    $stmt->bindParam(':mb_id',$id);
    $stmt ->execute();
    $row = $stmt->fetch();
    return $row;
  }
  catch ( PDOException $e ){
    die("ERROR!!!: ". $e->getMessage());
  }
}

mb_class.php檔案設計相關留言牆功能的類程式--修改留言

//這個function負責更新mb的修改===========================
function updateRow($name,$content,$time,$id){
  try{
    $sql_str = "UPDATE mb SET mb_name  = :mb_name, 
                            mb_content = :mb_content,
                            mb_time    = :mb_time
                      WHERE mb_id      = :mb_id";
    $stmt = $this->connect()->prepare($sql_str);
 
    $stmt->bindParam(':mb_name'    ,$name);
    $stmt->bindParam(':mb_content' ,$content);
    $stmt->bindParam(':mb_time'    ,$time);
    $stmt->bindParam(':mb_id'      ,$id);
 
    $stmt->execute();
  }
  catch (PDOException $e ){
    die("Error!: ". $e->getMessage());
  }
}

mb_delete.php檔案設計留言牆刪除留言的處理

<?php
include_once('conn_class.php');
include_once('mb_class.php');
$mb = new Mb;
$mb_id = $_GET['mb_id'];
$mb -> deleteRow($mb_id);
header('Location:mb_index.php');
?>

mb_class.php檔案設計相關留言牆功能的類程式--刪除留言

//這個function負責刪除指定的單筆mb留言====================
function deleteRow($id){
  try{
    $sql_str = "DELETE FROM mb WHERE mb_id = :mb_id";
    $stmt = $this->connect()->prepare($sql_str);
    $stmt->bindParam(':mb_id',$id);
    $stmt ->execute();
  }
  catch ( PDOException $e ){
    die("ERROR!!!: ". $e->getMessage());
  }
}

補充:參考

 

 

go TOP