導航:首頁 > 編程語言 > 什麼是phpmodel類

什麼是phpmodel類

發布時間:2025-05-25 08:20:12

A. Thinkphp6 模型的定義以及基本使用

ThinkPHP6中的模型(Model)是資料庫操作的高級工具,它使DB操作更為便捷。首先,你需要在與controller同級的model文件夾下創建Model類,文件名需與資料庫表名對應,比如用戶表為user,對應的Model類就命名為User.php。

在控制器中,你可以直接調用模型類進行操作,如下所示:

運行後,瀏覽器會輸出模型對象。若需要直接獲取data數據,可以調用toArray方法進行轉換。

除了通過靜態方法操作,你還可以實例化模型對象進行更復雜的操作,同樣可以使用toArray方法將結果轉換為數組:

模型獲取器提供了靈活性,允許你修改欄位值,甚至定義數據表中不存在的欄位,方法命名遵循get[欄位名駝峰式]Attr規則,例如getStatusTextAttr。在控制器中調用這個方法後,性別值會被轉換。

為了獲取包含獲取器處理的額外欄位,即使數據表中不存在,你也可以使用append方法添加。已存在的表欄位則無需額外處理,系統會自動返回。

B. 用PHP編寫留言版的代碼

這個小程序一共包含6個文件,其中index.php是程序入口、post.htm是留言表單、在lib文件夾里Model、View 、Controller三個文件分別實現MVC,DataAccess是一個簡單的資料庫訪問類。
復制PHP內容到剪貼板
PHP代碼:

<?php
/**
* 一個用來訪問MySQL的類
* 僅僅實現演示所需的基本功能,沒有容錯等
* 代碼未作修改,只是把注釋翻譯一下,加了點自己的體會
*/
class DataAccess {

var $db; //用於存儲資料庫連接

var $query; //用於存儲查詢源

//! 構造函數.
/**
* 創建一個新的DataAccess對象
* @param $host 資料庫伺服器名稱
* @param $user 資料庫伺服器用戶名
* @param $pass 密碼
* @param $db 資料庫名稱
*/
function __construct($host,$user,$pass,$db) {
$this->db=mysql_pconnect($host,$user,$pass); //連接資料庫伺服器
mysql_select_db($db,$this->db); //選擇所需資料庫
//特別注意$db和$this->db的區別
//前者是構造函數參數
//後者是類的數據成員
}

//! 執行SQL語句
/**
* 執行SQL語句,獲取一個查詢源並存儲在數據成員$query中
* @param $sql 被執行的SQL語句字元串
* @return void
*/
function fetch($sql) {
$this->query=mysql_unbuffered_query($sql,$this->db); // Perform query here
}

//! 獲取一條記錄
/**
* 以數組形式返回查詢結果的一行記錄,通過循環調用該函數可遍歷全部記錄
* @return mixed
*/
function getRow () {
if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
//MYSQL_ASSOC參數決定了數組鍵名用欄位名表示
return $row;
else
return false;
}
}
?>

下面再來介紹一下Model類。
這個類也很簡單,裡面的函數一看就知道,是針對各種數據操作的,它通過DataAccess訪問資料庫。
復制PHP內容到剪貼板
PHP代碼:

<?php
//! Model類
/**
* 它的主要部分是對應於留言本各種數據操作的函數
* 如:留言數據的顯示、插入、刪除等
*/

class Model {

var $; //DataAccess類的一個實例(對象)

//! 構造函數
/**
* 構造一個新的Model對象
* @param $是一個DataAccess對象
* 該參數以地址傳遞(&$)的形式傳給Model
* 並保存在Model的成員變數$this->中
* Model通過調用$this->的fetch方法執行所需的SQL語句
*/
function __construct(&$) {
$this->=$;
}

function listNote() { //獲取全部留言
$this->->fetch("SELECT * FROM note");
}

function postNote($name,$content) { //插入一條新留言
$sql = "INSERT INTO `test`.`note`
(`id`, `name`, `content`, `ndate`, `add`)
VALUES (NULL, '$name', '$content', NULL, NULL);";
//echo $sql; //對於較復雜的合成SQL語句,<br />
//調試時用echo輸出一下看看是否正確是一種常用的調試技巧
$this->->fetch($sql);
}

function deleteNote($id) { //刪除一條留言,$id是該條留言的id
$sql = "DELETE FROM `test`.`note` WHERE `id`=$id;";
//echo $sql;
$this->->fetch($sql);
}

function getNote() { //獲取以數組形式存儲的一條留言
//View利用此方法從查詢結果中讀出數據並顯示
if ( $note=$this->->getRow() )
return $note;
else
return false;
}
}
?>

