欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

刚刚看了几个推荐框架的帖子,蛮多推荐codeigniter的,请恕我直言,那框架实在不敢恭维啊~个人意见,仅供参考。

程序员文章站 2024-02-03 22:47:58
...
首先我是用过codeigniter的,刚开始学框架的时候用过一阵子,然后后来公司用thinkphp,就没再用了,用了2个之后,就会有一些对比性。首先这2个框架文件夹容量都比较大,称不上轻量级之类的,我都不怎么看好。
今天单说codeigniter框架
举个官网控制器调用模板的例子
load->view('blogview', $data); }}?> 

<?php echo $title;?>



感觉这种模式很不好,难道这就是传说中的控制器模板分离?这种模式只能忽悠刚刚入门的那些PHPer,先不论调用smarty之类的来反驳我,只是说他的自身特性,而且什么框架都能结合smarty来用。

以上的代码用PHP的一个函数就能实现了,请查阅extract函数的用法。

很多用codeigniter的PHPer估计就是冲着所谓写法优美去的,可以用连贯写法-> ->

究其实质,并没有对模板(视图)产生有多大的作用,

只是把变量全部先计算出来,换个名称,再在需要的时候,把新名称填入到所需地方。

然后个人在国外网站闲逛的时候呢,发现一个模板,它和codeigniter的这种模式有很大的相似性。模板名未知,就叫他template吧。你们可以看看,就可以对codeigniter原理有大致的了解吧

