- 浏览: 371554 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
周仁明:
xin911 写道周仁明 写道js的借用了,谢谢!java的版 ...
人民币金额数字转中文大写程序多种编程语言汇总2011版 -
xin911:
周仁明 写道js的借用了,谢谢!java的版本必然是不对的问题 ...
人民币金额数字转中文大写程序多种编程语言汇总2011版 -
周仁明:
js的借用了,谢谢!java的版本必然是不对的问题很多。
人民币金额数字转中文大写程序多种编程语言汇总2011版 -
zhangzhj85:
...
公开几个移动互联产品设计大神的观点 -
white_crucifix:
嗯,不过网络诊断功能能帮上忙的次数的确微乎其微
戏说windows 7 中的优秀设计
Zend Framework的缺陷
从现在开始,将抽空发一个长篇的找抽的文章。专门谈一谈PHP官方的Zend Framework的一些设计缺陷。欢迎大家拍砖!
(1)Exception类的缺陷:
Zend Framework中的Exception看起来设计得非常精巧,实质上,那是由于它了解PHP的源码,强行为了适应php5.2和php5.3而写出的这样的怪胎。
其根本目的,是为了能够向用户提供链式的Exception。然而,可悲的是:此类中,并没有提供一个函数,能够直接向用户提供链式的Exception信息。
也许,很多衩学者不解,链式的Exception信息有什么用处?
我们还是从错误与异常的处理的基本知识着眼讲解一下:
* 什么时间用 @
* 什么时间用 return FALSE
* 什么时间用 exit die
* 什么时间用 trigger_error
* 什么时间用 throw 抛出异常
return FALSE 只是在程序无论结果如何,用户都能清楚,不需要了解错误详情,并且,也不需要对程序进行任何处理的情况下使用当程序能够直接退出,并且程序是在调试状态时,则可以用exit和die,因为,exit和die能够简单地向输出目标,比如浏览器页面,或控制台,或重定向后的文件输出你所指定的信息。但exit和die没有抛出错误或异常,所以,你无法通过集中重定向到格式化的页面。@本质是封住相关的错误与警告信息。最终使代码能够平安地return FALSE。
trigger_error 可以使用的情况则是,能够确定,这个地方是在运行时绝对不能错的,程序一但调试好,那么,也就不会再出错的, trigger_error 也是在程序调试与正式运行时,向用户报告信息。trigger_error 目标是程序必须中断。而不能继续。并且,可以被errhandle程序捕获。不同于exit和die,它们是直接退出。
exit和die是在正式使用时,是程序需要直接退出,与错误无关。
用throw 抛出异常,则是你这一段程序中出现的问题交给用户处理,由用户来决定,程序是否继续的一种方法。当然,在此情况下,也就存在了另一种危险。那就是,如果用户不清楚哪里会抛出了异常,那么,有异常就不能被捕获,造成真实的错误中断。
用throw 抛出异常时,如果程序中使用set_exception_handler,则与程序中使用set_error_handler的结果一样,会把异常集中处理。但通常是,异常是要分开处理的。而错误则是要集中处理的。 有监于这一点,用户自定义异常类是很有必要的。
在处理异常之时,我们直接判断类型,那是最方便的。所以,一般情况下,是定义不同类型的异常 类,然后,可以直接用instanceof判断。但是,这虽然方便,却有另外一个问题,那就是我们需要定义相当多的类,以用于我们不同情况下的需要。
异常是否需要支持链式异常?链式异常的好处是可以知道异常的来龙去脉,为什么要了解这些?
一旦有所了解,就能够清楚,我们在编码时,在哪些地方必须要使用异常捕获管理。这样,代码就不会留下后患。但正式支持链式异常也只有php5.30才开始,所以,低于这样的版本需要框架提供代码来实现。因为开发者正常查看框架的源码的机会比较少。甚致也不会遵循代码示例。可见,链式异常最大的好处是能够让用户了解并清楚异常的来龙去脉。
从上面这些,我们可以发现,如果我们能够向用户提供链式异常的详细信息才是最为重要的。
如何提供呢?
php5.2的中文手册中有这么一个用户注解。代码虽较为初级,但却实现了实际的需求。
在controller类里面使用$html = $this->view->render('xml/codec.xml') ;可以把渲染后的结果放入到$html里,然后你可以用file_put_content()或者其他文件操作方式,生成你所需要的文件.
从现在开始,将抽空发一个长篇的找抽的文章。专门谈一谈PHP官方的Zend Framework的一些设计缺陷。欢迎大家拍砖!
(1)Exception类的缺陷:
Zend Framework中的Exception看起来设计得非常精巧,实质上,那是由于它了解PHP的源码,强行为了适应php5.2和php5.3而写出的这样的怪胎。
其根本目的,是为了能够向用户提供链式的Exception。然而,可悲的是:此类中,并没有提供一个函数,能够直接向用户提供链式的Exception信息。
也许,很多衩学者不解,链式的Exception信息有什么用处?
我们还是从错误与异常的处理的基本知识着眼讲解一下:
* 什么时间用 @
* 什么时间用 return FALSE
* 什么时间用 exit die
* 什么时间用 trigger_error
* 什么时间用 throw 抛出异常
return FALSE 只是在程序无论结果如何,用户都能清楚,不需要了解错误详情,并且,也不需要对程序进行任何处理的情况下使用当程序能够直接退出,并且程序是在调试状态时,则可以用exit和die,因为,exit和die能够简单地向输出目标,比如浏览器页面,或控制台,或重定向后的文件输出你所指定的信息。但exit和die没有抛出错误或异常,所以,你无法通过集中重定向到格式化的页面。@本质是封住相关的错误与警告信息。最终使代码能够平安地return FALSE。
trigger_error 可以使用的情况则是,能够确定,这个地方是在运行时绝对不能错的,程序一但调试好,那么,也就不会再出错的, trigger_error 也是在程序调试与正式运行时,向用户报告信息。trigger_error 目标是程序必须中断。而不能继续。并且,可以被errhandle程序捕获。不同于exit和die,它们是直接退出。
exit和die是在正式使用时,是程序需要直接退出,与错误无关。
用throw 抛出异常,则是你这一段程序中出现的问题交给用户处理,由用户来决定,程序是否继续的一种方法。当然,在此情况下,也就存在了另一种危险。那就是,如果用户不清楚哪里会抛出了异常,那么,有异常就不能被捕获,造成真实的错误中断。
用throw 抛出异常时,如果程序中使用set_exception_handler,则与程序中使用set_error_handler的结果一样,会把异常集中处理。但通常是,异常是要分开处理的。而错误则是要集中处理的。 有监于这一点,用户自定义异常类是很有必要的。
在处理异常之时,我们直接判断类型,那是最方便的。所以,一般情况下,是定义不同类型的异常 类,然后,可以直接用instanceof判断。但是,这虽然方便,却有另外一个问题,那就是我们需要定义相当多的类,以用于我们不同情况下的需要。
异常是否需要支持链式异常?链式异常的好处是可以知道异常的来龙去脉,为什么要了解这些?
一旦有所了解,就能够清楚,我们在编码时,在哪些地方必须要使用异常捕获管理。这样,代码就不会留下后患。但正式支持链式异常也只有php5.30才开始,所以,低于这样的版本需要框架提供代码来实现。因为开发者正常查看框架的源码的机会比较少。甚致也不会遵循代码示例。可见,链式异常最大的好处是能够让用户了解并清楚异常的来龙去脉。
从上面这些,我们可以发现,如果我们能够向用户提供链式异常的详细信息才是最为重要的。
如何提供呢?
php5.2的中文手册中有这么一个用户注解。代码虽较为初级,但却实现了实际的需求。
/* Author : Romain Boisnard */ /* Liscenced under the LGPL GNU Lesser General Public Liscence, report the actual liscence for details. /* LinkedException */ // Java-like exception with a cause class LinkedException extends Exception { private $cause; function __construct($_message = null, $_code = 0, Exception $_cause = null) { parent::__construct($_message, $_code); $this->cause = $_cause; } public function getCause() { return $this->cause; } public function getStackTrace() { if ($this->cause !== null) { $arr = array(); $trace = $this->getTrace(); array_push($arr, $trace[0]); unset($trace); if (get_class($this->cause) == "LinkedException") { foreach ($this->cause->getStackTrace() as $key => $trace) { array_push($arr, $trace); } } else { foreach ($this->cause->getTrace() as $key => $trace) { array_push($arr, $trace); } } return $arr; } else { return $this->getTrace(); } } public function showStackTrace() { $htmldoc = "<p style=\"font-family: monospace; border: solid 1px #000000\"><span style=\"font-weight: bold; color: #000000;\">An exception was thrown :<br/></span>"; $htmldoc.= "Exception code : $this->code<br/>"; $htmldoc.= "Exception message : $this->message<br/>"; $htmldoc.= "<span style=\"color: #0000FF;\">"; $i = 0; foreach ($this->getStackTrace() as $key => $trace) { $htmldoc.= $this->showTrace($trace, $i); $i++; } $htmldoc.= "#$i {main}<br/>"; unset($i); $htmldoc.= "</span></p>"; return $htmldoc; } private function showTrace($_trace, $_i) { $htmldoc = "#$_i "; if (array_key_exists("file",$_trace)) { $htmldoc.= $_trace["file"]; } if (array_key_exists("line",$_trace)) { $htmldoc.= "(".$_trace["line"]."): "; } if (array_key_exists("class",$_trace) && array_key_exists("type",$_trace)) { $htmldoc.= $_trace["class"].$_trace["type"]; } if (array_key_exists("function",$_trace)) { $htmldoc.= $_trace["function"]."("; if (array_key_exists("args",$_trace)) { if (count($_trace["args"]) > 0) { $args = $_trace["args"]; $type = gettype($args[0]); $value = $args[0]; unset($args); if ($type == "boolean") { if ($value) { $htmldoc.= "true"; } else { $htmldoc.= "false"; } } elseif ($type == "integer" || $type == "double") { if (settype($value, "string")) { if (strlen($value) <= 20) { $htmldoc.= $value; } else { $htmldoc.= substr($value,0,17)."..."; } } else { if ($type == "integer" ) { $htmldoc.= "? integer ?"; } else { $htmldoc.= "? double or float ?"; } } } elseif ($type == "string") { if (strlen($value) <= 18) { $htmldoc.= "'$value'"; } else { $htmldoc.= "'".substr($value,0,15)."...'"; } } elseif ($type == "array") { $htmldoc.= "Array"; } elseif ($type == "object") { $htmldoc.= "Object"; } elseif ($type == "resource") { $htmldoc.= "Resource"; } elseif ($type == "NULL") { $htmldoc.= "null"; } elseif ($type == "unknown type") { $htmldoc.= "? unknown type ?"; } unset($type); unset($value); } if (count($_trace["args"]) > 1) { $htmldoc.= ",..."; } } $htmldoc.= ")<br/>"; } return $htmldoc; } }
评论
3 楼
rtxbc
2011-03-26
bardo 写道
zend framework有没有生成静态页面的方法
那是没有的。静态页面规则较为复杂。这方面倒现在没有统一的方案。
另一方面,zend不会推出,因为,它不会排斥官方的smarty,这个是能生成页面缓存的。
freedomstyle 写道
不知道zend framework有没有生成静态页面的方法
那是没有的。静态页面规则较为复杂。这方面倒现在没有统一的方案。
另一方面,zend不会推出,因为,它不会排斥官方的smarty,这个是能生成页面缓存的。
在controller类里面使用$html = $this->view->render('xml/codec.xml') ;可以把渲染后的结果放入到$html里,然后你可以用file_put_content()或者其他文件操作方式,生成你所需要的文件.
2 楼
bardo
2010-05-26
zend framework有没有生成静态页面的方法
那是没有的。静态页面规则较为复杂。这方面倒现在没有统一的方案。
另一方面,zend不会推出,因为,它不会排斥官方的smarty,这个是能生成页面缓存的。
freedomstyle 写道
不知道zend framework有没有生成静态页面的方法
那是没有的。静态页面规则较为复杂。这方面倒现在没有统一的方案。
另一方面,zend不会推出,因为,它不会排斥官方的smarty,这个是能生成页面缓存的。
1 楼
freedomstyle
2010-05-24
不知道zend framework有没有生成静态页面的方法
发表评论
-
最好的编程语言及其它
2020-10-18 19:48 494一提起最好的编程语言,PHPer一定会说,PHP是世界上最好 ... -
Sight——杀手级提升Laravel开发速度的组件现在开源了!
2020-10-11 18:01 309Sight——杀手级提升Laravel开发速度的组件现在开源 ... -
PHP迭代器模式与环形链表
2020-08-02 15:07 318迭代器模式,并不在最初的23个设计模式中。但 ... -
喜报:我中了一个巨额特等奖,关于PHP的。
2020-07-15 03:53 3今天写程序,程序中需要计算并检查计算的结果 ... -
PHP启动出错,不能加载扩展。
2020-05-10 14:36 621PHP Warning: PHP Startup: Un ... -
PHP中强制引用的实现
2020-01-09 23:17 413为什么要使用引 ... -
PHP数组函数(按使用频度排序)
2019-09-14 17:39 581PHP数组函数较多,初学者很多都记不住,经常会要用时临时查手 ... -
FastAdmin系统后台存在高危安全漏洞
2019-09-07 23:27 2086FastAdmin系统后台存在高危安全漏洞 FastAdm ... -
PHP流数据动态结构处理包简介
2019-09-07 23:11 567SDDS(Stream Data Dynamic Stru ... -
推荐一个Socket 应用协议层组件
2019-06-06 00:34 842SDDS(Stream Data Dynamic Struc ... -
PHP典型垃圾代码点评(1)
2019-05-25 00:48 703从今天开始,陆续给 ... -
Php-Redis-Admin完全安装指南
2019-03-02 13:09 562Php-Redis-Admin 是基于PhpRedmin的 ... -
PHP:在对象上动态添加一个新的方法
2015-02-06 00:44 4220有关在一个对象上动态添加方法,如果你来自Ruby语言或您熟 ... -
数据库变更管理系统ruckusing
2013-09-22 17:38 1630源代码变更管理,我们用CVS,SVN,GITHUB,SOOU ... -
元数据驱动还是标签引擎?
2013-07-22 01:48 2008——OpenBiz Cubi试用随 ... -
推荐 EPESI开发框加与CRM/ERP
2012-12-10 00:50 1778PHP的EPESI开发框架,可能很多人并不熟悉。 ... -
关于PHP的工作流引擎EZER简介
2012-11-30 00:30 22460关于PHP的工 ... -
使用PHP发送传真(PHP code for Sending fax)
2012-04-17 12:58 2844到目前,国内未找到如何用PHP发传真的文章,ITEYE ... -
WEB开发编码规范三字经
2012-02-09 00:32 1287以下是一个仅72字的编码规范三字经。虽说是针对WEB开发而定的 ... -
PHP的连续赋值
2011-08-15 13:20 5872连续赋值很多编程语言均支持,比如:JAVASCRIPT ...
相关推荐
Table of Contents •Introduction to Zend Framework •Overview •Installation •Learning Zend Framework •Zend Framework Quick Start •Autoloading in Zend Framework •Plugins in Zend Framework •...
Whether you are learning Zend framework from scratch or looking to sharpen up your skills from previous versions, Zend Framework 2 Application Development will help you to harness the power of Zend ...
ZendFramework-1.10.4
Zend Framework 2 官方教程汉化版
zend framework中英文手册,包含中文手册,英文手册两个版本。
Zend Framework 中文 手册 2008年12月01日.chm MD5: DD29C39D12E9C0B38FD3475A12D05B73 SHA1: 1A6BBBF9311013F2FF2BF97752332160ED767526 CRC32: 88210ABD Zend Framework 入门教程(简体中文1.52版)v0.12.pdf MD5:...
zend framework zendframework manual 手册,Zend Framework手册 中文版,有一部分还没有汉化
PHP zend framework 教程 很好PHP zend framework 教程 很好PHP zend framework 教程 很好PHP zend framework 教程 很好PHP zend framework 教程 很好PHP zend framework 教程 很好PHP zend framework 教程 很好...
zend framework zend framework zend framework zend framework zend framework zend framework zend framework
这是基于Zend Framework 框架的CMS PHP 源代码。 安装时请下载Zend及zendx并将其放在library下。
Zend Framework 3 Developer's Guide 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
zendframework1.9中文版用户手册 直接从网站上下载的离线版本 非常方便 这个是.chm的 还有.exe的版本,方便大家使用。
ZendFramework 1.12.9 代码和文档.rar
Zend Framework 3 Developer's Guide 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
ZendFramework安装1.11版 ZendFramework安装1.11版
自己编译的里面包含 ZendFramework 1.11.4 中文帮助手册 ZendFramework 1.11.4 api doc ZendFramework 1.11.4 的一个guestbook。 想要就下,不想要就看看.
ZendFramework1.7.5 ZendFramework1.7.5 ZendFramework1.7.5 ZendFramework1.7.5 ZendFramework1.7.5
zend framework手册,英文版,学习php最好的框架zend framework必备
zend framework1.0 中文教程
zend Framework 1.10中文版手册 chmzend Framework 1.10中文版手册 chm