如何选择PHP项目的开发方案?
我说的项目开发方案并不是谈论到底用不用PHP去开发的问题,而是当你遇到一个项目,已经决定了用PHP,然后才来看的问题:用PHP的什么开发方案。
基本上有这么几种方案。各有各的说法,良莠不齐,我就谈谈我对它们利弊的认识,选择的时候也多个参考。
方案1:基于开源系统
常用的开源系统有:Discuz,PHPWind,PHPMyWind,PHPCMS,DedeCMS,Ecshop系列等。
这种方式是最偷懒的,也是初学者的首选。因为一个初学者或者不学技术的人也能在分分钟之内依葫芦画瓢的搭建出一个系统。
但有技术和没有技术的区别在于后续能不能按需去修改,去扩展功能,去写插件,去深度二次开发......
很多人总认为这种方案是最容易的,但随着项目的不断出现的新需求,这样的方式就暴露出了很大的局限在后面。比如你用Discuz做了一个论坛,当你想添加一个系统中并没有事先开发的功能时就麻烦了,你很有可能需要开发插件,或者深度二次开发。
这就不是初学水平能胜任的,而是要高级水平才能自由的修改它,否则会遇到很多莫名其妙的情况。因为它就不只是需要添加新模板,甚至需要添加控制器和数据库的底层操作,需要伤筋动骨了。通常麻烦会大到你想撞墙以至于不想干的地步,如果你基础不够,此时你一定会陷入困扰之中。
所以,网上有很多这种方案开发的项目,后续的升级都变得很是困扰,甚至多年都不敢升级。
但不能因此就说这些系统没有意义,至少它给你“入门”了。否则一个新手就连搭建个系统都成问题,也会大大的影响学习的积极性和自信心。
方案2:基于某框架
这需要一定的PHP功底了。这种层次需要你自己开发控制器,Model,View层,需要自己设计数据库,需要懂面向对象编程思想。所以说需要一定的基础。
框架有:TP框架,Laravel框架,YII框架,CI框架等等。也是各有各的特点。没有最好的,只有更好的。
不要迷信某种框架!
如果你能使用这种方式来开发出项目,说明你有PHP基础,甚至有点水平了。同时比如控制器是你自己开发的,你就可以很方便的去修改某个功能和添加某个功能。
比如给用户添加一个留言的模块,一个微信支付的模块,一个在线视频的模块,就变得很容易。
这种方式的缺陷就是:一开始开发出一个系统就比较麻烦。基础不到位,你可能寸步难行,开发好久,系统都不能正常运营起来。
同时如果某个框架底层实现有问题或者太啰嗦,你不好修改。只有等到作者下一次的升级,或者你更换其他的框架。
所以选择这种方案需要一定的冒险,需要有实力去支撑。
方案3:直接开发项目,但都是用基础知识。
比如全是用PHP的函数去堆叠,一通的include,也没有模板解析引擎,也不做单入口,也没采用MVC,也不使用面向对象。
这种项目虽然最后开发出来了(而且很有可能开发的出来,因为就是搭积木的方式堆出来的),但维护起来麻烦,同时也没移植性可言。
每次开发一个新的项目都一样的工作量,每次也都像脱一层皮。
速度和效率都慢,不值得提倡。
方案4:直接开发项目,同时使用了更高级的知识如MVC的措施,面向对象思想。
这种方式虽然开发出的项目,同时维护起来比上述基础开发要容易。但是同样没有移植性可言。也不值得提倡。
方案5:自定义框架,在自定义框架上开发具体项目。
自己先用面向对象、MVC、单入口等开发个自定义的框架,然后在自己的框架之上开发具体项目。
这样的方式很好,好的地方就是你的底层可以自由的修改,不用等别人来升级什么的。
但是难度比较大。不适合一般的新手。
方案6:自定义框架,在自定义框架上开发通用系统,在通用系统上开发项目。
这样的方式很好,好的地方就是不但你的底层可以自由的修改,同时你的通用项目功能也可以随时升级。
但是难度是最大的,要求你对整个PHP体系有深刻的了解,同时开发过很多的项目,懂得要怎么才能优化系统,才能开发出实用的自定义框架和自适应通用系统。
这种方式不但具有方便的维护性,同时具有很好的可移植性。同时你可以根据需要随时升级底层和通用系统层,让它为你的所有项目做最好的服务。
值得提倡,但你如果不先脱几层皮,你是做不到的这种方案的。
开发的项目注意事项:
1:项目升级不要随意跟风,也不要动不动就升级,除非有硬性需求;
一些基础不够的人,自然没有全面的认识。看到有新的语法了,就想马上去用。总感觉既然有新的了,那就要用新的,这才合理,而不顾他自己的项目的情况,升级麻烦与否,技术力量跟得上与否,开发时间大概要多少。建议这些人自己去做一下再说。
因为很多技术负责人是那种只会说而不会写的技术部管家...盲目的瞎指挥会让你的技术团队饱受摧残,很多的时候都费力不讨好。
2:不要乱更换开发方案,除非你能把控的了;
比如:今天用Discuz开发了,但是发现一个能开发不了了,明天就换用PHPCMS,遇到了问题又更换为TP开发,再更换为Laravel去开发。
至于为什么要更换那种新的开发方案,也说不出个所以然,只是看网上别人说好就去改......古代剑道高手,基本上都是手中无剑,哪怕用的是一根棍子也能打败那种手持宝岛的不学无术之徒。所以,自己用的好,才是真的好。更换一个新的方案,除非你能把控的了。
3:在开发之前,选择好开发方案尤为重要。否则很可能走不下去,或者从头再来。浪费在不停的选择上......
如何选择PHP项目的开发方案?的更多相关文章
- 【多端应用开发系列0.0.0——之总序】xy多端应用开发方案定制
[目录] 0.0.0 [多端应用开发系列之总序]服务器Json数据处理——Json数据概述 0.0.0 [因] 正在学习多客户端应用开发,挖个坑,把所用到的技术方案,用最简单直白的语言描述出来,写成一 ...
- 基于Cmake+QT+VS的C++项目构建开发编译简明教程
目录 一.工具下载与安装 1. Qt 2. Visual Studio 2015 3. Cmake 二.C++及Qt项目构建 1. 基于VS构建Qt项目 2. ...
- 熟悉使用Github,VS进行项目的开发(第二次作业)
git地址 https://github.com/Jason98w git用户名 Jason98w 学号后5位 72323 博客地址 https://www.cnblogs.com/jason5689 ...
- Git项目协同开发学习笔记2:项目库开发协作相关命令
之前介绍了如何用git构建项目库及其后续操作的问题,但主要还是个人的操作问题,不太涉及到项目协作方面的问题,所以来说下这块.传送门在这里(后面的可以不用看了). 1.同步 首先就式同步问题:在项目协作 ...
- Unit05: WEB项目的开发模式 、转发 和 Unit09: EL、JSTL
Unit05: WEB项目的开发模式 .转发 和 Unit09: EL.JSTL dao package dao; import java.io.Serializable; import jav ...
- maven(多个模块)项目 部署 开发环境 问题处理历程【异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE】
maven(多个模块)项目 部署 开发环境 问题处理历程[异常Name jdbc is not bound in this Context 异常java.lang.NoSuchMethodE] 201 ...
- vue项目的开发
vue项目的开发 我们已经通过命令行创建了一个vue项目,并且打开了这个项目.下面是这个文件的src文件夹,这个文件夹放了整个项目的核心代码. 一.vue文件的用处简介. 1.assets文件夹,用来 ...
- 使用requirejs+vue 打造 无需编译发布便捷修改调整的模块开发方案 (一)
前言 不知道大家有没有这种感觉,现在流行的很多前端技术,基本上都基于webpack编译,当然不是说这种方案不好,在标准的开发流程运行中,这种方式其实也挺不错,管理方便,代码统一. 痛点:项目不是单独针 ...
- 基于maven的javaweb项目模块化开发
转自:https://my.oschina.net/kingfire/blog/273381 基于maven的javaweb项目模块化开发 引言 考虑团队拥有多个类似项目的情况,比如一些功能差异不大的 ...
随机推荐
- svn 不能校验路径“XXX”的锁;没有匹配的可用锁令牌 故障解决方法
原文出自:https://blog.csdn.net/seesun2012 故障现象: svn Commit ,失败,提示: 不能校验路径"/SEESUN/****系统计划说明书.docx& ...
- CORS跨域请求C#版
1.什么是跨域请求: 当从A网站使用AJAX请求B网站时,就会出现跨域请求. 此时B网站能够接收到A网站发来的请求并返回相应的结果,但是浏览器拿到B网站返回的数据时检测到与当前网站的域名不同,出于安 ...
- Heka 的编译
Heka是Mozilla开源的,基于Go语言实现的,插件式log收集和分析系统. 已经编译好的 release 版本可以在下面地址下载: https://github.com/mozilla-serv ...
- ES6,先知道这些必会的才行
变量声明 const 和 let 不要用 var,而是用 const 和 let,分别表示常量和变量.不同于 var 的函数作用域,const 和 let 都是块级作用域. const DELAY = ...
- H5,API的pushState(),replaceState()和popstate()用法
pushState和replaceState是H5的API中新添加的两个方法.通过window.history方法来对浏览器历史记录的读写. pushState和replaceState 在 HTML ...
- VS code 自定义快捷输入
本文是从简书复制的, markdown语法可能有些出入, 想看"正版"和更多内容请关注 简书: 小贤笔记 位置 ctrl+shift+p 搜索: snippets 输入类型: 比如 ...
- QLocalServer和QLocalSocket单进程和进程通信
QLocalServer 继承自QObject. QLocalServer提供了一个基于本地套接字(socket)的服务端(server).QLocalServer可以接受来自本地socket的连接. ...
- jquery事件绑定函数
1.bind 使用语法: jQueryObject.bind( events [, data ], handler ) jQueryObject.bind( events [, data ] [, i ...
- redis复制+Sentinel搭建
1:实验环境 测试环境两台: master:172.16.16.34 slave:172.16.16.35 redis版本:redis3.2 要搭建的环境是,redis简单主从复制 2:安装redis ...
- Routing Manager for WCF4 z
http://www.codeproject.com/Articles/77198/Routing-Manager-for-WCF Download source Contents Features ...