首頁  >  文章  >  php教程  >  前端學PHP之物件導向系列第三篇三大特性

前端學PHP之物件導向系列第三篇三大特性

WBOY
WBOY原創
2016-11-16 10:24:031124瀏覽
×
目錄
[1]封裝 [2]繼承[3]多態

前面的話

  php物件導向程式設計的三大特性是封裝性、繼承性和多態性。本文將介紹php的這三大特性

 

封裝

  封裝就是把物件中的成員屬性和成員方法加上存取修飾符( public(公有),protected(受保護)或private(私有)),使其盡可能隱藏物件的內部細節,以達到對成員的門禁控制

  被定義為公有的類別成員可以在任何地方被存取。被定義為受保護的類別成員則可以被其本身以及其子類別和父類別存取。被定義為私有的類別成員則只能被其定義所在的類別存取

  類屬性必須定義為公有,受保護,私有之一。如果用 var 定義,則被視為公有

<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MyClass
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$public</span> = 'Public'<span style="color: #000000;">;
    </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$protected</span> = 'Protected'<span style="color: #000000;">;
    </span><span style="color: #0000ff;">private</span> <span style="color: #800080;">$private</span> = 'Private'<span style="color: #000000;">;
    </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> printHello()
    {
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$this</span>-><span style="color: #0000ff;">public</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$this</span>-><span style="color: #0000ff;">protected</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$this</span>-><span style="color: #0000ff;">private</span><span style="color: #000000;">;
    }
}
</span><span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass();
</span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$obj</span>-><span style="color: #0000ff;">public</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> 这行能被正常执行</span>
<span style="color: #0000ff;">echo</span> <span style="color: #800080;">$obj</span>-><span style="color: #0000ff;">protected</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> 这行会产生一个致命错误</span>
<span style="color: #0000ff;">echo</span> <span style="color: #800080;">$obj</span>-><span style="color: #0000ff;">private</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> 这行也会产生一个致命错误</span>
<span style="color: #800080;">$obj</span>->printHello(); <span style="color: #008000;">//</span><span style="color: #008000;"> 输出 Public、Protected 和 Private</span>

<span style="color: #0000ff;">class</span> MyClass2 <span style="color: #0000ff;">extends</span><span style="color: #000000;"> MyClass
{
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 可以对 public 和 protected 进行重定义,但 private 而不能</span>
    <span style="color: #0000ff;">protected</span> <span style="color: #800080;">$protected</span> = 'Protected2'<span style="color: #000000;">;
    </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> printHello()
    {
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$this</span>-><span style="color: #0000ff;">public</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$this</span>-><span style="color: #0000ff;">protected</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$this</span>-><span style="color: #0000ff;">private</span><span style="color: #000000;">;
    }
}
</span><span style="color: #800080;">$obj2</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass2();
</span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$obj2</span>-><span style="color: #0000ff;">public</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> 这行能被正常执行</span>
<span style="color: #0000ff;">echo</span> <span style="color: #800080;">$obj2</span>-><span style="color: #0000ff;">private</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> 未定义 private</span>
<span style="color: #0000ff;">echo</span> <span style="color: #800080;">$obj2</span>-><span style="color: #0000ff;">protected</span>; <span style="color: #008000;">//</span><span style="color: #008000;"> 这行会产生一个致命错误</span>
<span style="color: #800080;">$obj2</span>->printHello(); <span style="color: #008000;">//</span><span style="color: #008000;"> 输出 Public、Protected2 和 Undefined</span>
?>

  類中的方法可以被定義為公有,私有或受保護。如果沒有設定這些關鍵字,則該方法預設為公有

