<p> UML  是一种表现软件形态结构的图示方式,原则上来讲他允许我们可以用画图的方式设计自己的程序,如果选择了正确的工具,还可以根据图生成代码,本文中我们可以看到PHP代码通过使用 UML 类图在 UML 的表现形式,我们直接跳过关于 UML 的知识,集中介绍一些准确的代码在 UML 中的表现形式。这表示本文内容并非一篇完全的类图分析。</p><p> 在文末还有一些作者收集的资源,如果你之前尚未使用过UML,可以从那些资源中开始起步。</p><p> 继承 Inheritance</p><p> PHP 关键字:extends 允许你一个类继承自另一个类。</p><p> <code><?php<br />class Senior {<br />}<br />class Junior extends Senior {<br />}<br />?> </code></p><p> 在 UML 范畴,表现如下:</p><img src="/content/uploadfile/200805/2008053117290488.gif" onclick="get_larger(this)" /></p><p> Inheritance</p><p> 注意三角形是指向父类的。</p><p> 聚合 Associations</p><p> 联合发生在类之间不存在关系,但是可能需要互相访问对方,像一个模型(Model)和一个视图(View),视图需要模型提供数数据来显示。这里有两个不同的联合类型</p><p> 共享聚合 Aggregation</p><p> 共享聚合发生的情况如下:</p><p> 当一个类(A)访问其他类(B),第二个类(B)也许已经先在外部被实例化。如果第一个对象“死去”,第二个对象会持续“活着”。这种情况在数据访问对象(data access objects)很常见,他们中有些已经传递通过了多个对象,这些对象可能已经“死去”但是数据访问对象还存在。</p><p> 这里已经正常地解释了第一个类(A)控制第二个类(B)的部分。</p><p> 例子如下:</p><p> <code><?php<br />class Dao {<br />
function getSomething() {<br />
}<br />}<br />class Model {<br />
var $dao;<br />
function Model (& $dao) {<br />
$this->dao=& $dao;<br />
}<br />
function doSomething () {<br />
$this->dao->getSomething();<br />
}<br />}<br />$dao=new Dao;<br />$model=new Model($dao);<br />$model->doSomething();<br />?> </code></p>
<p> </p>
<p> 在 UML 中表现如下:</p><img src="/content/uploadfile/200805/2008053117290418.gif" onclick="get_larger(this)" /><p> Aggregation </p><p> 空心的菱形指向控制者类。</p><p> 组合聚合 Composition</p><p> 组合聚合发生在如下情况:</p><p> 第一个类(A)实例化了第二个类(B),第一个类(A)“死去”的时候,第二个类(B)同时“死去”。</p><p> 换而言之,第一个类(A)控制了第二个类(B)的全部。</p><p> PHP 例子: </p><p> <code><?php<br />class LinkWidget {<br />}<br />class View {<br />
var $linkWidget;<br />
var $page;<br />
function View () {<br />
$this->linkWidget=new LinkWidget;<br />
}<br />
function renderPage () {<br />
$this->page=$this->linkWidget->display();<br />
}<br />}<br />?> </code></p><p> UML 表现为:</p><img src="/content/uploadfile/200805/2008053117290553.gif" onclick="get_larger(this)" /><p> Aggregation</p><p> 实心的菱形指向控制者类。</p><p> 消息 Messages</p><p> 消息发生情形如下:</p><p> 一个类通过控制另一个类的实例来“交流数据” 。他们之间的关系也是聚合。在PHP中通常出现在使用::操作符号时。如下例:</p><p> <code><?php<br />class HtmlUtils {<br />
function unHtmlEntities ($str) {<br />
$trans_tbl = get_html_translation_table (HTML_ENTITIES);<br />
$trans_tbl = array_flip ($trans_tbl);<br />
return strtr ($str, $trans_tbl);<br />
}<br />}<br />class View {<br />
function renderPage () {<br />
$text=HtmlUtils::unHtmlEntities($text);<br />
}<br />}<br />?></code></p></p><p> 表现如下:</p><img src="/content/uploadfile/200805/2008053117290537.gif" onclick="get_larger(this)" /><p> One Way Message </p><p> 消息从View发往 HtmlUtils。</p><p> 当然也可以发送两种不同方式消息,如下:</p><p> <code><?php<br />class Debug {<br />
function display () {<br />
echo ($this->errorMsg);<br />
}<br />}<br />class SomeClass {<br />
var $errorMsg='This is an error message';<br />
function someFunction () {<br />
if ( DEBUG == 1 ) {<br />
Debug::display();<br />
}<br />
}<br />}<br />define ('DEBUG',1);<br />$someClass= &new SomeClass;<br />$someClass->someFunction();<br />?> </code></p><p> [ 输出: "This is an error message" ] </p><img src="/content/uploadfile/200805/2008053117290580.gif" onclick="get_larger(this)" /><p> Two Way Messages <p> 这里 SomeClass 发送一个消息到 Debug,Debug 访问 SomeClasss 的 $errorMsg 属性。</p></p>