Rumah pembangunan bahagian belakang tutorial php 实例详解PHP面向对象之留言本功能的实现

实例详解PHP面向对象之留言本功能的实现

Apr 08, 2018 pm 02:23 PM

这篇文章主要介绍了PHP基于面向对象实现的留言本功能,结合实例形式分析了php基于面向对象的留言本相关写入、显示查看、日志记录等相关方法封装与使用技巧,需要的朋友可以参考下

本文实例讲述了PHP基于面向对象实现的留言本功能。分享给大家供大家参考,具体如下:

要设计一留言本,一切都将以留言本为核心,抓到什么是什么,按流程走下来,即按用户填写信息->留言->展示的流程进行。

现在用面向对象的思维思考这个问题,在面向对象的世界,会想尽办法把肉眼能看见的以及看不见的,但是实际存在的物或者流程抽象出来。既然是留言本,那么就存在留言内容这个实体,这个留言实体(domain)应该包括留言者姓名、E-mail、留言内容等要素,如下面代码所示


//留言实体类
class message
{
  public $name;//留言者姓名
  public $email;//留言者联系方式
  public $content;//留言内容
  public function __set($name,$value)
  {
    $this->$name = $value;
  }
  public function __get($name)
  {
    if(!isset($this->$name))
    {
      $this->$name = NULL;
    }
  }
}
Salin selepas log masuk

上面的类就是所说的domain,是一个真实存在的、经过抽象的实体模型。然后需要一个留言本模型,这个留言本模型包括留言本的基本属性和基本操作,代码如下所示


class gbookModel
{
  private $bookPath;//留言本文件
  private $data;//留言数据
  public function setBookPath($bookPath)
  {
    $this->bookPath = $bookPath;
  }
  public function getBookPath()
  {
    return $this->bookPath;
  }
  public function open()
  {
  }
  public function close()
  {
  }
  public function read()
  {
    return file_get_contents($this->bookPath);
  }
  //写入留言
  public function write($data)
  {
    $this->data = self::safe($data)->name."&".self::safe($data)->email." said: ".self::safe($data)->content.PHP_EOL;
    return file_put_contents($this->bookPath,$this->data,FILE_APPEND);
  }
  //模拟数据的安全处理,先拆包再打包
  public static function safe($data)
  {
    $reflect = new ReflectionObject($data);
    $props = $reflect->getProperties();
    $messagebox = new stdClass();
    foreach($props as $props)
    {
      $ivar = $props->getName();
      $messagebox->$ivar = trim($props->getValue($data));
    }
    return $messagebox;
  }
  public function delete()
  {
    file_put_contents($this->bookPath,"it's empty now");
  }
}
Salin selepas log masuk

实际留言的过程可能会更复杂,可能还包括一系列准备操作以及log处理,所以应定义一个类负责数据的逻辑处理,代码如下所示


class leaveModel
{
  public function write(gbookModel $gb, $data)
  {
    $book = $gb->getBookPath();
    $gb->write($data);
    //记录日志
  }
}
Salin selepas log masuk

最后,通过一个控制器,负责对各种操作的封装,这个控制器是直接面向用户的,所以包括留言本查看、删除、留言等功能。可以形象理解为这个控制器就是留言本所提供的直接面向使用者的功能,封装了操作细节,只需要调用控制器的相应方法即可,代码如下所示


class authorControl
{
  public function message(leaveModel $l, gbookModel $g, message $data)
  {
    //在留言本上留言
    $l->write($g,$data);
  }
  public function view(gbookModel $g)
  {
    //查看留言本内容
    return $g->read();
  }
  public function delete(gbookModel $g)
  {
    $g->delete();
    echo self::view($g);
  }
}
Salin selepas log masuk

测试代码如下所示


$message = new message;
$message->name = 'chenqionghe';
$message->email = 'cqh@cqh.net';
$message->content = 'chenqionghe is a handson boy.';
$gb = new authorControl();//新建一个留言相关的控制器
$pen = new leaveModel();//拿出笔
$book = new gbookModel();//翻出笔记本
$book->setBookPath("E:\\chenqionghe.txt");
$gb->message($pen,$book,$message);
echo $gb->view($book);
//$gb->delete($book);
Salin selepas log masuk

这样看起来是不是比面向对象过程要复杂多了?确实是复杂了,代码量增多了,也难理解 。似乎体现不出优点来。但是你思考过以下问题吗?

