PHP는 tp를 모방하여 mvc 프레임워크의 기본 디자인 아이디어와 구현 방법을 구현합니다.
这篇文章主要介绍了PHP仿tp实现mvc框架基本设计思路与实现方法,简单讲述了php实现tp框架的原理,并结合实例形式分析了相关控制器、视图及URL访问操作技巧与注意事项,需要的朋友可以参考下
本文实例讲述了PHP仿tp实现mvc框架基本设计思路与实现方法。分享给大家供大家参考,具体如下:
仿tp mvc基本设计与简单实现
一:文件加载常识
变量 常量 函数 类
文件加载的函数或者使用命名空间:require();
require_once();
include();
include_once();
常量:define("DEFINE","");
const constant = "value";
函数:function fun(){}
// global 使用全局变量 局部变量不被外部调用。
类:
<?php class A{ public $a = 10; public function aa(){ // 不能使用一个a是因为,new A 之后 方法a会被自动执行,所以方法名不可以和类名冲突。 echo $this->a; // 输出属性. } public function __construct(){ // 构造方法,实例化后自动执行, echo $this->bb(); // 调用方法。 } public function bb(){ echo "我是bb"; } } $a = new A; $a->aa(); class B extends A{ // 继承 A ,类A是类B的父级。继承public的, } $b = new B; $b->aa(); // 可以输出类A里面的属性。
工厂模式参阅:http://www.jb51.net/article/140658.htm
//-----------------------------工厂模式-------------------------// class A{ public $class; // public $class = $_GET['c']; //类名 public $method; // public $method = $_GET['m']; //方法 public function __construct($class,$method){ // 或者通过 $_SERVER['PATH_INFO']; 转换得到类名或者方法名(下面讲解)。 $this->class = ucfirst(strtolower($class)).'Controller'; //对类名进行安全处理,并加上控制器后缀 $this->method = strtolower($method); //对方法名进行安全处理 $this->work($this->class,$this->method); } public function work($class,$method){ // 把文件命名成 (类名.class.php的形式),就可以通过类名找到文件。 //include '文件名(文件在别的地方)'; #例如 include './index.php'; 引入文件然后实例化类。 $c = new $class; //实例化类 $c->$method(); //访问类的方法 } }
至此我们可以通过url的 $_GET 参数来解决
例如:http://mvc.com/index.php?h=home&v=Index&c=index.html
h为前后台,v为控制器,c为模板。
$v = $_GET['v']; $c = rtrim($_GET['c'],".html"); new A($v,$c); // 根据继承关系再次加载文件。 // extract($arr); //extract 的作用:从数组中将变量导入到当前的符号表,键做变量,值做值! // compact(); // — 建立一个数组,包括变量名和它们的值 // assign display 实现参阅:http://www.jb51.net/article/140661.htm
class Controller{ public $array; public $key; public $val; public function assign($key,$val){ if(array($val)){ $this->array["$key"] = $val; }else{ $this->array["$key"] = compact($val); } } public function display($tpl = ''){ // 模板为空自动加载。 $this->assign($this->key,$this->val); extract($this->array); // 如果模板为空就在这里根据get参数添加或者通过 $_SERVER['PATH_INFO']; 转换得到。(下面讲解) if(file_exists($tpl)){ //模板存在就加载文件。 include $tpl; } } } //继承总model。这个model名字和控制器model的名字是一样的。继承方法同Controller,总model必须需要加上一个return。数据处理的indexmodel可以加return,也可以不加。 class IndexModel extends Model{ public function index(){ // 数据处理。 // 需要返回数据就加上return。 } } class IndexController extends Controller{ // 继承 public function index(){ $m = Model("index"); echo '实例化后的index方法<br>'; $this->assign('m',$m); // 分配数据。 $this->display('index.html'); // 模板 } }
mvc虽然实现但是不够人性化,因为每次都要加上get参数,变得很冗长,解决的关键在于$_SERVER['PATH_INFO'];
用这个替换掉h m v三个参数。
1. 当输入url为:http://mvc.com/index.php/home/index/index.html
这种情况下 index.php 斜线后面的apache会自动认为是一个路径。
$_SERVER['PATH_INFO'] = /home/index/index.html
第1个斜线 /home 前后台
第2个斜线 /index 控制器
第3个斜线 /index.html 模板文件
如果后面加有参数例如:?a=18&b=38 他不会被加到$_SERVER['PATH_INFO']里面。$_POST 或者 $_GET 也不会加入$_SERVER['PATH_INFO']里面的内容,这样就可以让控制参数和数据的参数互不冲突。
2. U 方法的实现。重新改写$_SERVER['PATH_INFO']
参数,改变为一个数据。array( 'home', 'Index', 'index');
每次进入入口文件index.php都把他的PHP_INFO参数转换为数组,在控制器或者其他的地方只要调用这个参数就行了。
// 这里如果做了大小写的转换,总控制器里面就不用了。 function bca(){ $arr = explode('/',ltrim($_SERVER['PATH_INFO'],'/')); if(count($arr) == 3){ $arr[0] = strtolower($arr[0]); $arr[1] = ucfirst(strtolower($arr[1])); // 判断后缀是不是 .html if(substr($arr[2],-5,strlen($arr[2])) == '.html'){ $a = explode('.',$arr['2']); $arr[2] = strtolower($a[0]); }else{ $arr[2] = strtolower($arr[2]); } $_SERVER['PATH_INFO'] = $arr; } } // url方法做控制器或前后台的跳转。第三个参数是输出还是return。默认是直接输出。 function U($string = '',$method = '',$bool = true){ // true 是直接输出或者返回, // 获取系统变量。 $path_info = $_SERVER['PATH_INFO']; $script_name = $_SERVER['SCRIPT_NAME']; // 判断中间有没有 / 以确定参数个数。 if(strpos($string,'/')){ $arr = explode('/',$string); if(count($arr) == 2){ // 两个参数的情况。 $arr[0] = ucfirst(strtolower($arr[0])); $arr[1] = strtolower($arr[1]); $url = "/{$path_info[0]}/{$arr[0]}/{$arr[1]}.html"; }else if(count($arr) == 3){ // 三个参数的情况。 $arr[0] = strtolower($arr[0]); $arr[1] = ucfirst(strtolower($arr[1])); $arr[2] = strtolower($arr[2]); $url = "/{$arr[0]}/{$arr[1]}/{$arr[2]}.html"; } }else{ $arr = strtolower($string); // 一个参数的情况。 $url = "/{$path_info[0]}/{$path_info[1]}/{$arr}.html"; } // url 路径的拼接。 if($method != ''){ $u = $script_name.$url.'?'.$method; if($bool == true){ echo $u; }else{ return $u; } }else{ $u = $script_name.$url; if($bool == true){ echo $u; }else{ return $u; } } }
3. url重写,去掉 index.php
打开apache配置文件重写模块,LoadModule rewrite_module modules/mod_rewrite.so
根下加入的改写文件 .htaccess
内容:
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
在浏览器输入url:http://mvc.com/home/index/index.html?a=19b=38
[REDIRECT_STATUS] => 200 重写状态ok。
发现 $_SERVER['REDIRECT_URL'];
和 $_SERVER['PATH_INFO'];
参数相同。所以参数后面就可以去掉index.php这安全的问题。
4. 模板替换(思路)
我们会发现有一个我们书写的模板,里面有 {$arr}
5. 数据缓存(思路)
json_encode()
json_decode()
file_get_contents()
file_put_contents();
unserialize();
serialize();
等存文文件里面或者memcache redis 等存储。
相关推荐:
위 내용은 PHP는 tp를 모방하여 mvc 프레임워크의 기본 디자인 아이디어와 구현 방법을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

CakePHP는 오픈 소스 MVC 프레임워크입니다. 이를 통해 애플리케이션 개발, 배포 및 유지 관리가 훨씬 쉬워집니다. CakePHP에는 가장 일반적인 작업의 과부하를 줄이기 위한 여러 라이브러리가 있습니다.

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다
