国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站建設(shè)前言和背景公司網(wǎng)站注冊(cè)流程和費(fèi)用

網(wǎng)站建設(shè)前言和背景,公司網(wǎng)站注冊(cè)流程和費(fèi)用,湖南做網(wǎng)站公司,手機(jī)之家1、mvc原理 # mvc 與框架## 1.mvc 是什么1. m:model,模型(即數(shù)據(jù)來源),主要是針對(duì)數(shù)據(jù)庫操作 2. v:view,視圖,html 頁面。視圖由一個(gè)一個(gè)模板構(gòu)成(模板是視圖的一個(gè)具體展現(xiàn)或載體,視圖是模板的一個(gè)抽象) 3. c:controller,控制器,用于mv之間的數(shù)據(jù)交互## 2.最簡單的 mvc 就是一…

1、mvc原理

# mvc 與框架## 1.mvc 是什么1. m:model,模型(即數(shù)據(jù)來源),主要是針對(duì)數(shù)據(jù)庫操作
2. v:view,視圖,html 頁面。視圖由一個(gè)一個(gè)模板構(gòu)成(模板是視圖的一個(gè)具體展現(xiàn)或載體,視圖是模板的一個(gè)抽象)
3. c:controller,控制器,用于mv之間的數(shù)據(jù)交互## 2.最簡單的 mvc
就是一個(gè)可以顯示數(shù)據(jù)庫內(nèi)容的模板## 3.分層后的mvc### 2.1 控制器(以下三個(gè))1. 接受請(qǐng)求: 路由
2. 選擇模型: CURD
3. 加載視圖: 模板### 2.2 模型(功能是操作數(shù)據(jù)庫)1. 查詢構(gòu)造器
2. 模型操作## 2.3 視圖(以下兩個(gè))1. 模板賦值
2. 渲染視圖

2、mvc的極簡實(shí)現(xiàn)方式(一個(gè)頁面)

<?php
//!數(shù)據(jù)庫查詢(model)
//第一步:連接數(shù)據(jù)庫
$db = new PDO('mysql:dbname=phpedu','root','root');// 第二步:對(duì)數(shù)據(jù)庫進(jìn)行查詢
$stmt = $db->prepare('SELECT * FROM `staff` LIMIT ?');// 第三步:數(shù)據(jù)綁定,獲取指定的數(shù)據(jù),確定獲取的數(shù)據(jù)條數(shù)
$stmt->bindValue(1,5,PDO::PARAM_INT);// 第四步:執(zhí)行上述操作,如果不進(jìn)行數(shù)據(jù)綁定就需要在execute里面加入?yún)?shù)
$stmt->execute();// 第五步:把查詢到的數(shù)據(jù)集保存到一個(gè)變量里備用
$staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);
?><!-- 視圖(view) -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>員工列表</title>
</head>
<body><!-- 第六步:foreach渲染數(shù)據(jù) --><h3>員工列表</h3><?php foreach ($staffs as $staff) :extract($staff) ?><li><?=$id?>:<?=$name?> , <?=$sex ? '女':'男'?>(<?=$email?>)</li><?php endforeach?>
</body>
</html>

上述代碼中,模型model和視圖view都已經(jīng)存在了,而控制器controller實(shí)際上已經(jīng)有了,但是我們看不到,因?yàn)槲覀兩厦娴臉I(yè)務(wù)邏輯太簡單,直接把數(shù)據(jù)寫進(jìn)去了。沒有通過controller讓model和view進(jìn)行數(shù)據(jù)交互。

3、分層的mvc?

先寫控制器controller,控制器寫完寫模型model,模型寫完最后再寫視圖view。

?其中,core里面包含模型類(Model.php),視圖類(View.php),控制器類(controller.php)

?

?Model.php

