php xml、删除 修改 创建 增加
PHP开发框架比较
Laravel 是一个简单优雅的 PHP WEB
开发框架,将你从意大利面条式的代码中解放出来。通过简单、优雅、表达式语法开发出很棒的
WEB应用!
但是通过使用我们发现Laravel在开发效率和运行效率上都存在瓶颈。如此优秀的框架都存在诸多问题,基于此我们在公司现有框架的基础上参照诸多框架(不限于php语言也参照java和ruby)的优点完成一个自主设计的框架。
自此,YYUC框架的开发团队征集并完成组建,不断的讨论、编码、测试、内部开发和合作伙伴推广;一个完整的版本就此形成。
特性 |
codeigniter |
laravel |
YYUC |
比较 |
路由规则 |
约定加自定义,视图需要手工指定。 |
约定加自定义,视图需要手工指定。 |
约定加自定义。 不利用配置文件的路由规则就可以自由的构建URL格式,一般的路由约定是: 类/方法/参数,这种约定不够灵活,YYUC的路由实现上可以更灵活。 |
laravel的统一分发虽然使路由的定义更加灵活的,但是个人觉得没必要。只要层次设计好有利于SEO和用户感官就好,没有必要独立定义。Laravel3之前开发和维护过程中查着路由表找控制器累不累啊。Laravel3之后解决了这个问题,有了自动路由的方法:Route::controller(Controller::detect()); |
类加载 |
手动指定加载的类,分为帮助类,和字典类等等。 |
自动加载。 |
插件形式自动加载,分为系统插件和用户插件等。 |
类较少时三个框架的加载速度相差不大,YYUC是自动加载,不用开发人员手动指定。Laravel也是这一原理,codeigniter调用load方法和直接include差不多,代码不够简洁明快。 |
数据校验 |
校验方式灵活。校验规显得有些杂乱 |
校验方式灵活,预置的校验种类全面。 |
建议将提交的数据都封装在模型中,有对应库表的用数据库模型,没有的用简单模型。重写校验方法实现校验。有利于数据的统一管理,与此同时特定校验的扩展性强。 |
各有优势,codeigniter的类加载本来就很丑了,再加上不同方式的校验规则,代码显的乱七八糟的。 |
可扩展性 |
类相对独立,并入框架内部要加一些框架的实例化方法。 |
框架基本上都是静态风格,太过个性化。把网络上开源的类引入框架中会显得格格不入。最好最为自定义的类放入项目中。要用这些类扩展框架就要对引入的类做大手术。 |
插件形式引入,对于大多输的类通常只需改下类的文件名就可以自动被调用。 |
还是喜欢自己写的框架,核心是核心插件是插件,核心越精简越高效越好,插件越强大越灵活越好。网络上这么多优秀的经过验证的类为什么不直接引入其中呢。 |
安全性 |
安全机制强大 |
只包含一般安全校验,如跨站提交等 |
自认为安全机制强大 |
codeigniter可以说把能做的安全防范机制都做了,laravel与其说是个框架倒更像一个路由分发的核心。很多安全问题需要自己考虑。YYUC参考了struct,Thinkphp以及codeigniter的安全验证方式,把能加的安全防范规则都加了,可能由于自己底层知识(包括php底层,web服务器底层)的局限性还存在漏洞也是可能的。但是用YYUC发现漏洞可以第一时间改掉。用其他的框架,如果万一有漏洞存在,要么要修改他的核心代码要么要等待版本更新是神被动的。 |
先进行 |
传统的MVC模式,但是Model层不够灵活,与库表数据的一一对应并不好。 |
最新的5.3 支持,先进的语法风格。显得有些另类 |
传统的MVC模式 |
laravel运用了最新的5.3规范,引入命名空间的概念,像namespace use等语法都是最新引入,但是部署上有局限性。laravel引入了类似JS的匿名函数回调机制,开发者可能要在思维角度上有所转变。而且大量的回调更利于假设高性能的分发程序,不适合传统的Web网站开发。所以laravel只是底层运用了这些模式,对于开发者来说还是传统的MVC模式。 |
数据库支持 |
功能强大,全面支持。 |
PDO规范支持Mysql和Sqlserver不支持Oracle |
只支持Mysql |
YYUC目前只支持Mysql数据库,但是封装的DB类做了很好的多库表,主从表的支持(主要参照的Thinkphp),超大数据量的系统也是可以应对的。对于其他数据库以后版本想以插件的形式。在精而不在多。 |
效率与开销 |
相应速度快,内存开销一般。 |
相应速度较快,内存开销稍大。 |
生产模式下相应速度快,内存开销很小,开发模式下需要编译速度会稍微慢一些。 |
个人认为对PHP来说,框架类的层级过多并不一定是好事。 PHP的初衷就是敏捷开发快速相应,Http并不是常连接的,处理好每次请求也就处理好了整个网站,好的框架并不一定要设计成像Spring那样包罗万象。 |
分别是创建、增加、删除、修改四个功能,变量都是写死的,改一改用$_post方式接收就可以用了
//index.php教程 创建功能
复制代码 代码如下:
<?php
$xmlpatch = 'index.xml';
$_id = '1';
$_title = 'title1';
$_content = 'content1';
$_author = 'author1';
$_sendtime = 'time1';
$_htmlpatch = '1.html';
111cn.net$doc = new domdocument('1.0', 'utf-8');
$doc -> formatoutput = true;
111cn.net$root = $doc -> createelement('root');//新建节点
111cn.net$index = $doc -> createelement('index');//新建节点
111cn.net$url = $doc -> createattribute('url');//新建属性
$patch = $doc -> createtextnode($_htmlpatch);//新建text值
$url -> appendchild($patch);//将$patch文本设为$url属性的值
111cn.net$id = $doc -> createattribute('id');
$newsid = $doc -> createtextnode($_id);
$id -> appendchild($newsid);
111cn.net$title = $doc -> createattribute('title');
$newstitle = $doc -> createtextnode($_title);
$title -> appendchild($newstitle);
111cn.net$content = $doc -> createtextnode($_content);//节点值
111cn.net$author = $doc -> createattribute('author');
$newsauthor = $doc -> createtextnode($_author);
$author -> appendchild($newsauthor);
111cn.net$sendtime = $doc -> createattribute('time');
$newssendtime = $doc -> createtextnode($_sendtime);
$sendtime -> appendchild($newssendtime);
111cn.net$index ->
appendchild($id);//将$id设为index节点的属性,以下类同
$index -> appendchild($title);
$index -> appendchild($content);
$index -> appendchild($url);
$index -> appendchild($author);
$index -> appendchild($sendtime);
111cn.net$root -> appendchild($index);//设置index为root字节点
111cn.net$doc -> appendchild($root);//设置root为跟节点
111cn.net$doc -> save($xmlpatch);//保存文件
111cn.netecho $xmlpatch . ' has create success';
111cn.net?>
111cn.net<!doctype html public "-//w3c//dtd xhtml 1.0
transitional//en"
"http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"
/>
<title>xml操作</title>
</head>
111cn.net<body>
</body>
</html>
开发运行效率示例:
下面的例子分别利用三种框架做了个数据插入到Mysql数据库并查询输出的示例,示例只是实现基本的增加查询功能并没有进行数据校验。下面的例子中将展示不同框架代码量的,公平起见运行效率的统计方法没有用框架底层的调试类而是采用原生的php方法计算运行时间和内存使用量:
//add.php 增加功能(跟index.php文件差不多,主要就是加个load载入跟 $root =
$doc -> documentelement获得跟节点
复制代码 代码如下:
<?php
$xmlpatch = 'index.xml';
$_id = '2';
$_title = 'title2';
$_content = 'content2';
$_author = 'author2';
$_sendtime = 'time2';
$_htmlpatch = '2.html';
111cn.net$doc = new domdocument();
$doc -> formatoutput = true;
if($doc -> load($xmlpatch)) {
$root = $doc -> documentelement;//获得根节点(root)
$index = $doc -> createelement('index');
111cn.net$url = $doc -> createattribute('url');
$patch = $doc -> createtextnode($_htmlpatch);
$url -> appendchild($patch);
111cn.net$id = $doc -> createattribute('id');
$newsid = $doc -> createtextnode($_id);
$id -> appendchild($newsid);
111cn.net$title = $doc -> createattribute('title');
$newstitle = $doc -> createtextnode($_title);
$title -> appendchild($newstitle);
111cn.net$content = $doc -> createtextnode($_content);
111cn.net$author = $doc -> createattribute('author');
$newsauthor = $doc -> createtextnode($_author);
$author -> appendchild($newsauthor);
111cn.net$sendtime = $doc -> createattribute('time');
$newssendtime = $doc -> createtextnode($_sendtime);
$sendtime -> appendchild($newssendtime);
111cn.net$index -> appendchild($id);
$index -> appendchild($title);
$index -> appendchild($content);
$index -> appendchild($url);
$index -> appendchild($author);
$index -> appendchild($sendtime);
111cn.net$root -> appendchild($index);
111cn.net$doc -> save($xmlpatch);
111cn.netecho $_id . ' has been added in ' . $xmlpatch;
111cn.net} else {
echo 'xml file loaded error!';
}
?>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en"
"http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"
/>
<title>xml操作-添加</title>
</head>
111cn.net<body>
</body>
</html>
数据表:
CREATE TABLE `test_article` (
`id` int(11) NOT NULL auto_increment COMMENT '主键',
`title` varchar(255) default NULL COMMENT '标题',
`content` text COMMENT '内容',
`updated_at` datetime default NULL,
`created_at` datetime default NULL, --laravel必须这两个字段(和Rails的一模一样)
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
//edit.php 修改功能(这里只修改title属性值 跟节点值)
复制代码 代码如下:
<?php
$xmlpatch = 'index.xml';
$_id = '2';
$_title = 'has been changed';
$_content = 'has been changed';
111cn.net$doc = new domdocument();
$doc -> formatoutput = true;
111cn.netif($doc -> load($xmlpatch)) {
$root = $doc -> documentelement;
$elm = $root -> getelementsbytagname('index');
$checkexist = 0;
foreach ($elm as $new) {
if($new -> getattribute('id') == $_id) {
$new -> setattribute('title', $_title);
$new -> nodevalue =
$_content;//修改节点值,真是太意外了,没想到跟js一样直接能赋值...
//$new -> removechild($new -> nodevalue);
$checkexist = 1;
}
}
if($checkexist == 0) {
echo $_id . ' is not found in ' . $xmlpatch;
} else {
$doc -> save($xmlpatch);
echo $_id . ' has been changed';
}
} else {
echo 'xml file loaded error!';
}
111cn.net?>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en"
"http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"
/>
<title>xml操作-修改</title>
</head>
111cn.net<body>
</body>
</html>
代码量展示:
//del.php 删除功能
复制代码 代码如下:
<?php
$xmlpatch = 'index.xml';
$_id = '2';
111cn.net$doc = new domdocument();
$doc -> formatoutput = true;
if($doc -> load($xmlpatch)) {
$root = $doc -> documentelement;
$elm = $root -> getelementsbytagname('index');
foreach ($elm as $new) {
if($new -> getattribute('id') == $_id) {
if($root -> removechild($new)) {
echo $_id . ' has been deleted';
} else {
echo $_id . ' delete failed';
}
}
}
$doc -> save($xmlpatch);
} else {
echo 'xml file loaded error!';
}
111cn.net?>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en"
"http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"
/>
<title>xml操作-删除</title>
</head>
111cn.net<body>
</body>
</html>
laravel:
视图:
新增页面:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>测试新增</title>
</head>
<body>
<?php echo Form::open('test/new','POST');?>
标题:<?php echo Form::text('title',$title);?>
内容:<?php echo Form::text('content',$content);?>
<?php echo Form::submit('提交');?>
<?php Form::token()?>
<?php echo Form::close();?>
</body>
</html>
如果要实现表单自动填充的话还是要手动指定的有些麻烦
新增成功页:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>保存成功</title>
</head>
<body>
<h1>保存成功</h1>
</body>
</html>
展示页面:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>显示数据</title>
</head>
<body>
标题:<?php echo $title?><br/>
内容:<?php echo $content?><br/>
</body>
</html>
模型:
<?php
class Article extends Eloquent {
public static *$table* = 'test_article';
}
控制器:
<?php
class Test_Controller extends Base_Controller {
/**
* 页面展示
*/
public function action_init()
{
return View::make('test.new');
}
/**
* 保存数据
*/
public function action_new()
{
$title = Input::get('title');
$content = Input::get('content');
$article = new Article;
$article->title = $title;
$article->content = $content;
$article->save();
return View::make('test.success');
}
/**
* 显示数据
*/
public function action_show($id)
{
$article = Article::find($id);
return View::make('test.show',array('title'=>$article->title,'content'=>$article->content));
}
}
CodeIgniter:
视图:
新增页面:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>测试新增</title>
</head>
<body>
<?php $this->load->helper('form');?>
<?php echo form_open('test/tonew'); ?>
标题:<?php echo form_input('title');?>
内容:<?php echo form_input('content');?>
<?php echo form_submit('mysubmit', '提交');?>
</form>
</body>
</html>
同样的表单自动填充也不省事,不对称的标签格式总让人心里不舒服
新增成功页:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>保存成功</title>
</head>
<body>
<h1>保存成功</h1>
</body>
</html>
展示页面:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>显示数据</title>
</head>
<body>
标题:<?php echo $title?><br/>
内容:<?php echo $content?><br/>
</body>
</html>
模型:
<?php
class Article_model extends CI_Model {
/**
* 构造函数
*/
public function __construct()
{
$this->load->database();
}
/**
* 新增函数
*/
public function to_new()
{
$data = array(
'title' => $this->input->post('title'),
'content' => $this->input->post('content')
);
return $this->db->insert('test_article', $data);
}
/**
* 查询一条数据
* @param $id
*/
public function show_one($id)
{
$query = $this->db->get_where('test_article', array('id' => $id));
return $query->row_array();
}
}
无论怎样类初始化后DB连接就建立了,而且数据查询很不方便,完全抛弃了POJO类的概念,要手动加属性这点开发效率上是无法和YYUC和laravel相比的。