PHP 组件化编程技巧


Posted in PHP onJune 06, 2009

但其在UI方便却有些力不从心,不仅是PHP,任何一种Web编程语言在设计UI都有类似的问题,宿主语言与HTML混和在一个文件中,大量重复的 HTML代码,毫无任何技术含量,但又非常的费时费力。于是我就希望能够对之前做过的PHP项目UI部分进行总结和归纳,将其封装为一个个小的组件(就像 Delphi中的组件一样),在界面上呈现为统一的风格,日后可以再针对这结组件编写多个CSS文件,提供“换肤”功能。

所有的组件都继承自AbatractComponent这个类,并实现其中的toString()render()方法。AbatractComponent又有三个主要的子类,一个是容器类Continer,其又派生出PanelPopPanelGroupPanel等类,第二个是控件类Control,是所有可视控件类的父类,如ButtonLinkButton等类,第三个则是列表类List,实现有列表,名-值对的UI。

PHP 组件化编程技巧

AbstractComponent部分代码:

<?php 
/** 
* Component Library 
* 
* @author Chris Mao 
* @package Component 
* @description All components must be extened from the class 
* and override the both methods of toString. 
* @copyright Copyright (c) 2009 JueRui Soft Studio 
* 
**/ 
class AbstractComponent { /* 
* @var _style the component style's array 
* 
* @access protected 
* 
*/ 
protected $_style = array(); 
/* 
* @var _attributes the component attribute's string 
* 
* @access protected 
* 
*/ 
protected $_attributes = array(); 
/** 
* constructor function 
* 
* @access public 
* 
*/ 
public function __construct($options = null, $style = null) { 
if (!is_null($options) && (gettype($options) != "array")) { 
throw new Exception("The options must be a array!!"); 
} 
if (!empty($options) && is_array($options)) { 
if (array_key_exists("style", $options)) { 
if (is_array($options["style"])) { 
$this->_style = array_merge($this->_style, $options["style"]); 
} 
unset($options["style"]); 
} 
$this->_attributes = array_merge($this->_attributes, $options); 
} 
if (!empty($style) && is_array($style)) { 
$this->_style = array_merge($this->_style, $style); 
} 
} 
/** 
* set the component attributes 
* 
* @access protected 
* 
* @param $name attribute name 
* @param $value attribute value, option 
* 
* @return AbstractComponent 
*/ 
protected function setAttr($name, $value) { 
if (array_key_exists($name, $this->_attributes)) { 
unset($this->_attributes[$name]); 
} 
$this->_attributes[$name] = $value; 
return $this; 
} 
/** 
* get the component attributes' value 
* 
* @access protected 
* 
* @param $name attribute name 
* 
* @return string 
*/ 
protected function getAttr($name) { 
return array_key_exists($name, $this->_attributes) ? $this->_attributes[$name] : null; 
} 
/** 
* set the component style 
* 
* @access protected 
* 
* @param $name style name 
* @param $value style value, option 
* 
* @return AbstractComponent 
*/ 
protected function setStyle($name, $value) { 
if (array_key_exists($name, $this->_style)) { 
unset($this->_style[$name]); 
} 
$this->_style[$name] = $value; 
return $this; 
} 
/** 
* get the component style's value 
* 
* @access protected 
* 
* @param $name attribute name 
* 
* @return string 
*/ 
protected function getStyle($name) { 
return array_key_exists($name, $this->_style) ? $this->_style[$name] : null; 
} 
/** 
* convert the component all attributes to string like name = "value" 
* 
* @access protected 
* 
* @return string 
*/ 
protected function attributeToString() { 
//$s = array_reduce(; 
$s = ""; 
foreach($this->_attributes as $key => $value) { 
$s .= " $key=\"$value\" "; 
} 
return $s; 
} 
/** 
* convert the component style to string like style = "....." 
* 
* @access protected 
* 
* @return string 
*/ 
protected function styleToString() { 
if (empty($this->_style)) return ""; 
$s = ""; 
foreach($this->_style as $key => $value) { 
$s .= " $key: $value; "; 
} 
$s = " style=\"$s\" "; 
return $s; 
} 
/** 
* set or get the component attributes 
* 
* @access public 
* 
* @param $name attribute name 
* @param $value attribute value, option 
* 
* @return string || AbstractComponent 
*/ 
public function attr() { 
$name = func_get_arg(0); 
if (func_num_args() == 1) { 
return $this->getAttr($name); 
} 
else if (func_num_args() == 2) { 
$value = func_get_arg(1); 
return $this->setAttr($name, $value); 
} 
} 
/** 
* set or get the component style 
* 
* @access public 
* 
* @param $name style name 
* @param $value style value, option 
* 
* @return string || AbstractComponent 
*/ 
public function style() { 
$name = func_get_arg(0); 
if (func_num_args() == 1) { 
return $this->getStyle($name); 
} 
else if (func_num_args() == 2) { 
$value = func_get_arg(1); 
return $this->setStyle($name, $value); 
} 
} 
/** 
* return the HTML string 
* 
* @access public 
* 
* @return string 
**/ 
public function toString() { 
thorw New AbstractException("subclass must be override this method!!"); 
} 
/** 
* render the component 
* 
* @access public 
* 
* @return void 
**/ 
public function render() { 
echo $this->toString(); 
} 
}
PHP 相关文章推荐
用PHP调用数据库的存贮过程!
Oct 09 PHP
php下使用SMTP发邮件的代码
Jan 10 PHP
php mysql数据库操作类
Jun 04 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
使用ThinkPHP+Uploadify实现图片上传功能
Jun 26 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
windows7下php开发环境搭建图文教程
Jan 06 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
php中get_magic_quotes_gpc()函数说明
Feb 06 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
Oct 25 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 PHP
PHP加速 eAccelerator配置和使用指南
Jun 05 #PHP
php 更新数据库中断的解决方法
Jun 05 #PHP
php split汉字
Jun 05 #PHP
phpinfo 系统查看参数函数代码
Jun 05 #PHP
PHP 字符串 小常识
Jun 05 #PHP
PHP 批量删除 sql语句
Jun 05 #PHP
PHP 文件扩展名 获取函数
Jun 03 #PHP
You might like
php自定义截取中文字符串-utf8版
2017/02/27 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
php数组遍历类与用法示例
2019/05/24 PHP
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
python3中int(整型)的使用教程
2017/03/23 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
python中altair可视化库实例用法
2021/01/26 Python
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
如何利用cmp命令比较文件
2016/04/11 面试题
年终自我鉴定
2013/10/09 职场文书
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
行政经理岗位职责
2013/11/09 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
经费申请报告
2015/05/15 职场文书
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
python中mongodb包操作数据库
2022/04/19 Python