<?php// 模型類// 命名空間遵循psr-4
// 類名與文件名同名
// 當(dāng)前類的命名空間與當(dāng)前類所在的路徑應(yīng)該是一一對(duì)應(yīng)的
namespace core;use PDO;// 視圖,控制器和模型不能直接使用,因?yàn)檫@是底層的業(yè)務(wù)邏輯
// 是框架源碼的一部分,不要讓用戶直接用,因?yàn)榭蚣芤坏└?// 新的框架源碼會(huì)把core目錄下的所有代碼全部覆蓋
// 所以視圖,控制器和模型里面的內(nèi)容和類盡量把它們轉(zhuǎn)為抽象的
// 或者干脆寫個(gè)接口,讓用戶來進(jìn)行實(shí)例化
// 模型抽象化(每個(gè)用戶一張表),只允許通過子類使用
abstract class Model
{// 要把連接對(duì)象寫成屬性,因?yàn)檫@個(gè)對(duì)象它會(huì)在當(dāng)前的模型類中多個(gè)方法中使用protected $db = null;// 1.連接數(shù)據(jù)庫// 在實(shí)例化時(shí)能夠自動(dòng)連接,可以寫在構(gòu)造函數(shù)里public function __construct($dsn,$username,$password){$this->db = new PDO($dsn,$username,$password);}// 2.內(nèi)置一些基本的底層操作,供用戶的自定義模型用// 自定義模型:與某一個(gè)或某一張數(shù)據(jù)表相關(guān)的類// 2.1獲取全部數(shù)據(jù)public function select($num){$sql = 'SELECT *FROM `staff` LIMIT ?;';$stmt = $this->db->prepare($sql);$stmt->bindParam(1,$num,PDO::PARAM_INT); // !這種方法可以確保當(dāng)出錯(cuò)時(shí)我們知道錯(cuò)誤在哪里// if($stmt->execute()){//     return $stmt->fetchAll(PDO::FETCH_ASSOC);// }else{//     print_r($stmt->errorInfo());// }// !也可以用簡化版,因?yàn)槌鲥e(cuò)概率較低$stmt->execute();return $stmt->fetchAll(PDO::FETCH_ASSOC);}// 2.2獲取某個(gè)數(shù)據(jù)(id)public function getOne($id){$sql = 'SELECT *FROM `user` WHERE `id` = ?;';$stmt = $this->db->prepare($sql);$stmt->bindParam(1,$id,PDO::PARAM_INT); $stmt->execute();return $stmt->fetch(PDO::FETCH_ASSOC);}
}

?View.php

<?php// 視圖類namespace core;class view
{// 1.模板變量容器protected array $data = [];// 2.模板賦值public function assign(string $key,$value){$this->data[$key] = $value;}// 3.渲染視圖// 渲染與傳參可以同步完成// $path告訴數(shù)據(jù)顯示在哪個(gè)頁面中public function render(string $path,array $data = []){if($data){foreach($data as $key=>$value){$this->assign($key,$value);}}// 將模板變量數(shù)組展開為獨(dú)立的變量,以方便傳入到模板中使用extract($this->data);// 渲染/加載模板文件file_exists($path) ? include $path : die('模板不存在');}
}

Controller.php

<?php// 控制器類namespace core;abstract class Controller
{// 1.模型對(duì)象protected Model $model;// 2.視圖對(duì)象protected View $view;// 3.實(shí)例化,初始化上面的模型對(duì)象,視圖對(duì)象public function __construct(Model $model,View $view){$this->model = $model;$this->view = $view;}
}

autoload.php(自動(dòng)加載器)

<?php// 注冊(cè)類的自動(dòng)加載器方法
spl_autoload_register(function($class){// require str_replace('\\','/',$class) . 'php';// 為了系統(tǒng)的兼容性,可以使用require str_replace('\\',DIRECTORY_SEPARATOR,$class) . '.php';// 這是一個(gè)可以代替 composer 的方法,參數(shù)是function,傳入了一個(gè)類名,// 然后用str_replace這個(gè)函數(shù),把類里面的命名空間,也就是反斜線替換成路徑符,// 然后在后面加擴(kuò)展名 .php 轉(zhuǎn)變?yōu)轭惥托辛?/ 這樣就實(shí)現(xiàn)了了一個(gè)類的自動(dòng)加載了(相當(dāng)于require了一個(gè)命名空間+類名)
});

如果想要把這些類一個(gè)一個(gè)加載到項(xiàng)目中去,則需要針對(duì)不同的業(yè)務(wù)類型創(chuàng)建不同的控制器和模型,所以要?jiǎng)?chuàng)建一個(gè)controller文件夾

?

?StaffController.php(用戶自定義控制器)

雖然不是控制器基類,但是要求必須繼承自控制器基類(父類)