1.如果让很多人来负责完善这个留言本,一部分实体关系的建立,一部人负责数据操作层的代码,这样是不是更容易分工了呢?

2.如果我要把这个留言本进一步开发,实现记录在数据库中,或者添加分页功能,又该如何呢?

要实现上面的第二问题提出的功能,只需在gookModel类中添加分页方法,代码如下所示


public function readByPage()
{
    $handle = file($this->bookPath);
    $count = count($handle);
    $page = isset($_GET['page']) ? intval($_GET['page']) : 1;
    if($page<1 || $page>$count)
      $page = 1;
    $pnum = 9;
    $begin = ($page-1) * $pnum;
    $end = ($begin+$pnum) > $count ? $count :$begin + $pnum;
    for($i=$begin; $i<$end; $i++)
    {
      echo &#39;<strong>&#39;,$i+1,&#39;</strong>&#39;,$handle[$i],&#39;<br />&#39;;
    }
    for($i=1;$i<ceil($count/$pnum);$i++)
    {
      echo &#39;<a href="?page=&#39;.$i.&#39;" rel="external nofollow" rel="external nofollow" >&#39;.$i.&#39;</a>&#39;;
    }
}
Salin selepas log masuk

然后到前端控制器里添加对应的action,代码如下所示


public function viewByPage(gbookModel $g)
{
    return $g->readByPage();
}
Salin selepas log masuk

运行结果如下

只需要这么简单的两步,就可以实现所需要的分页功能,而且已有的方法都不用修改,只需要在相关类中新增方法即可。当然,这个分页在实际点击时是有问题的,因为没有把Action分开,而是通通放在一个页面里。对照着上面的思路,还可以把留言本扩展为MySQL数据库的。

这个程序只体现了非常简单的设计模式,这个程序还有许多要改进的地方,每个程序员心中都有一个自己的OO。项目越大越能体现模块划分、面向对象的好处。

下面是完整的代码


bookPath = $bookPath;
  }
  public function getBookPath()
  {
    return $this->bookPath;
  }
  public function open()
  {
  }
  public function close()
  {
  }
  public function read()
  {
    return file_get_contents($this->bookPath);
  }
  public function readByPage()
  {
    $handle = file($this->bookPath);
    $count = count($handle);
    $page = isset($_GET['page']) ? intval($_GET['page']) : 1;
    if($page<1 || $page>$count)
      $page = 1;
    $pnum = 9;
    $begin = ($page-1) * $pnum;
    $end = ($begin+$pnum) > $count ? $count :$begin + $pnum;
    for($i=$begin; $i<$end; $i++)
    {
      echo '',$i+1,'',$handle[$i],'
'; } for($i=1;$i'.$i.''; } } //写入留言 public function write($data) { $this->data = self::safe($data)->name."&".self::safe($data)->email." said: ".self::safe($data)->content.PHP_EOL; return file_put_contents($this->bookPath,$this->data,FILE_APPEND); } //模拟数据的安全处理,先拆包再打包 public static function safe($data) { $reflect = new ReflectionObject($data); $props = $reflect->getProperties(); $messagebox = new stdClass(); foreach($props as $props) { $ivar = $props->getName(); $messagebox->$ivar = trim($props->getValue($data)); } return $messagebox; } public function delete() { file_put_contents($this->bookPath,"it's empty now"); } } class leaveModel { public function write(gbookModel $gb, $data) { $book = $gb->getBookPath(); $gb->write($data); //记录日志 } } class authorControl { public function message(leaveModel $l, gbookModel $g, message $data) { //在留言本上留言 $l->write($g,$data); } public function view(gbookModel $g) { //查看留言本内容 return $g->read(); } public function viewByPage(gbookModel $g) { return $g->readByPage(); } public function delete(gbookModel $g) { $g->delete(); echo self::view($g); } } $message = new message; $message->name = 'chenqionghe'; $message->email = 'cqh@cqh.net'; $message->content = 'chenqionghe is a handson boy.'; $gb = new authorControl();//新建一个留言相关的控制器 $pen = new leaveModel();//拿出笔 $book = new gbookModel();//翻出笔记本 $book->setBookPath("E:\\chenqionghe.txt"); $gb->message($pen,$book,$message); //echo $gb->view($book); echo $gb->viewByPage($book); //$gb->delete($book);
Salin selepas log masuk


Atas ialah kandungan terperinci 实例详解PHP面向对象之留言本功能的实现. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini 7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini Nov 13, 2024 am 09:42 AM

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

See all articles