看完這兩個類之後你可能會發現這與以前我們寫程序差不多,的確現在還聞不到MVC的味道,如果你不懂MVC,在這兩個類的基礎上你完全可以開始寫你以前的程序了。例如要顯示全部留言,只需要寫入下代碼:
復制PHP內容到剪貼板
PHP代碼:

<?php
require_once('lib/DataAccess.php');
require_once('lib/Model.php');

$=& new DataAccess ('localhost','root','','test');
$model=& new Model($);
$model->listNote();

while ($note=$model->getNote())
{
$output.="姓名:$note[name]<br> 留言:<br> $note[content] <br> <hr />";
}
echo $output;
?>

很親切吧,呵呵。
有了這個「感情基礎」你就不會對MVC望而生畏了,下面我們就要上今天的主菜了,那就是「Controller」閃亮登場!
先大體瀏覽一下主要結構,它包括一個Controller類以及派生出的三個子類(listController對應顯示留言功能、postController對應發表留言功能以及deleteController對應刪除留言功能)。
復制PHP內容到剪貼板
PHP代碼:

<?php

//! Controller
/**
* 控制器將$_GET['action']中不同的參數(list、post、delete)
* 對應於完成該功能控制的相應子類
*/

class Controller {
var $model; // Model 對象
var $view; // View 對象

//! 構造函數
/**
* 構造一個Model對象存儲於成員變數$this->model;
*/
function __construct (& $) {
$this->model=& new Model($);
}

function getView() { //獲取View函數
//返回視圖對象view
//對應特定功能的Controller子類生成對應的View子類的對象
//通過該函數返回給外部調用者
return $this->view;
}

}

//用於控制顯示留言列表的子類
class listController extends Controller{ //extends表示繼承

function __construct (& $) {
parent::__construct($); //繼承其父類的構造函數
//該行的含義可以簡單理解為:
//將其父類的構造函數代碼復制過來
$this->view=& new listView($this->model);
//創建相應的View子類的對象來完成顯示
//把model對象傳給View子類供其獲取數據
}
}

//用於控制添加留言的子類
class postController extends Controller{

function __construct (& $, $post) {
parent::__construct($);
$this->view=& new postView($this->model, $post);
//$post的實參為$_POST數組
//表單中的留言項目存儲在該系統數組中
}
}

//用於控制刪除留言的子類
class deleteController extends Controller{
function __construct (& $, $id) {
parent::__construct($);
$this->view=& new deleteView($this->model, $id);
}
}
?>

大體瀏覽之後,你一定打算開始仔細研究它了吧,別急,為了心中有數,我們先從宏觀著眼,先看看總入口index.php是如何調用Controller的:
復制PHP內容到剪貼板
PHP代碼:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>PHP MVC留言板</title>
</head>
<body>
<a href="post.htm">添加新留言</a><br>
<p>

<?php
//!index.php 總入口
/**
* index.php的調用形式為:
* 顯示所有留言:index.php?action=list
* 添加留言 :index.php?action=post
* 刪除留言 :index.php?action=delete&id=x
*/
require_once('lib/DataAccess.php');
require_once('lib/Model.php');
require_once('lib/View.php');
require_once('lib/Controller.php');
//創建DataAccess對象(請根據你的需要修改參數值)
$=& new DataAccess ('localhost','root','','test');
//根據$_GET["action"]取值的不同調用不同的控制器子類
$action=$_GET["action"];

switch ($action)
{
case "post":
$controller=& new postController($,$_POST); break;
case "list":
$controller=& new listController($); break;
case "delete":
$controller=& new deleteController($,$_GET["id"]); break;
default:
$controller=& new listController($); break; //默認為顯示留言

}

$view=$controller->getView(); //獲取視圖對象
$view->display(); //輸出HTML
?>
</body>
</html>

