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

狄默默斯基 2013-04-01 10:36:03
首先我是用过codeigniter的,刚开始学框架的时候用过一阵子,然后后来公司用thinkphp,就没再用了,用了2个之后,就会有一些对比性。首先这2个框架文件夹容量都比较大,称不上轻量级之类的,我都不怎么看好。
今天单说codeigniter框架
举个官网控制器调用模板的例子
<?php
class Blog extends CI_Controller {

function index()
{
$data['title'] = "My Real Title";
$data['heading'] = "My Real Heading";

$this->load->view('blogview', $data);
}
}
?>

<html>
<head>
<title><?php echo $title;?></title>
</head>
<body>
<h1><?php echo $heading;?></h1>
</body>
</html>


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

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

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

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

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

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

它的核心模板代码我写一下
<?php
//template.php
/**
* Copyright (c) 2003 Brian E. Lozier (brian@massassi.net)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/

class Template {
var $vars; /// Holds all the template variables
var $path; /// Path to the templates

/**
* Constructor
*
* @param string $path the path to the templates
*
* @return void
*/
function Template($path = null) {
$this->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) < time()) {
@unlink($this->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); 函数来拆数组。

我们看他的“控制器”用法
<?php
//user_list.php
require_once('template.php');

/**
* This variable holds the file system path to all our template files.
*/
$path = './templates/';

/**
* Create a template object for the outer template and set its variables.
*/
$tpl = & new Template($path);
$tpl->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
<html>
<head>
<title><?=$title;?></title>
</head>

<body>

<h2><?=$title;?></h2>

<?=$body;?>

</body>
</html>


//user_list.tpl.php
<table>
<tr>
<th>Id</th>
<th>Name</th>
<th>Email</th>
<th>Banned</th>
</tr>
<? foreach($user_list as $user): ?>
<tr>
<td align="center"><?=$user['id'];?></td>
<td><?=$user['name'];?></td>
<td><a href="mailto:<?=$user['email'];?>"><?=$user['email'];?></a></td>
<td align="center"><?=($user['banned'] ? 'X' : ' ');?></td>
</tr>
<? endforeach; ?>
</table>


详细的下载地址:http://download.csdn.net/detail/xjl756425616/3984218
...全文
609 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 9 楼 xjl756425616 的回复:
[quote=引用 3 楼 ci1699 的回复:] php amp 你怎么看
看了,没啥好评论的,和那个模板引擎类似[/quote] 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。。。。。。。。。。。。。
勤奋的FY 2013-11-02
  • 打赏
  • 举报
回复
CI还可以吧,我一直在用也没发现有什么问题。
yunprince 2013-04-01
  • 打赏
  • 举报
回复
推荐ci,是ci容易上手,模板,不都是差不多么,
狄默默斯基 2013-04-01
  • 打赏
  • 举报
回复
引用 3 楼 ci1699 的回复:
php amp 你怎么看
看了,没啥好评论的,和那个模板引擎类似
床上等您 2013-04-01
  • 打赏
  • 举报
回复
你这个template与ci的有什么不同? 模板说到底,还不是ob+extract?
狄默默斯基 2013-04-01
  • 打赏
  • 举报
回复
引用 3 楼 ci1699 的回复:
php amp 你怎么看
我下载下来先看看
xuzuning 2013-04-01
  • 打赏
  • 举报
回复
codeigniter 不是模板引擎
既然是框架,当然他也有自己的模板引擎

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

4.1 愚人节

深圳phper 2013-04-01
  • 打赏
  • 举报
回复
引用 楼主 xjl756425616 的回复:
<?php //template.php /** * Copyright (c) 2003 Brian E. Lozier (brian@massassi.net)
回复一下
狄默默斯基 2013-04-01
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
Copyright (c) 2003 .... 十年了!!! 就因为今天第 四月一号 吗?
技术跟日期有什么关系?只是觉得和codeigniter的方式很类似~
引用 2 楼 iScript 的回复:
LZ推荐几个框架呗!~
没什么推荐呀~我就用过那2个,缺乏全面的对比性。
ci1699 2013-04-01
  • 打赏
  • 举报
回复
php amp 你怎么看
iScript 2013-04-01
  • 打赏
  • 举报
回复
LZ推荐几个框架呗!~
xuzuning 2013-04-01
  • 打赏
  • 举报
回复
Copyright (c) 2003 .... 十年了!!! 就因为今天第 四月一号 吗?
森之树 2013-04-01
  • 打赏
  • 举报
回复
我个人认为CI还是蛮好的,mvc分工明细,代码简单清晰明了
无uwuwuuwuwu 2013-04-01
  • 打赏
  • 举报
回复
其实框架没有对错,看需求.比如我现在公司项目紧急,来的都是新人,能力参差不齐.CI框架就很适合,有框架使用经验的,用这玩意1,2天基本就能上手开发. 不过,局限性也很明显 ...

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