- 浏览: 378289 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
周仁明:
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 592一提起最好的编程语言,PHPer一定会说,PHP是世界上最好 ... -
Sight——杀手级提升Laravel开发速度的组件现在开源了!
2020-10-11 18:01 361Sight——杀手级提升Laravel开发速度的组件现在开源 ... -
PHP迭代器模式与环形链表
2020-08-02 15:07 369迭代器模式,并不在最初的23个设计模式中。但 ... -
喜报:我中了一个巨额特等奖,关于PHP的。
2020-07-15 03:53 3今天写程序,程序中需要计算并检查计算的结果 ... -
PHP启动出错,不能加载扩展。
2020-05-10 14:36 790PHP Warning: PHP Startup: Un ... -
PHP中强制引用的实现
2020-01-09 23:17 459为什么要使用引 ... -
PHP数组函数(按使用频度排序)
2019-09-14 17:39 632PHP数组函数较多,初学者很多都记不住,经常会要用时临时查手 ... -
FastAdmin系统后台存在高危安全漏洞
2019-09-07 23:27 2362FastAdmin系统后台存在高危安全漏洞 FastAdm ... -
PHP流数据动态结构处理包简介
2019-09-07 23:11 638SDDS(Stream Data Dynamic Stru ... -
推荐一个Socket 应用协议层组件
2019-06-06 00:34 922SDDS(Stream Data Dynamic Struc ... -
PHP典型垃圾代码点评(1)
2019-05-25 00:48 763从今天开始,陆续给 ... -
Php-Redis-Admin完全安装指南
2019-03-02 13:09 617Php-Redis-Admin 是基于PhpRedmin的 ... -
PHP:在对象上动态添加一个新的方法
2015-02-06 00:44 4306有关在一个对象上动态添加方法,如果你来自Ruby语言或您熟 ... -
数据库变更管理系统ruckusing
2013-09-22 17:38 1673源代码变更管理,我们用CVS,SVN,GITHUB,SOOU ... -
元数据驱动还是标签引擎?
2013-07-22 01:48 2044——OpenBiz Cubi试用随 ... -
推荐 EPESI开发框加与CRM/ERP
2012-12-10 00:50 1817PHP的EPESI开发框架,可能很多人并不熟悉。 ... -
关于PHP的工作流引擎EZER简介
2012-11-30 00:30 22534关于PHP的工 ... -
使用PHP发送传真(PHP code for Sending fax)
2012-04-17 12:58 2883到目前,国内未找到如何用PHP发传真的文章,ITEYE ... -
WEB开发编码规范三字经
2012-02-09 00:32 1327以下是一个仅72字的编码规范三字经。虽说是针对WEB开发而定的 ... -
PHP的连续赋值
2011-08-15 13:20 5912连续赋值很多编程语言均支持,比如:JAVASCRIPT ...
相关推荐
1. **Zend Framework 结构**: Zend Framework 采用模块化设计,包含控制器、视图、模型、数据库适配器、缓存、邮件、表单验证等多个组件,这些组件可以独立使用或组合使用。 2. **MVC 模式**:Model-View-...
1. **组件化设计**:Zend Framework 提供了多个独立的、可重用的组件,如数据库访问、缓存、邮件、表单处理等,开发者可以根据项目需求自由组合。 2. **企业级兼容性**:框架支持多种标准,如PSR-0、PSR-1、PSR-2等...
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 ...
4. **ZF1 版本**: "ZendFramework-1.9.2" 指的是 Zend Framework 1.x 系列的一个版本,1.9.2 是这个系列的一个稳定版本。每个版本都会修复已知问题,增加新功能,或者优化性能。 5. **中文手册的重要性**: 对于中文...
Zend Framework推崇“选择性使用”原则,开发者可以根据项目需求选择使用其中的部分或全部组件,极大地提高了开发效率和代码质量。 **二、CMS系统的核心功能** CMS系统通常包含以下核心功能: 1. **内容创建与...
Zend Framework 2 官方教程汉化版
1. **下载与解压**:首先,从官方网站或者提供的压缩包"ZendFramework-1.12.9.zip"下载并解压到服务器的适当位置。 2. **环境要求**:确保服务器环境满足PHP 5.2.5或更高版本。 3. **配置自动加载**:通过设置`...
Zend Framework 中文 手册 2008年12月01日.chm MD5: DD29C39D12E9C0B38FD3475A12D05B73 SHA1: 1A6BBBF9311013F2FF2BF97752332160ED767526 CRC32: 88210ABD Zend Framework 入门教程(简体中文1.52版)v0.12.pdf MD5:...
Zend Framework教程之Zend_Layout布局助手详解重点介绍了Zend Framework中Zend_Layout组件的使用方法。Zend_Layout是一个用于管理布局的组件,它允许开发者定义应用程序的布局结构,使得可以在不同的页面中复用相同...
1. 下载并安装Zend Framework:首先需要从Zend Framework官方网站下载所需版本的框架文件,通常有.zip和.tar.gz两种格式可供选择。 2. 目录结构规划:虽然Zend Framework没有强制的目录结构要求,但通常会建议一个...
### Zend Framework实例教程知识点解析 #### 一、简介与安装要求 **Zend Framework**是一款开源的PHP框架,设计用于帮助开发者构建稳定、高效且可扩展的Web应用。本教程聚焦于介绍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 1.7.5 基本使用教程** Zend Framework 是一个开源的、基于组件的PHP框架,用于构建可扩展、高性能的Web应用。版本1.7.5是该框架的一个重要里程碑,提供了丰富的功能和改进,旨在提高开发效率。在...
Zend Framework 遵循 Model-View-Controller (MVC) 设计模式,它将应用程序的业务逻辑、数据和用户界面分离开来,使得代码更易于维护和扩展。在 MVC 架构中,Model 负责处理业务逻辑,View 负责展示数据,而 ...
- **持续改进**:尽管现在最新的版本已经是 Zend Framework 2 及更高,但 1.x 系列依然在维护,修复了一些已知问题和安全漏洞。 4. **学习与实践** 学习 Zend Framework 1.11.10 需要对 PHP 有扎实的基础,理解 ...
Zend Framework 是一个基于组件的 PHP 开发框架,由 Zend Technologies 公司创建并维护,被PHP官网推荐为MVC(Model-View-Controller)框架之一,尤其适合构建企业级的Web应用。本教程将深入讲解 Zend Framework 的...
Zend Framework 3 Developer's Guide 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
1. **架构和设计原则**:Zend Framework 基于组件化设计,每个组件独立且可重用,允许开发者根据需求选择需要的组件。此外,框架遵循PSR(PHP Standard Recommendations)规范,确保代码的可读性和可维护性。 2. **...