看過index.php之後你就更清楚了吧,原來功能是通過$_GET[「action」]指定的,由一個switch結構分發,不同的功能對應不同的Controller子類。現在可以滾上去(滾動頁面上去的簡稱,絕非不潔用語^_^)仔細看看這個Controller代碼了。注釋應該很細了,不懂的地方就去看看PHP5的OOP語法和概念吧,單純看這些概念總是越看催眠效果越好,現在帶著實際問題去看,應該有所不同吧。不過我還是建議你在完成這個MVC的Hello World知道MVC是怎麼回事之後下功夫打好OOP的基礎,畢竟那是根本啊。
怎麼樣,Controller真是個光說不練的傢伙吧,看不到三行它就把你引向View了,那就看看View吧。
View里有對應的子類,負責相應功能的顯示。理解了Controller,View的代碼就不難看了,難看的話也是因為混雜著HTML的原因,它所做的就是從Model獲取所需的數據,然後塞到HTML中。
復制PHP內容到剪貼板
PHP代碼:

<?php
//! View 類
/**
* 針對各個功能(list、post、delete)的各種View子類
* 被Controller調用,完成不同功能的網頁顯示
*/
class View {

var $model; //Model對象

var $output; //用於保存輸出HTML代碼的字元串

//! 構造函數
/**
* 將參數中的Model對象接收並存儲在成員變數$this->model中
* 供子類通過model對象獲取數據
*/
function __construct (&$model) {
$this->model=$model;
}

function display() { //輸出最終格式化的HTML數據
echo($this->output);
}
}

class listView extends View //顯示所有留言的子類
{
function __construct(&$model)
{
parent::__construct(&$model); //繼承父類的構造函數(詳見Controller)
$this->model->listNote();
while ($note=$this->model->getNote()) //逐行獲取數據
{
$this->output.="姓名:$note[name]<br> 留言:<br> $note[content]
<a href=\"".$_SERVER['PHP_SELF']."?action=delete&id=$note[id]\">刪除</a><br> <hr />";
}
}
}

class postView extends View //發表留言的子類
{
function __construct(&$model, $post)
{
parent::__construct(&$model);
$this->model->postNote($post[name],$post[content]);
$this->output="Note Post OK!<br><a href=\"".$_SERVER['PHP_SELF']."?action=list\">查看</a>";
}
}

class deleteView extends View //刪除留言的子類
{
function __construct(&$model, $id)
{
parent::__construct(&$model);
$this->model->deleteNote($id);
$this->output="Note Delete OK!<br><a href=\"".$_SERVER['PHP_SELF']."?action=list\">查看</a>";
}
}
?>

之所以UI方面寫得如此簡陋,是因為這些工作可以交給Smarty這樣的模板去做,而我們這里就像集中精力研究MVC,不想把Smarty扯進來,所以就這樣湊合了,以後我們可以再把Smarty結合進來。
看了這個東西之後不知你是否對MVC的概念和實現更明白了一點。
我也是個初學者,這是個依葫蘆畫瓢之作,目的就是想了解一下MVC,如果你是高手,我很想得到你的點評,這樣的劃分和架構是否符合MVC的理念?還有哪些應該改進之處?
當然,大家都知道現在很多關於MVC的爭論,這很正常,就像關於開發語言的爭論一樣,永無休止,學術上的爭論有助於創新。作為我們學技術、用技術而言,一定要踏實深入學習,掌握了基本用法之後再去討論,那才是更高層次的發展,在自己都搞不清的情況下在哪裡爭論只能是浪費時間。
下面說說我體會到的MVC的好處,它的確給程序的功能擴展帶來方便,比如這個例子我們想要增加一個根據用戶名查詢留言的功能,只需要在Model里增加一個查詢函數(突然發現這些函數的用法很像存儲過程),Controller和View里增加相應的子類,這種分離帶來的好處是程序功能模塊可以即插即用,再就是整個程序的邏輯非常清晰。我想,對於需求變動頻繁的Web應用來說,這種特性也許是很有價值的。

C. php 框架model文件用來干什麼的

model 相當於一個數據模型,專門對數據做處理的,比如你要對資料庫增刪改查,就通過調用model來實現。因為它就是與數據溝通的橋梁。只是一種流行的MVC模式的M層而已,編碼風格各不相同的。

