论坛首页 编程语言技术论坛

PHP程序员是否应该使用自己写的框架

浏览 18762 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (5)
作者 正文
   发表时间:2012-05-05  
   从上面大量的回复来看,很多人还是选择了自己写框架来做平时生产环境的开发工具。但是似乎大部分人也都表明了自己并没有认真的去学习那些开放框架。
    那些选择自己编写框架的人给出的理由更多都是说开放框架太复杂、理解起来有难度等等。但是如果你自己的框架在使用中慢慢扩展增大,对于后来新进者是否也变得太复杂、理解起来有难度了呢。而且这样的框架文档难道就会很完善吗?一旦你作为创建者从公司离职,后续的人员如何来继续维护呢?
    我始终推崇开放框架的原因是
    第一点:框架实现了需要约束,统一了项目中所有人开发的模式和方法。
    第二点:这些框架是对外开放的,任何人可以在进入公司前都学习熟悉。而且这样的框架因为是对外开放的,不论这个公司里任何人离职,框架还在发展,文档在完善,版本在升级,BUG在修复。
    很多写自己框架给公司使用的人,如果你是老板那没有什么,如果是员工那么也许更多是为了获得主动权,让公司无法离开自己。
    上面写的话也许有些小人之心了。希望不要有人介意。
0 请登录后投票
   发表时间:2012-05-06  
dank 写道
   从上面大量的回复来看,很多人还是选择了自己写框架来做平时生产环境的开发工具。但是似乎大部分人也都表明了自己并没有认真的去学习那些开放框架。
    那些选择自己编写框架的人给出的理由更多都是说开放框架太复杂、理解起来有难度等等。但是如果你自己的框架在使用中慢慢扩展增大,对于后来新进者是否也变得太复杂、理解起来有难度了呢。而且这样的框架文档难道就会很完善吗?一旦你作为创建者从公司离职,后续的人员如何来继续维护呢?


呵呵,我们是讨论问题的,当然是谁都可以发表自己的观点,而观点对错不重要,重要的是交流.

我相信每一个自己写框架的人,都至少去研究了现有框架的不好的地方,而这些不好的地方正好是自己所特别关心的问题,所以就自己写了.
比如我也是自己写框架自己用的(等到基本完整了,会开源出来的,事实上已经在github上建立了项目了).
我之所以自己写,就是发现有一下几点让我不得不自己写:

  1. 平台版本
    很多框架为了兼容平台和php版本问题,采用了很多老旧过时低效率的代码,长远来看,那些老旧的代码根本没有存在的意义,比如PHP新版本的一些特性没有被使用
    别说空间用户无法控制php版本问题,我们还有很多非空间(VPS,独立服务器)用户要支持
  2. 数据库封装
    其实我们用的最多的都可以用扩展PDO完成,但是很多代码都是过度的封装,比如大量的把返回数据fetchAll了,其实PDOStatement本身是支持foreach遍历数据的.
    我也是经过很长时间才发现我以前写的数据库操作是不合理的,帖上我最新写的PDO封装
    <?php
    namespace Jaf;
    /**
     * 基本的PDO封装
     * 返回结果有两种值
     * false 		失败
     * PDOStatement 原生对象
     * 注意默认遇到问题抛出异常,析构提交未提交的数据
     */
    class PDO_Base extends \PDO implements PDO_Interface {
    	/**
    	 * 构造
    	 * 默认属性:
    	 * FETCH_MODE	= FETCH_ASSOC | FETCH_NAMED
    	 * CURSOR		= CURSOR_FWDONLY
    	 * ERRMODE		= ERRMODE_EXCEPTION
    	 * NAMES		= UTF8
    	 */
    	function __construct($dsn, $username, $password, array $options =[]){
    		parent::__construct($dsn, $username, $password,$options);
    		parent::setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE,\PDO::FETCH_ASSOC | \PDO::FETCH_NAMED);
    		parent::setAttribute(\PDO::ATTR_CURSOR ,\PDO::CURSOR_FWDONLY);
    		parent::setAttribute(\PDO::ATTR_ERRMODE ,\PDO::ERRMODE_EXCEPTION);
    		//设置字符集
    		parent::exec("SET NAMES 'UTF8'");
    	}
    	/**
    	 * 析构
    	 */
    	function __destruct(){
    		$this->autoCommit();
    	}
    	/**
    	 * 没有错误发生并且有事务时自动提交
    	 */
    	protected function autoCommit(){
    		if(parent::inTransaction() and parent::errorCode()==0)
    			return $this->commit();
    	}
    	/**
    	 * Prepare 并 Execute SQL 语句
    	 * @param string $sql 要执行的 SQL 语句
    	 * @param array $inputParameters 参数
    	 */
    	protected function execute($sql, array $inputParameters=[]){
    		$stmt = parent::prepare($sql);
    		if (!$stmt) return false;
    		if(!$stmt->execute($inputParameters)) return false;
    		return $stmt;
    	}
    
    	/**
    	 * 读操作
    	 * @param string $sql SQL语句
    	 * @param array $inputParameters SQL语句传入的参数
    	 * @param boolean $single 返回单条数据
    	 * @return mixed false | PDOStatement
    	 */
    	public function read($sql,array $inputParameters=[],$single=false){
    		$stmt = $this->execute($sql,$inputParameters);
    		if( $single and $stmt ) return $stmt->fetch();
    		return $stmt;
    	}	
    	/**
    	 * 写操作
    	 * @return mixed false | 影响的记录数
    	 */
    	public function write($sql,array $inputParameters=[]){
    		$stmt=$this->execute($sql,$inputParameters);
    		if(!$stmt) return false;
    		return $stmt->rowCount();
    	}
    	/**
    	 * insert
    	 * @param array $values 要插入的数据
    	 * @param mixed $lastInsertId @see lastInsertId
    	 */
    	public function insert($into,array $values,$lastInsertId){
    		if(!$values) return false;
    		$f=implode('`,`',array_keys($values));
    		$vs=implode(',:',array_keys($values));
    		$sql="INSERT INTO `$into` (`$f`) VALUES (:$vs)";
    		$re = $this->write($sql,$values);
    		if ($re and $lastInsertId)
    			return $this->lastInsertId($lastInsertId);
    		return $re;
    	}
    	/**
    	 * update
    	 * @param string $into 表名
    	 * @param string $where 完整的 where 字句1
    	 * @param array $values 要更新的数据
    	 * @param array $merge 附加的数据
    	 * @return mixed 影响的记录数
    	 */
    	public function update($into,$where,array $values=array(),array $merge=array()){
    		$f='';
    		foreach($values as $key=>$val){
    			if(''==$f)
    				$f.="`$key`=:$key";
    			else
    				$f.=",`$key`=:$key";
    		}
    		$sql="UPDATE `$into` SET $f $where;";
    		return $this->write($sql,array_merge($values,$merge));
    	}
    	/**
    	 * delete
    	 * @param string $from 表名
    	 * @param string $where 完整的 where 字句2
    	 * @param array $values where 对应的参数数据
    	 * @return mixed 影响的记录数
    	 */
    	public function delete($from,$where,array $values=array()){
    		if(!is_string($where)) {
    			return false;
    		}
    		$sql="DELETE FROM `$from` $where;";
    		return $this->write($sql,$values);
    	}
    	/**
    	 * lastInsertId
    	 * @param mixed $name 如果是字符串表示字段名
    	 */
    	public function lastInsertId($seqname = NULL){
    		return parent::lastInsertId($seqname);
    	}
    	/**
    	 * 按条件统计表中的记录数
    	 * @param string $from 表名
    	 * @param string $where 完整的 where 字句3
    	 * @param array $values where 对应的参数数据
    	 */
    	public function count($from,$where,array $values){
    		if($where) $where ='WHERE '.$where;
    		$sql = "SELECT count(*) as cnt FROM `$from` $where;";
    		$stmt=$this->execute($sql,$values);
    		if(!$stmt) return false;
    		return $stmt->fetch()['cnt']+0;
    	}
    	/**
    	 * 安全开启事务
    	 */
    	public function beginTransaction(){
    		if(parent::inTransaction()) return false;
    		return parent::beginTransaction();
    	}
    }
    
  3. 视图
    现在仍然有大量的框架用smarty这样的模版引擎作为视图操作,我也是有过写模版引擎的.后来发现这根本就是多余的,因为PHP天生就是一个模版引擎,我们只需要封装一些逻辑控制就可以了
  4. 目录深度
    很多框架的目录深度太深了,WEB开发,我真的需要一个扁平的简单框架目录管理结构,扁平的目的一个是为了清晰的了解类关系.另一个是强制自己对类关系进行最简化的规划,最终达到简洁的目标
  5. 轻量
    是的,如果框架够简洁,类关系够简单,目录不深,我相信就够轻量,轻量不等于功能弱,一个轻量的框架总是容易理解和维护的

 

 

