马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
《PHP+MYSQL WEB开发(第三版)》号称圣经级,(也许是个不错的选择(声明:作者没给我啥好处费,我也不是书托,隔着大老远,我连他老兄的面都没见过的说-_-) 引言
元数据(Metadata)编程思惟源于Java这类初级言语,复杂的说就是将营业逻辑与完成代码停止分别,仅用XML这类的描写性言语描写营业之间的映照关系,不需求写完成代码即完成编程。
源于Java的元数据编程特征
原数据是软件架构方面的先辈手艺之一,让你可以编写更少的代码完成更多的工作,将营业逻辑的重用性发扬到了极致。或许听起来有些笼统,让咱们来看一个实践的例子来帮你了解我主意的元数据编程理念。
Openbiz架构让 PHP的元数据编程变成能够
关于剧本级的PHP言语,如今已成为web开辟的主流言语之一。但因为他的出生是一个面向进程的编程言语(我说的是php3,有铁锹那年的事儿了),其实不像Python或Ruby如许的言语,下去就是为了对象而生的极致对象化言语。
基于这个复杂的后台,或许还有PHP自己开源收费的缘由,咱们看到针对php言语的初级扩大相对.Net 、Java、Objective C如许的贸易化言语老是滞后一步。当PHP5宣布时高喊"哥们儿 现在已面向对象了!" Java,.Net和Cocoa问他"你有元数据编程概念么? 你有UI级其余可重用控件么?Zend怎样还没给你穿上衣服?归去玩儿铁锹吧"
Zend 框架的开展线路一直热中于底层逻辑代码重用,好比zend_cache, zend_mail, zend_gdata , zend_table 的确完成了大批的底层逻辑的重用,处理了良多奇妙庞杂的成绩。
这里咱们积极承认Zend作出的奉献,不外"年老您到多往前迈一步啊!",不!我们年老就喜好干粗活,不喜好弄文艺。
最初出格滑稽,经由Zend不懈的勉力,年老终究把一件庞杂的工作(PHP)笼统为另外一件庞杂的工作了(Zend框架)。你数数zend的API接口其实不比php自己的extension复杂几何。
在此不能不提到 伊利诺伊大学卒业的硕士高才生,曾任摩托罗拉的手艺主管,美籍华人Rocky Swen,(自己一向是他手艺思惟的跟随者),早在2003年,php4谁人年月,他提出了让PHP基于元数据,不必写代码即完成编程这一概念,并有了Openbiz框架的雏形,经由了9年的完美到了明天。
这个理念事先就让我面前一亮,你看看Zend, CodeIgniter,CakePHP 无一破例属于承继式框架 相当于一组可重用的代码库,Openbiz框架出格的地方在于这是一个注释型框架,相当于"编译器"的脚色。 当其它开辟情况和框架努力于闪开发人员少写代码的时分,Rocky兄 提出,别让他们写代码了直接用复杂XML言语来描写映照关系即完成编程。
让咱们来对照一下这几段法式
以定单办理的数据对象为例
PHP传统的数据对象写法
Class OrderDO
{
protected $m_id;
protected $m_client;
protected $m_product;
protected $m_price;
protected $m_timestamp;
public function create(){ … }
public function delete(){ … }
public function update(){ … }
public function search(){ … }
public function list(){ … }
}
PHP基于Openbiz的元数据写法
<?xmlversion="1.0" standalone="no"?>
<BizDataObjName="OrderDO" Class="BizDataObj" DBName="Default" Table="order" IdGeneration="Identity" CacheLifeTime="7200" >
<BizFieldList>
<BizFieldName="Id" Column="id" Type=" Number "/>
<BizFieldName="client" Column="client" Type="Text"/>
<BizFieldName="product" Column="product" Type="Text"/>
<BizFieldName="price" Column="price" Type="Number"/>
<BizFieldName="timestamp" Column="timestamp" Type="DateTime"/>
</BizFieldList>
</BizDataObj>
太棒了!这让我看到了两种将来的能够性,假如编程的主体任务是基于一种描写性的XML言语完成的,那末今后极有能够呈现完整所见即所式的编程体例。
另外一种极致多是下文提到的对象工场概念,主动化编程。
对象工场概念,一个会写法式的法式!
每次提到这个概念都让我冲动不已,似乎咱们间隔智能化编程只要天涯之遥。这个理念据我所知最早提出的是.Net的自省(这个汉语翻译很诡异)这一概念,即由主法式静态创立出另外一个自力的子法式,静态编译,然后按需装载及烧毁(跟变形金刚似的),事先看的我也非常冲动,尔后这个概念根基上就再也没人提了。
直到后来我浏览剖析过了Openbiz的底层源代码惊人地发明了基于PHP完成的对象工场这一理念。分析一下思绪,以数据对象为例:
基于XML的元数据文件被视为发给"工场"的拆卸单,下面描写了应详细若何"组装"这个对象,和这个对象与地层数据库的映照关系,与同层级的其它对象的映照关系(例如一对多的ORM)
对象工场接到创立如许对象的临盆指令后,按描写创立并组装所需对象,并以串行化的体例将对象体和形态缓存在体系内,为再次触发挪用,而优化功能。直到元数据设置装备摆设文件改动之前,对象只需求静态临盆一次,即无穷次利用。
基于这类编程逻辑,咱们处理一个罕见的修正和扩大成绩。
例如:客户常常会再项目验收时提出底地层数据字段的修正,"您看接洽人办理这个模块,能不克不及再增添个 诞辰 和 喜欢 字段,要否则这尾款生怕..."。
怎样办?
改吧。 增删读写(CRUD),列取(List),搜刮(Search)一个不克不及少全都要改。
谁改?
一定你改啊,由于是你写法式。
Openbiz元数据就纷歧样了,如今我只修正一个数据描写文件,然后是对象工场会检测到元数据设置装备摆设文件产生改动,然后他来主动从头编写对象和一切与其相干的映照挪用(ORM)。
当你面临的是一个营业巧合性出格庞杂的体系时,你会发明这些下层对象"你中有我,我中有你"堆叠式挪用庞杂至极(恶心至极)。好比在文档修正纪录的视图中也挪用了接洽人的这几个字段等,你肯定能一个不差的修正遍与这个数据布局的每个角落么?
此非人力所能为也!但对象工场可以,由于是按需临盆创立。
PHP言语本身对对象的处置还存在如许一个缺点,对象的性命期是不克不及跨视图的,当一个页面恳求被履行终了,与其相干一切资本就都被主动烧毁收受接管了。出格是数据对象这类凡是会带无数据库链接和游标形态的对象。
Openbiz的会话办理机制共同对像工场的完成可耐久的对象形态。
对象工场会在交付对象前挪用笼统类的MetaObject::setSessionData()接口来主动复原对象形态。
如许在编写法式的时分,咱们在全部用户会话期内可以跨视图去挪用用户已经输出过的数据。例如将用户已经输出过的信息作为默许值显示在以后这个视图上。
在php中的挪用语法典范:
$defaultValue =
BizSystem::getObject("package.do.DataObjName")
->getActiveRecord()
->fieldName;
在元数据中经由过程Openbiz的SimpleExpression的语法典范
<Element ...
DefaultValue="{@package.do.DataObjName[fieldName].Value}"
/>
不但描写数据映照,基于Openbiz元数据描写营业逻辑
假如你已对这类元数据编程体例有乐趣了,请持续往下看。
出了数据对象与数据表之间的联系关系映照可以被元数据化,还有甚么可以元数据化?
MVC的三层布局,UI也能够元数据化,VIew和Form这些UI级元素一样可以经由过程XML言语来描写装载与触发关系,例如
这个View应当装载哪几个Form?
这个编纂Form上的文本控件应当绑定到哪一个数据对象的哪一个字段上?
当按下这个按钮的时分,应该触发哪一个类的哪一个办法?
咱们想象增删读改(CRUD)这些经常使用逻辑框架底层能完成,假如我的需求是当客户下完定单后,主动发邮件告诉我,而且发短信告诉配货部分。如许的绝对庞杂营业逻辑,若何元数据化完成?
数据对象触发器 和 可设置装备摆设的拔出式办事
这个邮件和短信的触发一定不该该在UI层完成,由于咱们要思索不论定单从何处被生成,都应触发发送邮件这个逻辑。所以这个营业逻辑应当被耦合在数据对象上,即只需有定单被生成绩应该触发该逻辑。
而发邮件和发短信些种罕见的可重用性逻辑,可以被界说为pluginService,例如在发邮件的Service中,收件人,题目,内容应该是API的参数,而发邮件的帐户,SMTP办事器信息相对营业全部体系来讲凡是变更不大,应作为元数据接口,而若何与办事器链接来发送邮件则是详细被重用的对象逻辑了。这类设计的精巧的地方咱们将鄙人一篇文章中详细给人人剖析。
如许完成方才说的逻辑,我只需求创立一个
OrderDO_Trigger.xml的元数据文件
<PluginServiceName="OrderDO_Trigger" Description="" Package="" Class="doTriggerService" BizObjectName="collab.order.do.OrderDO">
<DOTriggerTriggerType="INSERT" >
<TriggerConditionExpression="" ExtraSearchRule="" />
<TriggerActions>
<TriggerActionAction="CallService" Immediate="Y" DelayMinutes="" RepeatMinutes="">
<ActionArgumentName="Service" Value="service.lib.userEmailService" />
<ActionArgumentName="Method" Value="sendEmail" />
<ActionArgumentName="RecipientEmail" Value="{@profile:Email}" />
<ActionArgumentName="EmailTemplate" Value="OrderConfirmEmail" />
</TriggerAction>
</TriggerActions>
</DOTrigger>
</PluginService>
当"INSERT" 事务产生的时分,挪用发邮件办事,收件工资用户的邮箱,邮件内容模板为OrderConfirmEmail
到如今为止,一行代码都没写就把这个典范的营业逻辑用元数据的体例描写了出来。而用传统开辟体例,处置如许的成绩,150行以上代码的任务开支是怎样也防止不了的。并且可读性还纷歧定如许明晰。
说到这里,自己太喜好Openbiz这只飞鸟(我是说他的Logo)了,感到像是给PHP插上的同党。
如今咱们PHPer可以对Java说,PHP如今能描写营业逻辑,你Java不过只能是数据映照和设置装备摆设信息吧。
Openbiz 元数据编程 与 Zend定名划定规矩婚配编程 的对照
本文引见的Openbiz这类元数据思惟并不是独一,假如纯真就数据对象的笼统化而言,还有一种不能不提的先辈形式,叫定名划定规矩婚配形式。这类也是Java的一种扩大。翻译成php完成办法,例如:
$obj = new stdDataObj($tableName);
$obj->name='ABC';
$obj->attribute_1 = 123;
$obj->attribute_2 = 456;
$obj->save();
我其实不需求在利用前界说这个对象的布局,而是随需求而创立,归正保留数据的时分让它本人去主动与数据库婚配去。 但貌似这类逻辑的扩大性只限对数据逻辑,扩大逻辑还要用传统的界说声明体例。
主要的这仍是不克不及将开辟人员的次要任务从代码中摆脱出来。
本文以Openbiz框架为例,让咱们看到了编程的另外一种能够性。
从若何简化代码,到极致的尽可能不写代码,而只描写营业逻辑。
这才是面向对象思惟中最大化重用的精华。
学校并没有那么多的时间可以让我们在实际开发上面。 |