【PHP】面向對象編程

以前的相關問題

  • 面向對象和麪向過程的差異,各自的優缺點程序員

  • 面向對象有哪些基本特性?各自特性帶來哪些好處設計模式

  • 面向對象的基本語法?函數

  • 面向對象的基本特性的基本實現this

  • 面向對象結合各類設計模式的使用設計

面向對象的優點

易維護、易複用、易擴展,因爲面向對象有封裝、繼承、多態性的特性,能夠設計出低耦合的系統,使系統更加靈活、更加易於維護code

面向對象的三大特性

  • 封裝:也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。封裝是面向對象的特徵之一,是對象和類概念的主要特性。 簡單的說,一個類就是一個封裝了數據以及操做這些數據的代碼的邏輯實體。在一個對象內部,某些代碼或某些數據能夠是私有的,不能被外界訪問。經過這種方式,對象對內部數據提供了不一樣級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。對象

  • 繼承:是可讓某個類型的對象得到另外一個類型的對象的屬性的方法。它支持按級分類的概念。在 OOP中,繼承的概念很好的支持了代碼的重用性(reusability),也就是說,咱們能夠向一個已經存在的類中添加新的特性,而沒必要改變這個類。這能夠經過從這個已存在的類派生一個新類來實現。這個新的類將具備原來那個類的特性,以及新的特性。而繼承機制的魅力和強大就在於它容許程序員利用已經存在的類(接近須要,而不是徹底符合須要的類),而且能夠以某種方式修改這個類,而不會影響其它的東西繼承

  • 多態:多態就是指一個類實例的相同方法在不一樣情形有不一樣表現形式。多態機制使具備不一樣內部結構的對象能夠共享相同的外部接口。這意味着,雖然針對不一樣對象的具體操做不一樣,但經過一個公共的類,它們(那些操做)能夠經過相同的方式予以調用接口

PHP面向對象的基本語法

  • 聲明一個類:
    使用一個class關鍵字,提供一個類的名字,而後列出這個累的實例應該具有的方法和屬性get

class MyClass{
    ...    //屬性列表
    
    ...    //方法列表
}

new關鍵字和構造函數
類的實例使用new關鍵字建立。

$zhangsan = new Person();

上面的代碼建立了Person類的實例,當調用new的時候PHP會分配一個新的對象,而且從你定義的類中拷貝屬性和方法,而後若是你定義了對象的構造函數的話,它會被自動調用,它在new關鍵字建立一個對象後自動裕興。構造函數一般被用來自動執行不少初始化操做。構造函數也接收參數


使用$this變量訪問方法和屬性
在對象的方法執行時,PHP會自動定義一個叫$this的特殊變量,他表示一個對對象自己的引用

$this->name;     //訪問$name非靜態屬性(注意別在屬性的名字前面加$符號)
$this->getName();    //調用類的非靜態方法

public,protected和private屬性和方法


靜態屬性
靜態屬性和常規屬性不同,靜態屬性屬於類自己而不屬於類的任何勢力。靜態屬性使用static關鍵字定義。
訪問一個靜態屬性:使用類名或者使用特殊的類名self來訪問它,self是一個方法所屬的類的縮寫。

print MyClass::$staticName;
print self::$staticName;    //在類的方法中調用

靜態方法
靜態方法是類的一部分,不屬於類的任何實例。靜態方法中不能使用任何$this,由於靜態方法跟實例無關。

class_name::method();
self::method();

類的常量
與靜態成員類似,它們屬於類自己而不屬於類的實例。類的常量對大小寫敏感。

class MyClass{
    const RED = 'red';
    
    function color(){
        return self::RED;
    }
}
print MyClass::RED;
$obj = new MyClass();
$obj->color();

多態

class Cat{
        public function miau(){
            print 'miau';
        }
    }

    class Dog{
        public function waff(){
            print 'waau';
        }
    }

    function makeSound($obj){
        if($obj instanceof Cat){
            $obj->miau();
        }else if($obj instanceof Dog){
            $obj->waff();
        }else{
            print "Error:Pass wrong kind of object!";
        }
        print "\n";
    }

    makeSound(new Cat());
    makeSound(new Dog());

上面的例子是不能夠擴展的,想增長第三個動物聲音時,不得不在makeSound()函數中增長esleif語句。能夠使用多態解決這個問題

class Animal{
        public function makeSound(){
            print "Error:should implemented class";
        }
    }

    class Cat extends Animal{
        public function makeSound(){
            print 'miau';
        }
    }

    class Dog extends Animal{
        public function makeSound(){
            print 'waau';
        }
    }

    function makeSound($obj){
        if($obj instanceof Animal){
            $obj->makeSound();
        }else{
            print "Error:Pass wrong kind of object!";
        }
        print "\n";
    }

    makeSound(new Cat());
    makeSound(new Dog());

抽象類 abstract
若是類中定義了抽象方法,那麼這個類必須定義爲抽象類,抽象類中的抽象函數沒有被實現,因此不是一個完整的類,因此不能實例化抽象類的。
若是一個類繼承了抽象類,那麼這個類必須實現抽象類的抽象方法


接口 interface

interface Loggable{
    function logString();
    
    function logErr();
}

接口中的方法都是abstract的,就是說其中的方法都沒有實現

相關文章
相關標籤/搜索