它的核心模板代码我写一下
path = $path;	}	/**	 * Set the path to the template files.	 *	 * @param string $path path to template files	 *	 * @return void	 */	function set_path($path) {		$this->path = $path;	}	/**	 * Set a template variable.	 *	 * @param string $name name of the variable to set	 * @param mixed $value the value of the variable	 *	 * @return void	 */	function set($name, $value) {		$this->vars[$name] = $value;	}	/**	 * Open, parse, and return the template file.	 *	 * @param string string the template file name	 *	 * @return string	 */	function fetch($file) {		extract($this->vars);          // Extract the vars to local namespace		ob_start();                    // Start output buffering		include($this->path . $file);  // Include the file		$contents = ob_get_contents(); // Get the contents of the buffer		ob_end_clean();                // End buffering and discard		return $contents;              // Return the contents	}}/** * An extension to Template that provides automatic caching of * template contents. */class CachedTemplate extends Template {	var $cache_id;	var $expire;	var $cached;	/**	 * Constructor.	 *	 * @param string $path path to template files	 * @param string $cache_id unique cache identifier	 * @param int $expire number of seconds the cache will live	 *	 * @return void	 */	function CachedTemplate($path, $cache_id = null, $expire = 900) {		$this->Template($path);		$this->cache_id = $cache_id ? 'cache/' . md5($cache_id) : $cache_id;		$this->expire   = $expire;	}	/**	 * Test to see whether the currently loaded cache_id has a valid	 * corrosponding cache file.	 *	 * @return bool	 */	function is_cached() {		if($this->cached) return true;		// Passed a cache_id?		if(!$this->cache_id) return false;		// Cache file exists?		if(!file_exists($this->cache_id)) return false;		// Can get the time of the file?		if(!($mtime = filemtime($this->cache_id))) return false;		// Cache expired?		if(($mtime + $this->expire) cache_id);			return false;		}		else {			/**			 * Cache the results of this is_cached() call.  Why?  So			 * we don't have to double the overhead for each template.			 * If we didn't cache, it would be hitting the file system			 * twice as much (file_exists() & filemtime() [twice each]).			 */			$this->cached = true;			return true;		}	}	/**	 * This function returns a cached copy of a template (if it exists),	 * otherwise, it parses it as normal and caches the content.	 *	 * @param $file string the template file	 *	 * @return string	 */	function fetch_cache($file) {		if($this->is_cached()) {			$fp = @fopen($this->cache_id, 'r');			$contents = fread($fp, filesize($this->cache_id));			fclose($fp);			return $contents;		}		else {			$contents = $this->fetch($file);			// Write the cache			if($fp = @fopen($this->cache_id, 'w')) {				fwrite($fp, $contents);				fclose($fp);			}			else {				die('Unable to write cache.');			}			return $contents;		}	}}?>


在该核心模板类中,同样用的是extract($this->vars); 函数来拆数组。

我们看他的“控制器”用法
set('title', 'User List');/** * Create a template object for the inner template and set its variables.  The * fetch_user_list() function simply returns an array of users. */$body = & new Template($path);$body->set('user_list', fetch_user_list());/** * Set the fetched template of the inner template to the 'body' variable in * the outer template. */$tpl->set('body', $body->fetch('user_list.tpl.php')); //这个是直接调用模板/** * Echo the results. */echo $tpl->fetch('index.tpl.php');/** * Just a function to simulate the retrieval of a user list. */function fetch_user_list() {	return array(		array('id' => 1,		      'name' => 'bob',			  'email' => 'bob@mozilla.org',			  'banned' => false),		array('id' => 2,		      'name' => 'judy',			  'email' => 'judy@php.net',			  'banned' => false),		array('id' => 3,		      'name' => 'joe',			  'email' => 'joe@opera.com',			  'banned' => false),		array('id' => 4,			  'name' => 'billy',			  'email' => 'billy@wakeside.com',			  'banned' => true),		array('id' => 5,		      'name' => 'eileen',			  'email' => 'eileen@slashdot.org',			  'banned' => false));}?>


set就是赋值了。然后看它的“视图”是怎么输出的,就基本上完全和codeigniter类似了
//index.tpl.php	=$title;?>

=$title;?>

=$body;?>

//user_list.tpl.php
foreach($user_list as $user): ?> endforeach; ?>
Id Name Email Banned
=$user['id'];?> =$user['name'];?> =$user['email'];?> =($user['banned'] ? 'X' : ' ');?>


详细的下载地址: http://download.csdn.net/detail/xjl756425616/3984218


回复讨论(解决方案)

Copyright (c) 2003 ....
十年了!!!

就因为今天第 四月一号 吗?

LZ推荐几个框架呗!~

php amp
你怎么看

Copyright (c) 2003 ....
十年了!!!

就因为今天第 四月一号 吗?


技术跟日期有什么关系?只是觉得和codeigniter的方式很类似~



LZ推荐几个框架呗!~

没什么推荐呀~我就用过那2个,缺乏全面的对比性。

//template.php
/**
* Copyright (c) 2003 Brian E. Lozier (brian@massassi.net)

回复一下

codeigniter 不是模板引擎
既然是框架,当然他也有自己的模板引擎

10年前的东西,过于陈旧了
你不也想着标新立异吗?

4.1 愚人节

php amp
你怎么看

我下载下来先看看

你这个template与ci的有什么不同?
模板说到底,还不是ob+extract?

php amp
你怎么看


看了,没啥好评论的,和那个模板引擎类似

推荐ci,是ci容易上手,模板,不都是差不多么,

其实框架没有对错,看需求.比如我现在公司项目紧急,来的都是新人,能力参差不齐.CI框架就很适合,有框架使用经验的,用这玩意1,2天基本就能上手开发.
不过,局限性也很明显 ...

我个人认为CI还是蛮好的,mvc分工明细,代码简单清晰明了

CI还可以吧,我一直在用也没发现有什么问题。


php amp
你怎么看


看了,没啥好评论的,和那个模板引擎类似

extra 没有什么不对的,因为99%的框架都是这样来进行模板解析的,比如yii2:
public function renderPhpFile($_file_, $_params_ = [])    {        ob_start();        ob_implicit_flush(false);        extract($_params_, EXTR_OVERWRITE);        require($_file_);        return ob_get_clean();    }


有的甚至用 eval(),比如 dedecms。。。。。。。。。。。。。