<?php// 自定義控制器,必須繼承自控制器基類(超類/父類)namespace controller;use core\Controller;
use core\Model;
use core\View;
use model\StaffModel;class StaffController extends Controller
{public function __construct(Model $model,View $view){// 里面這樣寫就冗余了// $this->model = $model;// $this->view = $view;//子類的構(gòu)造函數(shù)直接調(diào)用父類的構(gòu)造方法就可以了parent::__construct($model,$view);}// 自定義方法:默認(rèn)方法// index():列出所有數(shù)據(jù)public function index($num = 10){// 1.選擇模型:獲取數(shù)據(jù)$staff = $this->model->getAll($num);// 2.加載視圖// 路徑約定:view/控制器/方法名.php// key值可以理解為變量名,相當(dāng)于把$staff接收到的值賦給了名為staffs的變量$this->view->render('view/staff/index.php',['staffs'=>$staff]);}
}

創(chuàng)建類文件夾,里面都是自定義模型類?

?

?StaffModel.php(用戶自定義模型類)

<?php
// 自定義模型namespace model;use core\Model;class StaffModel extends Model
{public function __construct($dsn,$username,$password){parent::__construct($dsn,$username,$password);}// 獲取全部數(shù)據(jù)public function getAll($num){return $this->select($num);}
}

創(chuàng)建視圖文件夾,在視圖里再創(chuàng)建文件夾,staff文件夾對(duì)應(yīng)是當(dāng)前的控制器,里面的文件對(duì)應(yīng)當(dāng)前的方法。

?

?staff>index.php

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>員工列表</title>
</head>
<body><!-- 第六步:foreach渲染數(shù)據(jù) --><h3>員工列表</h3><?php foreach ($staffs as $staff) :extract($staff) ?><li><?=$id?>:<?=$name?> , <?=$sex ? '女':'男'?>(<?=$email?>)</li><?php endforeach?>
</body>
</html>

在mvc2文件夾下創(chuàng)建測試文件index.php

?mvc2>index.php

<?php
namespace mvc2;use controller\StaffController;
use model\StaffModel;
use core\view;
// 入口文件:測試// 1.類的自動(dòng)加載器
// 自動(dòng)加載器主要用來加載間接用到的類,但是直接用到的類還是需要用use
require __DIR__ . '/core/autoload.php';// 路由解析// 2.實(shí)例化控制器
$model = new StaffModel('mysql:dbname=phpedu','root','root');
$view = new View();
// 實(shí)例化控制器對(duì)象
$staff = new StaffController($model,$view);// 3.調(diào)用控制器中的方法
$staff->index(3);

上述運(yùn)行結(jié)果:

?4、路由原理及應(yīng)用

<?php// 路由的本質(zhì):是從url中解析出控制器,控制方法,以及方法的參數(shù)// 1.controller:控制器類名
// 2.method:控制器中的某個(gè)方法名
// 3.parameter:參數(shù)列表,以數(shù)組形式// 以上三種數(shù)據(jù)在url中的展示方式有兩種
// 1.queryString:查詢字符串
// 2.PATH_INFO:路徑信息// phpedu.io/one/two/demo1.php?查詢字符串,以鍵值對(duì)方式,和&分開
// !c:controller,m:method,p:parameter
// phpedu.io/one/two/demo1.php?c=hello&m=method&p=aaa
// 得到這個(gè)查詢字符串以后,我們可以通過一些方法,將該字符串解析成數(shù)組,從而得到控制器,方法和參數(shù)//! 在我們的腳本名稱 `phpedu.io/one/two/demo1.php` 和查詢字符串 `c=hello&m=method&p=aaa`之間
// !如果又出現(xiàn)路徑,我們用 PATH_INFO 表示 /user/index/100/200
// phpedu.io/one/two/demo1.php   PATH_INFO   ?c=hello&m=method&p=aaa
// phpedu.io/one/two/demo1.php/user/index/100/200?c=hello&m=method&p=aaa// /user/index/100/200:PATH_INFO
function p($data)
{echo is_array($data) ? sprintf('<pre>%s</pre>',print_r($data,true)) : $data;
}
p([1,2,3]);
p('Hello');
echo '<hr>';
// !QueryString: 查詢字符串
// 超全局?jǐn)?shù)組$_SERVER的QUERY_STRING鍵可以返回當(dāng)前的查詢字符串
p($_SERVER['QUERY_STRING']);
// 將查詢字符串解析到數(shù)組里面
parse_str($_SERVER['QUERY_STRING'],$request);
p($request);// 人為認(rèn)定
// c controller, m:method,name:parameter
$controller = array_shift($request);
$method = array_shift($request);
$params = array_shift($request);// 控制器類:測試專用
class HelloController
{public function world($name){return 'Hello ,' . $name;}
}// 生成控制器類名
$controller = ucfirst($controller) . 'Controller';
echo (new $controller)->$method($params);
// 一般用回調(diào)的方式來調(diào)用
// echo call_user_func_array([new $controller(),$method],[$params]);
echo call_user_func([new $controller(),$method],$params);
echo '<hr>';// ! 2.PATH_INFO:查詢字符串與腳本之間的路徑信息
//* http://phpedu.io/0824/router.php/hello/world/admin?c=hello&m=world&name=peter
//* PATH_INFO:/hello/world/admin
p($_SERVER['PATH_INFO']);
p(explode('/',$_SERVER['PATH_INFO']));
// 但這樣之后發(fā)現(xiàn)索引0對(duì)應(yīng)的值為空
// p(array_filter(explode('/',$_SERVER['PATH_INFO'])));
// 去除空字符也可以這樣
$request = explode('/',trim($_SERVER['PATH_INFO'],'/'));$controller = array_shift($request);
$method = array_shift($request);
$params = array_shift($request);$controller = ucfirst($controller) . 'Controller';
echo call_user_func([new $controller(),$method],$params);
// 也可以 echo call_user_func_array([new $controller(),$method],[$params]);// !推薦使用PATH_INFO
// 通過url重寫功能,可以將腳本的擴(kuò)展名php隱藏,也可以在末尾自定義一個(gè)擴(kuò)展名
//* 隱藏后的地址具有欺騙性:http://phpedu.io/0824/router/hello/world/admin.html/*** 總結(jié):* 1.$_SERVER['QUERY_STRING']以鍵值對(duì)方式返回當(dāng)前字符串,返回值是數(shù)組,需要用parse_str轉(zhuǎn)換成字符串* 2.1.$_SERVER['PATH_INFO']返回帶有/的字符串,返回值是字符串,需要用explode切割轉(zhuǎn)換成數(shù)組*/

上述運(yùn)行結(jié)果:

?

在mvc3文件夾下創(chuàng)建測試文件index.php?

<?php
namespace mvc3;use model\UserModel;
use core\view;
use core\Router;
// 入口文件:測試// 1.類的自動(dòng)加載器
require __DIR__ . '/core/autoload.php';// 路由解析
$request = Router::parse();$controller = array_shift($request);
$method = array_shift($request);
$params = array_shift($request);// 生成控制器名稱
$controller ='controller\\' . ucfirst($controller) . 'Controller';// echo $controller;
// die;// 2.實(shí)例化控制器
$model = new UserModel('mysql:dbname=phpedu','root','root');
$view = new View();
// 實(shí)例化控制器對(duì)象
$user = new $controller($model,$view);// 3.調(diào)用控制器中的方法
call_user_func_array([$user,'get'],$params);

?mvc3>core>router.php

<?phpnamespace core;// 路由器類
class Router
{public static function parse(): array{// 默認(rèn)控制器,實(shí)際項(xiàng)目,應(yīng)該來自配置文件,而不是在寫死$controller = 'Index';$action = 'index';// 參數(shù)列表$params = [];// 判斷是否存在pathinfoif (array_key_exists('PATH_INFO', $_SERVER) && $_SERVER['PATH_INFO'] !== '/') {// 為什么要判斷 $_SERVER['PATH_INFO'] !== '/' ?// 因?yàn)? admin.php/ 時(shí),$_SERVER['PATH_INFO'] = '/', 導(dǎo)致解析控制器失敗$pathinfo = array_filter(explode('/', $_SERVER['PATH_INFO']));// dump($pathinfo);// 考慮到index.php/ 情況, 這時(shí)pathinfo為空數(shù)組if (count($pathinfo) >= 2) {$controller = array_shift($pathinfo);$action = array_shift($pathinfo);$params = $pathinfo;// $params = array_shift($pathinfo);} else {$controller = array_shift($pathinfo);}}// 查看控制器,方法,參數(shù)// dump($controller, $action, $params);// 將這些數(shù)據(jù)返回出去return [$controller, $action, $params];}
}

mvc3>model>UserModel

<?php
// 自定義模型namespace model;use core\Model;class UserModel extends Model
{public function __construct($dsn,$username,$password){parent::__construct($dsn,$username,$password);}// 獲取全部數(shù)據(jù)public function get($id){return $this->getOne($id);}
}

mvc3>view>user>get

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>員工信息</title>
</head><body><!-- 第六步:foreach渲染數(shù)據(jù) --><h3>員工信息</h3><?php if (is_array($user)) : ?><?php foreach ($user as $key => $value) : ?><!-- 如果不想拿 --><?php// if($value = null){//     echo '該用戶不存在';// }if ($key === 'password' || $key === 'register_time') {continue;}?><li>[<?= $key ?>] => <?= $value ?></li><?php endforeach ?><?php endif ?><?php if (is_array($user) == null) : ?><h3>此用戶不存在</h3><?php endif ?>
</body></html>

?上述運(yùn)行結(jié)果:

?

http://m.aloenet.com.cn/news/45224.html

相關(guān)文章:

  • 大連網(wǎng)站建設(shè)方法寧波seo推廣推薦
  • 內(nèi)部網(wǎng)站搭建什么是白帽seo
  • 微信上發(fā)的鏈接網(wǎng)站怎么做的新聞?lì)^條今日新聞
  • 網(wǎng)站怎么制作成軟件青島百度網(wǎng)站排名優(yōu)化
  • 用vps做網(wǎng)站的流程三亞百度推廣公司電話
  • 怎么做淘寶網(wǎng)站賺錢技巧百度推廣技巧方法
  • 合肥市城鄉(xiāng)建設(shè)委員會(huì)網(wǎng)站無錫網(wǎng)站排名公司
  • 電子商務(wù)主要干什么seo推廣怎么做
  • 政府網(wǎng)站建設(shè)發(fā)展指引軟文吧
  • 怎樣用eclipse做網(wǎng)站品牌營銷推廣方案怎么做
  • 網(wǎng)站建設(shè)需要會(huì)西安seo外包行者seo
  • 溫州電子商務(wù)網(wǎng)站建設(shè)windows優(yōu)化大師有哪些功能
  • 做網(wǎng)站內(nèi)容來源百度收錄提交網(wǎng)站后多久收錄
  • 宜春網(wǎng)站建設(shè)公司聯(lián)系方式百度seo 站長工具
  • 沈陽百度首頁優(yōu)化安徽seo優(yōu)化規(guī)則
  • 哈爾濱cms網(wǎng)站建設(shè)廣州網(wǎng)站建設(shè)系統(tǒng)
  • 建設(shè)一個(gè)導(dǎo)航網(wǎng)站百度搜索怎么優(yōu)化
  • 添加網(wǎng)站到百度中國十大軟件外包公司
  • 網(wǎng)站logo怎么做透明網(wǎng)絡(luò)運(yùn)營課程培訓(xùn)班
  • 貴州有網(wǎng)站的企業(yè)杭州seo推廣服務(wù)
  • 做網(wǎng)站推廣前途百度問答入口
  • 網(wǎng)頁版企業(yè)郵箱網(wǎng)絡(luò)優(yōu)化的流程
  • 什么網(wǎng)站免費(fèi)建設(shè)全網(wǎng)網(wǎng)站快速排名推廣軟件
  • 做教育機(jī)構(gòu)網(wǎng)站百度收錄提交入口網(wǎng)址
  • 網(wǎng)站服務(wù)器維護(hù)今天nba新聞最新消息
  • 網(wǎng)站上線需要哪些步驟2345電腦版網(wǎng)址導(dǎo)航
  • 怎樣做自己的國外網(wǎng)站網(wǎng)站收錄免費(fèi)咨詢
  • 如何在word上做網(wǎng)站網(wǎng)址房地產(chǎn)最新消息
  • 網(wǎng)絡(luò)公司網(wǎng)站建設(shè)彩鈴樣本軟文推廣文案范文
  • 廣州網(wǎng)站建設(shè) 廣州亦客網(wǎng)絡(luò)網(wǎng)絡(luò)推廣員工作好做嗎