<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MyClass
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> __construct() { }
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> MyPublic() { }
    </span><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> MyProtected() { }
    </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> MyPrivate() { }
    </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> Foo()
    {
        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">MyPublic();
        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">MyProtected();
        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">MyPrivate();
    }
}
</span><span style="color: #800080;">$myclass</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass;
</span><span style="color: #800080;">$myclass</span>->MyPublic(); <span style="color: #008000;">//</span><span style="color: #008000;"> 这行能被正常执行</span>
<span style="color: #800080;">$myclass</span>->MyProtected(); <span style="color: #008000;">//</span><span style="color: #008000;"> 这行会产生一个致命错误</span>
<span style="color: #800080;">$myclass</span>->MyPrivate(); <span style="color: #008000;">//</span><span style="color: #008000;"> 这行会产生一个致命错误</span>
<span style="color: #800080;">$myclass</span>->Foo(); <span style="color: #008000;">//</span><span style="color: #008000;"> 公有,受保护,私有都可以执行</span>

<span style="color: #0000ff;">class</span> MyClass2 <span style="color: #0000ff;">extends</span><span style="color: #000000;"> MyClass
{
    </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> Foo2()
    {
        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">MyPublic();
        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">MyProtected();
        </span><span style="color: #800080;">$this</span>->MyPrivate(); <span style="color: #008000;">//</span><span style="color: #008000;"> 这行会产生一个致命错误</span>
<span style="color: #000000;">    }
}
</span><span style="color: #800080;">$myclass2</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass2;
</span><span style="color: #800080;">$myclass2</span>->MyPublic(); <span style="color: #008000;">//</span><span style="color: #008000;"> 这行能被正常执行</span>
<span style="color: #800080;">$myclass2</span>->Foo2(); <span style="color: #008000;">//</span><span style="color: #008000;"> 公有的和受保护的都可执行,但私有的不行</span>
?>

 

繼承

  繼承已為大家所熟知的一個程式設計特性,PHP 的物件模型也使用了繼承。繼承將會影響到類別與類,物件與物件之間的關係

  當擴展一個類,子類就會繼承父類所有公有的和受保護的方法。除非子類別覆寫了父類別的方法,被繼承的方法都會保留其原始功能

  繼承對於功能的設計和抽像是非常有用的,而且對於類似的物件增加新功能就無須重新再寫這些公用的功能

類別繼承

  一個類別可以在宣告中用 extends 關鍵字繼承另一個類別的方法和屬性。 PHP不支援多重繼承,一個類別只能繼承一個基底類別

  被繼承的方法和屬性可以透過用同樣的名字重新宣告來覆寫。但是如果父類別定義方法時使用了 final,則該方法不可被覆寫

  當覆寫方法時,參數必須保持一致否則 PHP 將發出 E_STRICT 層級的錯誤訊息。但建構函式例外,建構函式可在被覆寫時使用不同的參數

<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> foo
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> printItem(<span style="color: #800080;">$string</span><span style="color: #000000;">) 
    {
        </span><span style="color: #0000ff;">echo</span> 'Foo: ' . <span style="color: #800080;">$string</span> . <span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">;
    }
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> printPHP()
    {
        </span><span style="color: #0000ff;">echo</span> 'PHP is great.' . <span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">;
    }
}
</span><span style="color: #0000ff;">class</span> bar <span style="color: #0000ff;">extends</span><span style="color: #000000;"> foo
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> printItem(<span style="color: #800080;">$string</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000ff;">echo</span> 'Bar: ' . <span style="color: #800080;">$string</span> . <span style="color: #ff00ff;">PHP_EOL</span><span style="color: #000000;">;
    }
}

</span><span style="color: #800080;">$foo</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> foo();
</span><span style="color: #800080;">$bar</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> bar();
</span><span style="color: #800080;">$foo</span>->printItem('baz'); <span style="color: #008000;">//</span><span style="color: #008000;"> Output: 'Foo: baz'</span>
<span style="color: #800080;">$foo</span>->printPHP();       <span style="color: #008000;">//</span><span style="color: #008000;"> Output: 'PHP is great' </span>
<span style="color: #800080;">$bar</span>->printItem('baz'); <span style="color: #008000;">//</span><span style="color: #008000;"> Output: 'Bar: baz'</span>
<span style="color: #800080;">$bar</span>->printPHP();       <span style="color: #008000;">//</span><span style="color: #008000;"> Output: 'PHP is great'</span>
?>

  在子類別中,使用parent存取父類別中的被覆寫的屬性和方法

