«
PHP 同 UML 类图

时间:2008-5-31    作者:Deri    分类: 分享


   <p>  UML &#160;是一种表现软件形态结构的图示方式,原则上来讲他允许我们可以用画图的方式设计自己的程序,如果选择了正确的工具,还可以根据图生成代码,本文中我们可以看到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>