D. 淺談model,orm,和active record的區別

首先來看Model,模型。模型是MVC中的概念,指的是數據和改變數據的操作(業務邏輯)。模型通常指代現實生活中的某樣實體。以訂單為例,每個訂單都包含許多數據,如客戶、價格、明細等等,這些數據都叫做訂單這個模型的屬性,此外,和訂單相關的一些列操作,比如當購買時,你可能需要先檢查庫存,給與一定的優惠,再更新賬戶余額和積分等等,這些就叫做業務邏輯,也是模型的一部分,從代碼上來講,是要放在模型中的。

當模型執行完業務邏輯後,我們便要把模型中的數據保存到資料庫中。如果我們直接把和資料庫相關的代碼放在模型里,會使得以後的維護相當的麻煩。在我之前的一個項目中,我們用戶的增長相當快,導致一台資料庫無法支撐所有的訪問,不得不使用分庫來解決問題。然而前人把SQL語句直接寫在了模型這一層里,這導致分庫相當的麻煩,我們只能先把這些SQL語句抽出來,才能把分庫進行下去。我們把這些抽出來的SQL代碼放到單獨的一層,這一層便是DAL,Data
Access
Layer,數據訪問層,它由許多DAO組成,目的便是把和資料庫相關的代碼封裝起來,這樣當我們執行分庫時,便只用調整DAO的代碼了,模型根本不用關心它使用的數據是放在A庫還是B庫。

DAO其實是來源於J2EE的一個設計模式,當初的目的也是使得企業更換資料庫時,不用影響模型層的代碼。

與DAO類似,ORM也是一種封裝數據訪問的概念。然而ORM不像DAO只是一種軟體設計的指導原則,強調的是系統應該層次分明。ORM更像是一種工具,有著成熟的產品,比如JAVA界非常有名的Hibernate,以及很多PHP框架里自帶的ORM庫。他們的好處在於能將你程序中的數據對象自動地轉化為關系型資料庫中對應的表和列,數據對象間的引用也可以通過這個工具轉化為表之間的join,而Hibernate甚至提供一套他們自己的數據查詢語言HQL來解決復雜的查詢問題。

使用ORM的好處就是使得你的開發幾乎不用接觸到SQL語句。創建一張表,聲明一個對應的類,然後你就只用和這個類的實例進行交互了,至於這個對象里的數據該怎麼存儲又該怎麼獲取,通通不用關心。

Active Record則是隨著ruby on
rails的流行而火起來的一種ORM模式,它是把負責持久化的代碼也集成到數據對象中,即這個數據對象知道怎樣把自己存到資料庫里。這與以往的ORM有不同,傳統的ORM會把數據對象和負責持久化的代碼分開,數據對象只是一個單純包含數據的結構體,在模型層和ORM層中傳遞。而在Active

Record中,模型層集成了ORM的功能,他們既代表實體,包含業務邏輯,又是數據對象,並負責把自己存儲到資料庫中,當然,存儲的這一部分代碼是早已在模型的父類中實現好了的,屬於框架的一部分,模型只需簡單的調用父類的方法來完成持久化而已。

E. php的tp框架和mvc有啥區別

首先說Model吧。
在TP中是一個表對應一個Model,而且普通Model中只是一些自動驗證啊,自動完成啊、還有數據欄位信息啊一些東西;而CI中的Model則完全不同,一個Model不必約束於一個表,也就是說名字為abc的Model中你也可以查詢名字為def的表中的數據,而且可以定義方法完成一些數據查詢,比如我可以在名為articles_model的Model中定義一個名字為get_articles的方法來獲取所有文章信息,當某個Controller載入了這個Model後,就可以在相應的Controller中用

1

$this->articles_model->get_articles();