0 请登录后投票
   发表时间:2012-05-06  
選方案的時候要考慮團隊的能力的。
0 请登录后投票
   发表时间:2012-05-06  
windywany 写道
个人认为使用框架就二个目的:

1.约束与规范:人员流动不可避免,如果代码不规范,程序员想怎么写就怎么写,这必定不是一个团队需要的。
2.快速与便捷:人都很懒,不是么。

大部分自己写框架的人(为了提高自身编程能力的不算),都是不愿意学习别人框架的人。

個人認為框架是將經常重複的結構和模式整理起來重複使用。
0 请登录后投票
   发表时间:2012-05-06   最后修改:2012-05-07
写道
很多写自己框架给公司使用的人,如果你是老板那没有什么,如果是员工那么也许更多是为了获得主动权,让公司无法离开自己。

 

无话可说 。。。

 

lz 根本不是想去解决问题。。。

 

鄙视你

 

0 请登录后投票
   发表时间:2012-05-06  
vb2005xu 写道
写道
很多写自己框架给公司使用的人,如果你是老板那没有什么,如果是员工那么也许更多是为了获得主动权,让公司无法离开自己。

 

无话可说 。。。

 

lz 根本不是想去解决问题。。。

 

鄙视你 的人品

 

小人

呵呵,是啊,我承认自己人品不怎么好的。所以公司开发以及自己做项目我都尽量使用了开放框架,如果发现框架有问题也是尽量去对框架做改进来满足需要。

0 请登录后投票
   发表时间:2012-05-07  
支持楼主,想问题想得比较多
0 请登录后投票
   发表时间:2012-10-25  
简单好用就成了,像CI,ThinkPHP,都还OK吧~CI用过,ThinkPHP没有用过~~呵呵
:)
其实都是自己整的~

写得多了,总结下,慢慢的,框架也就出来了~狂汗
0 请登录后投票
   发表时间:2012-11-22   最后修改:2013-03-20
把一个框架用熟悉你看看要多少时间。
自己写一个框架再看看要花多少时间。
如果花得起这个时间可以自己写。
但是相信不管你再牛,如果你一个人写,可能要好好想一想,所花的时间和这个框架的质量到底合不合算。
如果是现有的一些开源框架有不足的地方,为什么不直接参与去修正而去重复造轮子。
0 请登录后投票
   发表时间:2013-03-04   最后修改:2013-03-18
有必要自己去写一个框架吗?

如果开发主管导致招不到人了,这样的主管就不合格。

现在开源的东西如此多,随便从哪一个中间提取出来就是一个框架了。

哎,不想看到别人走弯路。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics