首先我是用过codeigniter的,刚开始学框架的时候用过一阵子,然后后来公司用thinkphp,就没再用了,用了2个之后,就会有一些对比性。首先这2个框架文件夹容量都比较大,称不上轻量级之类的,我都不怎么看好。
今天单说codeigniter框架
举个官网控制器调用模板的例子
<?phpclass 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.phprequire_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
回复讨论(解决方案)
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。。。。。。。。。。。。。

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

Fibers在PHP8.1中引入,提升了并发处理能力。1)Fibers是一种轻量级的并发模型,类似于协程。2)它们允许开发者手动控制任务的执行流,适合处理I/O密集型任务。3)使用Fibers可以编写更高效、响应性更强的代码。

PHP社区提供了丰富的资源和支持,帮助开发者成长。1)资源包括官方文档、教程、博客和开源项目如Laravel和Symfony。2)支持可以通过StackOverflow、Reddit和Slack频道获得。3)开发动态可以通过关注RFC了解。4)融入社区可以通过积极参与、贡献代码和学习分享来实现。

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Atom编辑器mac版下载
最流行的的开源编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。