<?<span style="color: #000000;">php
    </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Person {                      
        </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$name</span><span style="color: #000000;">;            
        </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$sex</span><span style="color: #000000;">;                     
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$name</span>=&ldquo;&rdquo;, <span style="color: #800080;">$sex</span>=<span style="color: #000000;">&ldquo;男&rdquo;) { }
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> say(){}   
    }
   </span><span style="color: #0000ff;">class</span> Student <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Person {  
        </span><span style="color: #0000ff;">private</span> <span style="color: #800080;">$school</span><span style="color: #000000;">;            
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$name</span>="", <span style="color: #800080;">$sex</span>="男", <span style="color: #800080;">$school</span>=""<span style="color: #000000;">) {   
            parent</span>::__construct(<span style="color: #800080;">$name</span>,<span style="color: #800080;">$sex</span><span style="color: #000000;">); 
            </span><span style="color: #800080;">$this</span>->school = <span style="color: #800080;">$school</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> say( ) {
            parent</span>::<span style="color: #000000;">say();     
            </span><span style="color: #0000ff;">echo</span> "在".<span style="color: #800080;">$this</span>->school."学校上学<br>"<span style="color: #000000;">;
        }   
    }
</span><span style="color: #800080;">$student</span> = <span style="color: #0000ff;">new</span> Student("张三","男",20, "edu"<span style="color: #000000;">); 
</span><span style="color: #800080;">$student</span>->say(); 

抽象

  在物件導向語言中,一個類別可以有一個或多個子類,而每個類別都有至少一個公有方法作為外部程式碼存取其的介面。而抽象方法就是為了方便繼承而引入的

  當類別中有一個方法,他沒有方法體,也就是沒有花括號,直接分號結束,像這種方法我們叫抽象方法,必須使用關鍵字abstract定義

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">function</span> fun();

  包含這種方法的類別必須是抽象類別也要使用關鍵字abstract加以宣告

  定義為抽象的類別不能被實例化。任何一個類,如果它裡面至少有一個方法是被聲明為抽象的,那麼這個類別就必須被宣告為抽象的。被定義為抽象的方法只是聲明了其呼叫方式(參數),不能定義其特定的功能實作

  抽象方法的作用就是規定了子類別必須有這個方法的實現,功能交給子類,只寫出結構, 而沒有具體實現,實現交給具體的子類按自己的功能去實現;抽象類的作用是要求子類別的結構,所以抽象類別就是一個規範

  繼承一個抽象類別的時候,子類別必須定義父類別中的所有抽象方法;另外,這些方法的存取控制必須和父類別中一樣(或更為寬鬆)。例如某個抽象方法被宣告為受保護的,那麼子類別中實作的方法就應該宣告為受保護的或公有的,而不能定義為私有的。此外方法的呼叫方式必須匹配,即類型和所需參數數量必須一致。例如,子類別定義了一個可選參數,而父類別抽象方法的聲明裡沒有,則兩者的聲明並無衝突

