【PHP】MVC框架为什么这么难! 4年后终于明白了,被ThinkPHP害得
这个帖子送给那些被ThinkPHP命名搞得晕头转向的PHP程序员~(by default7#zbphp.com)
4年前我的几个帖子
帖子1 《 跟别人争论PHP中MVC的问题》 http://bbs.csdn.net/topics/350216861
发表于: 2010-12-10 22:38:53
其实这个帖子当时是使用ThinkPHP,但是运行极为缓慢,且网址怎么都对不上,最后放弃了使用MVC框架!
帖子2 《 貌似突然理解了MVC模型》 http://bbs.csdn.net/topics/390332774
发表于: 2012-12-29 16:47:22
这个帖子里面对MVC的理解其错误的,那种方法是工厂模式,并非MVC模式。
PHP MVC真心折磨人啊!!!~
MVC 是Model View Controller的缩写,是一种程序设计方式。可我虽然工作已经有五六年,一直做PHP程序员,但是始终没用过MVC框架更一直被MVC搞的晕头转向。国内MVC框架基本上都是ThinkPHP,很多次找工作,因为不会MVC,因为不用ThinkPHP框架,所以一直碰壁,越来越迷惑 怀疑 不解 抑郁。
这一次再次硬着头皮去理解掌握的心态,重新阅读ThinkPHP框架的官网资料,不过还是很遗憾,网址对应这里仍旧没看懂,越看越晕。不是说MVC吗, 为什么没有Controller类? 为什么会出现一个Action类?“ 控制器”怎么不见了,但是却有一个“Action”? 为什么有“网址参数a”和“参数m”? “参数a”是不是指代“Action类”?“参数m”是不是指代“Model类”??
ThinkPHP 为什么会这么难
<?php//文件地址:D:\zbphp.com\www\Lib\Action\MemberAction.class.phpclass MemberAction extends Action { public function index(){ $this->display(); } public function login(){ $this->display(); } public function register(){ $this->display(); }}
每次看到ThinkPHP引以为傲的路由网址,就觉得晕!index.php?a=&m=,看到这样的网址,心里就会想“参数a的值”应该是指代“Action类”吧,那数“参数m”应该是指代MVC中的Model吧(模型)?
但是又觉得哪里不对。
Action是动作的意思,MVC是Model View Controller,那么为什么没有看到Controller类?后来仔细看,原来Action在ThinkPHP中就是控制器(但为什么要命名为Action??为什么不直接命名为Controller??)
再来说参数m,一开始理解就是Model类吧。但是更觉得奇怪,比如访问 index.php?a=index&m=content ,那按照这样的思路访问的就是 class IndexAction 下面的 content() 方法,不过很遗憾,错了。他访问的是 class ContentAction 下面的 index()方法。。。
到了这里,你就会明白了为什么ThinkPHP框架会这么难会这么复杂, 因为他用了极容易混淆的方式来命名关键部分。
害人不浅的ThinkPHP
写到这里我真的忍不住想说ThinkPHP害人不浅,命名上弄出了
1) 网址参数a和类中的Action;
2) 网址参数m 和类中的Model;
3) 是MVC框架但却用Action类来表示Controller;
由于这三点让绝大多数想弄明白MVC的PHP程序员每次看都是一头雾水!
如果ThinkPHP 这样写,大部分人会立即明白MVC架构
<?php//文件 D:\zbphp.com\www\Lib\Controller\MemberController.class.phpclass MemberController extends Controller { //访问地址 index.php?c=Member&a=index public function indexAction(){ $this->display(); } //访问地址 index.php?c=Member&a=login public function loginAction(){ $this->display(); } //访问地址 index.php?c=Member&a=register public function registerAction(){ $this->display(); }}
写在最后
最新消息,ThinkPHP 最新版本3.2.x 改正了这几点,Action类改名为Controller。网址中m参数改成了c参,变得直观易懂!
最后感言:几年来一直被MVC困扰,越是去研究ThinkPHP越是觉得一头雾水。一路走来,一路错,还好坚持了,不然真的被搞得彻底放弃了。(欢迎交流 by default7#zbphp.com)
回复讨论(解决方案)
大神 怎么看待zf啊
称为 Action 而不是 Controller 是有道理的
Action 基类 完成了 Controller 的工作
而派生于 Action 的类完成的是 Model (业务模型)的工作
而 Model 类只是数据表的映射
其实认真看一下开发手册就都知道了,何苦要花4年时间?
愿楼主珍重
愿楼主珍重
谢谢!
称为 Action 而不是 Controller 是有道理的
Action 基类 完成了 Controller 的工作
而派生于 Action 的类完成的是 Model (业务模型)的工作
而 Model 类只是数据表的映射
其实认真看一下开发手册就都知道了,何苦要花4年时间?
学习了,原来如此。不过如果命名为Controller确实好理解一下。一开始就把m a 往Action.Class 和Model.class上想,所以导致一直都搞不懂ThinkPHP mvc。
有这么难理解吗?
?然菊花一?,但是我?是???主?於通?而感到欣慰。
???短不要?,重要的是你?於悟出?了
思想和框架是两个东西,思想要有,框架不一定要用。
一直觉得ThinkPHP是工厂模式。
主要还是因为,thinkphp是“借鉴”SSH,在SSH里面的MVC就是这样命名的。
主要还是因为,thinkphp是“借鉴”SSH,在SSH里面的MVC就是这样命名的。
今天重新看了一遍,大概的看懂了。不过分布式构架、HTTPSQS、sphinx 这些没用过。
电脑配置太低了,装IDE都CPU 100%
你搞错了,thinkphp 2.x 也就是你说的什么action的,是最清晰的,代码也是最易懂得
现在的thinkphp 3.x,反而变得复杂不易懂了。
一直觉得ThinkPHP是工厂模式。
为啥这么觉得!
其实地址中的m是模块module a是方法action
模块和方法同时定位某个控制器方法,所以说module+action=controller 即地址中m+a=c
而MVC中的m是模型model ,不能用地址来调用,必须系统内部调用的...
你要怪得怪模块和模型的英文都是m开头产生了混淆...
这样说应该清楚明白了:
mvc = model + view + controller
controller = module + action
确实很多东西需要悟
这样子搞 。让我们新手怎么活呢?

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

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

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

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

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

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

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

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

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

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

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.