來方便地獲取所有文章信息,而對於TP來說,這些操作只能在Action類中完成。2.0版的TP已經把View、Relation和Adv三個高級查詢model庫類定為不自動載入了,看了一下手冊,感覺除了View視圖查詢容易用一點,另外兩個都不怎麼好用,感覺用起來太復雜,還不如用原生的SQL查詢。CI的Model還有一個使我很喜歡的方法就是dbprefix方法,在使用原生的sql查詢時使用這個函數使得修改資料庫表名前綴後你的代碼不需要經過任何改動。在TP中我沒有發現類似的函數,當我用TP開發一個博客系統時,發現關聯查詢很麻煩,於是想用原生的SQL查詢,卻沒有找到自動增加資料庫表名前綴的方法,雖然可以自己修改TP的核心庫來實現,但是還是覺得這樣有點不太好。真的要感謝TP,如果不是TP,也許我就不會去關注CI了,當我那天看了幾頁CI的英文文檔後,立馬就對它產生的深厚的興趣,於是第二天一起床就開始看CI的手冊,雖然是從官網下的英文版的,不過它的手冊寫得很簡潔、很周到,邊看邊操作,看完手冊後我就幾乎能熟練使用這個框架了。於是用它開發了一個博客系統。
CI的Model類簡單易用,TP的Model類功能相對來說要強大一些,但是用起來個人感覺沒有那麼方便。
其次,對於View,從功能上講,TP的View要更加強大一些,選擇更多一些,在TP中你可以選擇就用PHP作模板引擎,可以就用TP自身的模板引擎,也可以選擇用smarty等其它第三方模板引擎。而在CI中就只能用CI內置的功能簡單的模板引擎或者用原生的PHP代碼作模板,個人覺得用PHP作模板更好一些,一來省去了學習另外的模板引擎語法的麻煩,二來執行效率更高一些。因些從View來講,選擇CI或者是TP都無所謂。
再次是Controller了,在CI中的應用的控制器是繼承自核心類Controller的,TP中的控制器則是繼承於核心類Action。不過還是有不同的,在TP中,你可以把一些公共的變數或者在多個控制器中都要執行的東西放在一個action里,假如這個action文件為CommonAction.class.php ,在它的_initialize方法中可以執行一些在多個控制器中都要執行的代碼或者初始化一些多個控制器都要使用的變數,這樣,應用的其它action只要繼承CommonAction 就可以實現了。因為框架在載入相應action時首先會自動載入那個CommonAction的。而在CI中就沒有這個方便的功能了,但是也可以自己寫一個library,在該library類的__construct方法里放一些代碼,然後在每個控制器中都載入這個library,這樣也可以實現像TP一樣的功能。不過相對來說麻煩了一些。TP還有一點比較靈活的就是,在這個控制器(action)裡面可以執行那個控制器中的函數(比如用A或者R函數來實現),在CI中則不行,你不能在這個控制器中執行那個控制器中的函數。還有就是TP可以定義一個名為EmptyAction的控制器,當所有控制器都找不到時,就調用這個Empty控制器。這一點如果與empty方法配合,可以使得URL大大縮減。雖然CI和TP都支持空操作,不過這二者的空操作名稱不相同,實現的優先順序也不相同。在TP中的空操作(_empty方法)優先順序是最低的,也就是說當當前控制器的所有操作都找不到時才調用這個空操作;在CI中則恰恰相反,只要存在空操作(_remap方法),該控制器的其它的操作都沒用了(不能訪問了)。

閱讀全文

與什麼是phpmodel類相關的資料

熱點內容
方塊方舟如何跨私人伺服器 瀏覽:217
編譯器打不開了 瀏覽:409
騰訊雲伺服器已登錄 瀏覽:177
筆記本文件夾不能加密 瀏覽:217
單片機程序執行時間計算公式 瀏覽:926
keil5編譯顯示找不到頭文件 瀏覽:166
android保存圖片到相冊不顯示圖片 瀏覽:330
照片在文件夾怎麼發抖音 瀏覽:900
什麼app可以交房產稅 瀏覽:913
單片機9腳排阻 瀏覽:554
陳意雲張昱第3版編譯原理 瀏覽:535
台灣最可愛程序員 瀏覽:470
區分加密ic卡 瀏覽:921
可編程式控制制器實驗指導書 瀏覽:515
伺服器老是崩服怎麼辦 瀏覽:353
浪潮英信伺服器如何啟動 瀏覽:368
程序員編譯表情包 瀏覽:961
安卓如何切換9宮格 瀏覽:406
漫步者g2驅動要解壓嗎 瀏覽:111
中英文對照單片機編譯 瀏覽:630