>php教程 >php手册 >객체지향 프론트엔드 학습 PHP 시리즈 세 번째 부분의 세 가지 주요 특징

객체지향 프론트엔드 학습 PHP 시리즈 세 번째 부분의 세 가지 주요 특징

WBOY
WBOY원래의
2016-11-16 10:24:031168검색
×
목차
[1] 캡슐화 [2] 상속 [3] 다형성

이전 단어

PHP 객체지향 프로그래밍의 세 가지 주요 특징은 캡슐화, 상속 및 다형성입니다. 이 기사에서는 PHP의 세 가지 주요 기능을 소개합니다

캡슐화

캡슐화는 개체의 멤버 속성과 멤버 메서드에 액세스 한정자(public(public), protected(protected) 또는 private(private))를 추가하여 개체의 내부 세부 정보를 최대한 숨기는 것입니다. 회원 접근 통제 목적을 달성하기 위해

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의 객체 모델도 상속을 사용합니다. 상속은 클래스와 객체 및 객체 간의 관계에 영향을 미칩니다

클래스를 확장하면 하위 클래스는 상위 클래스의 모든 공개 및 보호 메서드를 상속받습니다. 하위 클래스가 상위 클래스의 메서드를 재정의하지 않는 한 상속된 메서드는 원래 기능을 유지합니다.

상속은 기능적 디자인과 추상화에 매우 유용하며 유사한 객체에 새로운 기능을 추가하면 이러한 공통 기능을 다시 작성할 필요가 없습니다.

클래스 상속

클래스는 선언의 확장 키워드를 사용하여 다른 클래스의 메서드와 속성을 상속받을 수 있습니다. 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(); 

초록

객체 지향 언어에서 클래스는 하나 이상의 하위 클래스를 가질 수 있으며, 각 클래스에는 외부 코드가 액세스하기 위한 인터페이스로 하나 이상의 공개 메서드가 있습니다. 상속을 용이하게 하기 위해 추상 메서드가 도입되었습니다

클래스에 메소드가 있는 경우 메소드 본문이 없습니다. 즉, 중괄호가 없으며 바로 세미콜론으로 끝납니다. 이 메소드를 추상 메소드라고 하며, 다음을 사용하여 정의해야 합니다. 키워드 요약

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

이 메소드를 포함하는 클래스는 추상 클래스여야 하며 abstract 키워드를 사용하여 선언해야 합니다

abstract로 정의된 클래스는 인스턴스화할 수 없습니다. 적어도 하나의 메소드가 추상으로 선언된 경우 모든 클래스는 추상으로 선언되어야 합니다. abstract로 정의된 메서드는 호출 메서드(매개변수)만 선언하고 특정 함수 구현을 정의할 수 없습니다.

추상 메소드의 역할은 서브클래스가 이 메소드를 구현해야 함을 규정하는 것입니다. 함수는 서브클래스에 전달되고, 특정 구현은 없이 구조만 작성됩니다. 자체 함수에 따라 구현합니다. 추상 클래스의 기능은 하위 클래스의 구조를 요구하므로 추상 클래스는 사양입니다.

추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스의 것과 동일하거나 더 완화되어야 합니다. 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다. 또한 메서드를 호출하는 메서드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일관되어야 합니다. 예를 들어 하위 클래스가 선택적 매개 변수를 정의하지만 상위 클래스의 추상 메서드 선언에 포함되지 않은 경우 두 선언 사이에 충돌이 없습니다

<?<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으로 문의하세요.