<?<span style="color: #000000;">php
    </span><span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Person {
        </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$name</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">public</span> <span style="color: #800080;">$age</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> say();        
        </span><span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> eat();
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> run() {
            </span><span style="color: #0000ff;">echo</span> "11111111111111<br>"<span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">function</span> <span style="color: #008080;">sleep</span><span style="color: #000000;">() {
            </span><span style="color: #0000ff;">echo</span> "2222222222222222<br>"<span style="color: #000000;">;
        }
    }
    </span><span style="color: #0000ff;">class</span> StudentCn <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Person {
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> say() {
            </span><span style="color: #0000ff;">echo</span> "中文<br>"<span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> eat() {
            </span><span style="color: #0000ff;">echo</span> "筷子"<span style="color: #000000;">;
        }
    }
    </span><span style="color: #0000ff;">class</span> StudentEn <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Person {
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> say() {
            </span><span style="color: #0000ff;">echo</span> "english<br>"<span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> eat() {
            </span><span style="color: #0000ff;">echo</span> "刀叉"<span style="color: #000000;">;
        }
    }
    </span><span style="color: #800080;">$s1</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> StudentEn();
    </span><span style="color: #800080;">$s1</span> -> say();<span style="color: #008000;">//</span><span style="color: #008000;">english</span>
    <span style="color: #800080;">$s1</span> -> eat();<span style="color: #008000;">//</span><span style="color: #008000;">刀叉</span>
?>

接口

  PHP与大多数面向对象编程语言一样,不支持多重继承,也就是说每个类只能继承一个父类。为了解决这个这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列函数

  使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过interface关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的

  接口中定义的所有方法都必须是公有,这是接口的特性。要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖

<span style="color: #008000;">//</span><span style="color: #008000;">实现一个接口</span>
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> iTemplate
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setVariable(<span style="color: #800080;">$name</span>, <span style="color: #800080;">$var</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> getHtml(<span style="color: #800080;">$template</span><span style="color: #000000;">);
}
</span><span style="color: #0000ff;">class</span> Template <span style="color: #0000ff;">implements</span><span style="color: #000000;"> iTemplate
{
    </span><span style="color: #0000ff;">private</span> <span style="color: #800080;">$vars</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setVariable(<span style="color: #800080;">$name</span>, <span style="color: #800080;">$var</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$this</span>->vars[<span style="color: #800080;">$name</span>] = <span style="color: #800080;">$var</span><span style="color: #000000;">;
    }
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> getHtml(<span style="color: #800080;">$template</span><span style="color: #000000;">)
    {
        </span><span style="color: #0000ff;">foreach</span>(<span style="color: #800080;">$this</span>->vars <span style="color: #0000ff;">as</span> <span style="color: #800080;">$name</span> => <span style="color: #800080;">$value</span><span style="color: #000000;">) {
            </span><span style="color: #800080;">$template</span> = <span style="color: #008080;">str_replace</span>('{' . <span style="color: #800080;">$name</span> . '}', <span style="color: #800080;">$value</span>, <span style="color: #800080;">$template</span><span style="color: #000000;">);
        }
 
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$template</span><span style="color: #000000;">;
    }
}
</span>?>
<span style="color: #008000;">//</span><span style="color: #008000;">常量不能被覆盖</span>
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> a
{
    </span><span style="color: #0000ff;">const</span> b = 'Interface constant'<span style="color: #000000;">;
}
</span><span style="color: #0000ff;">echo</span> a::<span style="color: #000000;">b;
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 错误写法,因为常量不能被覆盖。接口常量的概念和类常量是一样的。</span>
<span style="color: #0000ff;">class</span> b <span style="color: #0000ff;">implements</span><span style="color: #000000;"> a
{
    </span><span style="color: #0000ff;">const</span> b = 'Class constant'<span style="color: #000000;">;
}
</span>?>
<span style="color: #008000;">//</span><span style="color: #008000;">继承多个接口</span>
<?<span style="color: #000000;">php
</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> a
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> foo();
}
</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> b
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> bar();
}
</span><span style="color: #0000ff;">interface</span> c <span style="color: #0000ff;">extends</span> a,<span style="color: #000000;"> b
{
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> baz();
}
</span>?>

 

多态

  对象的多态性是指在父类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在父类及其各个子类中具有不同的语义。例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同

单态

  说到多态,首先要提到单态设计模式,单态模式的主要作用是保证在面向对象编程设计中,一个类只能有一个实例对象存在

<?<span style="color: #000000;">php
    </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> DB {
        </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">null</span><span style="color: #000000;">;          
        </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> __construct() {  
            </span><span style="color: #0000ff;">echo</span> "连接数据库成功<br>"<span style="color: #000000;">;
        }   
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> getInstance() {   
            </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">is_null</span>(self::<span style="color: #800080;">$obj</span><span style="color: #000000;">))                
                self</span>::<span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> self();           
            </span><span style="color: #0000ff;">return</span> self::<span style="color: #800080;">$obj</span><span style="color: #000000;">;                     
        }
        </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> query(<span style="color: #800080;">$sql</span><span style="color: #000000;">) {     
            </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$sql</span><span style="color: #000000;">;
        }
    }
    </span><span style="color: #800080;">$db</span> = DB::<span style="color: #000000;">getInstance();                 
    </span><span style="color: #800080;">$db</span> -> query("select * from user"<span style="color: #000000;">);   
</span>?>

  多态展现了动态绑定的功能,也称为“同名异式”,多态可以让软件在开发和维护时,达到充分的延伸性

  在php中,多态性就是指方法的重写,一个子类可中可以重新修改父类中的某些方法,使其具有自己的特征。重写要求子类的方法和父类的方法名称相同,这可以通过声明抽象类或是接口来规范

<?<span style="color: #000000;">php
    </span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> USB {
        </span><span style="color: #0000ff;">const</span> WIDTH = 12<span style="color: #000000;">;
        </span><span style="color: #0000ff;">const</span> HEIGHT = 3<span style="color: #000000;">;            
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> load();
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> run();
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> stop();    
    }
    </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Cumputer {
        </span><span style="color: #0000ff;">function</span> useUSB(USB <span style="color: #800080;">$usb</span><span style="color: #000000;">) {
            </span><span style="color: #800080;">$usb</span> -><span style="color: #000000;"> load();
            </span><span style="color: #800080;">$usb</span> -><span style="color: #000000;"> run();
            </span><span style="color: #800080;">$usb</span> -><span style="color: #000000;"> stop();        
        }
    
    }
    </span><span style="color: #0000ff;">class</span> Mouse <span style="color: #0000ff;">implements</span><span style="color: #000000;"> USB{
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> load() {
            </span><span style="color: #0000ff;">echo</span> "加载鼠标成功!<br>"<span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> run() {
            </span><span style="color: #0000ff;">echo</span> "运行鼠标功能!<br>"<span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> stop() {
            </span><span style="color: #0000ff;">echo</span> "鼠标工作结束!<br>"<span style="color: #000000;">;
        }
    }
    </span><span style="color: #0000ff;">class</span> KeyPress <span style="color: #0000ff;">implements</span><span style="color: #000000;"> USB {
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> load() {
            </span><span style="color: #0000ff;">echo</span> "加载键盘成功!<br>"<span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> run() {
            </span><span style="color: #0000ff;">echo</span> "运行键盘成功!<br>"<span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> stop() {
            </span><span style="color: #0000ff;">echo</span> "停止键盘使用!<br>"<span style="color: #000000;">;
        }
    }
    </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Worker {
        </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> work() {
            </span><span style="color: #800080;">$c</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Cumputer();
            </span><span style="color: #800080;">$m</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Mouse;
            </span><span style="color: #800080;">$k</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> KeyPress;
            </span><span style="color: #800080;">$c</span>->useUSB(<span style="color: #800080;">$k</span><span style="color: #000000;">);
            </span><span style="color: #800080;">$c</span>->useUSB(<span style="color: #800080;">$m</span><span style="color: #000000;">);
        }
    }
    </span><span style="color: #800080;">$w</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Worker;
    </span><span style="color: #800080;">$w</span> -><span style="color: #000000;"> work();
</span>?>
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn