淺談PHP面向對象編程

1、PHP面向對象編程基礎實踐php

<?php
/*
*    經過對象的編程方式,可將實現生活中的一切事物以對象的形式表現出來。便於理解、維護、擴展等;
*    本示例:定義一個「人」類
*    $name : 對象中的成員屬性,在此類中表示人的姓名
*    say() : 對象中的成員方法,在此類中表示人說話的方法
*    $this : PHP中的僞變量,表示自身的類
*    __construct() : php中的魔術方法,構造函數,在實例化類時自動執行
*    __destruct() : php中的魔術方法,析構函數,當類調用完成後自動執行
*/
class Human
{
    public $name;
    public $sex;
    public $age;
    public function __construct($name,$sex,$age) 
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }
    public function say()
    {
        echo '你們好,個人名字叫'.$this->name.',今年'.$this->age.'歲,個人性別是'.$this->sex;
    }
    public function __destruct()
    {
        $this->name = null;
        $this->sex = null;
        $this->age = null;
    }
}
//實例化「人」類
$male = new Human("張三","男","20");
//調用「人」類說話的方法
$male->say();

//輸出結果:你們好,個人名字叫張三,今年20歲,個人性別是男
?>

2、PHP面向對象高級編程實踐編程

知識點:類的繼承、方法重寫、訪問控制、static關鍵字、final關鍵字、數據訪問、接口、多態、抽象類ide

2.一、類的繼承:extends 關鍵字
例如:一員運行員、一位主持人,他們有人類共同的行爲方法,但他們都有本身不一樣的特長專業。所以在編程時須要給他們建立一個父類並繼承;函數

<?php
/*
*    建立一個「人」類作爲父類,繼承的子類都擁有其父類的成員屬性、方法
*/
class Human
{
    public $name;
    public function say()
    {
        echo "父類說話的方法,姓名:".$this->name."\n";
    }
    public function eat()
    {
        echo "父類吃飯的方法\n";
    }
}
/*
*    建立一個「運動員」類,繼承「人」類
*    extends : 關鍵字,繼承某個類
*/
class Sport extends Human
{
    public $type;    
    public function __construct($name,$type)
    {
        $this->name = $name;    //給父類 $name 屬性賦值
        $this->type = $type;    
    }
    public function run()
    {
        $this->say();   //調用父類「說話」的方法
        echo "我在正跑步,我是一員".$this->type."運動員.....\n";
    }
}
/*
*    建立一個「主持人」類,繼承「人」類
*    extends : 關鍵字,繼承某個類
*/
class Host extends Human
{
    public $television; 
    public function __construct($name,$television)
    {
        $this->name = $name;    
        $this->television= $television;   
    }
    public function perform()
    {
        $this->eat();   //調用父類「吃飯」的方法
        echo "我在正表演一個節目,我是".$this->television."電視臺的一名主持人.....\n";
    }
}

//實例化「運動員」類
$nba = new Sport("喬丹","籃球");
$nba->run();

//實例化「主持人」類
$tv = new Host("張三","北京衛視");
$tv->perform();

//輸出結果:
//父類說話的方法,姓名:喬丹 我在正跑步,我是一員籃球運動員..... 
//父類吃飯的方法 我在正表演一個節目,我是北京衛視電視臺的一名主持人.....
?>

2.二、方法重寫:子類重寫父類的方法this

<?php
class Human
{
    public function say()
    {
        echo "父類說話的方法";
    }
}
class Sport extends Human
{
    //重寫父類「說話」的方法
    public function say()
    {
        echo "子類說話的方法";
    }
}
$nba = new Sport();
$nba->say();
//輸出結果:子類說話的方法
?>

2.三、訪問控制:public 、 protected 、private 關鍵字
public:定義公共的成員屬性或方法,任何地方均可使用
protected : 定義受保護的成員屬性或方法,只容許類自己或子類使用
private : 定義私有的成員屬性或方法,只容許類的自己使用code

<?php
class Human
{
    public $name;
    protected $sex;
    private $age;
    
}
//實例化對象,給公共屬性賦值可正常輸出結果,外部不能給protected、private受保護的成員屬性賦值或使用
$worker = new Human();
$worker->name = "張三";
echo $worker->name;

?>

2.四、static(靜態)關鍵字
1)、靜態屬性用於保存類的公有數據;
2)、靜態方法裏面只能訪問靜態屬性或方法,不能使用 $this 僞變量;
3)、靜態成員不須要經過 new 關鍵字來實例化對象就可訪問使用;orm

<?php
class Human
{
    static $name = "張三";
    static function say()
    {
        echo "個人姓名叫:".self::$name;
    }
}
//外部使用靜態成員屬性或方法
echo Human::$name;
Human::say();

//輸出結果:張三  個人姓名叫:張三
?>

2.五、final關鍵字:不容許成員方法被重寫,不容許被繼承
例:一、對於父類「吃飯」這個方法,不但願子類重寫它;二、對於「運動員」這個類,不但願它再建立子類;對象

<?php
class Human
{
    final public function eat()
    {
        echo "父類吃飯的方法,不容許子類重寫";
    }
}
final class Sport extends Human
{
    public function eat()
    {
        echo "子類吃飯的方法。此時程序將會報致命錯誤";
    }
}
//建立一個類繼承 Sport 這個類。此時程序也將會報致命錯誤。由於 Sport 類不容許再建立子類
class Student extends Sport
{
    public $name;
}

//實例化 Sport 類 ,調用 eat() 方法
$nba = new Sport();
$nba->eat();

//實例化 Student 類 ,給 name 屬性負值
$obj = new Student();
$obj->name = "張三";

//輸出結果:Fatal error: Cannot override final method Human::eat() in ******.php on line 15
//Fatal error: Class Student may not inherit from final class (Sport) in ****.php on line 20
?>

2.六、數據訪問:$this 、 self 、parent 關鍵字
$this : 僞變量,表明類的自己,可訪問本類及父類中的成員屬性與方法。
self : 訪問類中的靜態成員屬性或方法
parent :訪問父類的成員屬性或方法繼承

<?php
class Human
{
    static $name = "張三";
}
class Sport extends Human
{
    static function getParentName()
    {
        echo parent::$name;
    }
    public function get() 
    {
       self::getParentName(); 
    }
}
$obj = new Sport();
$obj->get();
//輸出結果:張三
?>

2.七、接口:把不一樣類的共同行爲方法進行定義,但不具體實現,由子類來實現具體的方法;
例如:人會吃飯,動物也會吃飯,甚至有些植物也會吃飯,但他們吃飯的方式不同,所以這時須要定義一個接口類,具體的方式由子類來實現;
定義接口關鍵字:interface
實現接口方法關鍵字:implements接口

<?php
//定義一個接口類,有吃飯的方法,但不具體實現。
interface ICanEat
{
    public function eat($food);
}
class Human implements ICanEat
{
    //eat()方法必須由子類來實現,不然程序將報致命錯誤
    public function eat($food) 
    {
        echo "I'm eating ".$food;
    }
}
class Animal implements ICanEat
{
    public function eat($food)
    {
        echo "It's eating ".$food;
    }
}
//實例化一個「人」類
$people = new Human();
$people->eat('rice');

//實例化一個「動物」類
$monkey = new Animal();
$monkey->eat('banana');

//輸出結果:I'm eating rice
// It's eating banana

?>

2.八、多態:好比接口A有兩個實現B和C,B和C對A接口裏面定義的方法實現能夠是不一樣的,這種現象稱之爲多態;
上述實例中,ICanEat接口定義了一個eat()方法,人類吃米飯,猴子吃香蕉。他們都實現了一個「吃」的方法,但他們吃東西有不一樣的行爲,稱之爲多態;

2.九、抽象類:介入接口與類的定義之間,容許類裏面一部分方法不實現,實現一部分有相同功能且不會更改的方法。然而接口類裏面不容許有任何實現的方法。
例如:人和動物都具備吃飯與呼吸的方法,除吃飯不一樣之外,呼吸方法是相同的,此時須要定義一個抽象類來實現。
定義抽象類關鍵字:abstract

<?php
//定義一個抽象類,裏面有吃飯和呼吸的方法。呼吸方法須要在抽象類中具體實現
abstract class ICanEat
{
    abstract function eat($food);
    public function breath()
    {
        echo 'Breath use the air...';
    }
}
class Human extends ICanEat
{
    public function eat($food)
    {
        echo "I'm eating ".$food;
        $this->breath();
    }
}
//實例化「人」類
$people = new Human();
$people->eat('rice');
//輸出結果:I'm eating rice Breath use the air...
?>

3、PHP面向對象編程特殊實踐
PHP語言特定的一些魔術方法:

<?php
class Object
{
    public function __construct()
    {
        echo "當類在被實例化的時候,自動執行該函數";
    }
    public function __toString()
    {
        return "當對象被看成字符串形式輸出時,自動執行該函數";
    }
    public function __invoke($value)
    {
        echo "當對象被看成函數調用時,自動執行該函數".$value;
    }
    /*
    *    當對象訪問不存在的方法時,自動執行該函數。也稱之爲「方法重載」
    *    $fun : 方法名稱
    *    $param : 傳遞的參數
    */
    public function __call($fun,$param)
    {
        echo "調用".$fun."方法不存在,傳遞的參數".implode(',',$param);
    }
    /*
    *    當對象訪問不存在的靜態方法時,自動執行該函數。
    *    $fun : 方法名稱
    *    $param : 傳遞的參數
    */
    static function __callStatic($fun,$param)
    {
        echo "調用".$fun."靜態方法不存在,傳遞的參數".implode(',',$param);
    }
    public function __get($key)
    {
        echo "當讀取對象中不可訪問(未定義)的屬性值時,自動調用該函數。".$key."屬性不可訪問或未定義";
    }
    public function __set($key,$value)
    {
         echo "當給對象中不可訪問(未定義)的屬性賦值時,自動調用該函數。".$key."屬性不可訪問或未定義,值".$value;
    }
    public function __isset($key)
    {
        echo "判斷對象中的屬性不存在時,自動執行該函數。屬性:".$key."值未定義";
    }
    public function __unset($key)
    {
        echo "釋放對象中的不存在的屬性值時,自動執行該函數。屬性:".$key."值未定義";
    }
    public function __clone()
    {
        echo "當對象被克隆時,自動執行該函數。";
    }
    public function __destruct()
    {
        echo "當對象執行完成後,自動執行該函數";
    }
}
$obj = new Object();    //實例化對象時,調用__construct()方法
echo $obj;              //將對象以字符串形式輸出時,調用__toString()方法
$obj(123);              //當對象以函數形式調用時,執行__invoke()方法
$obj->runTest();        //當調用對象中不存在的方法時,執行__call()方法
$obj::runTest();        //當調用對象中不存在的靜態方法時,執行__callStatic()方法
$obj->name;             //當調用對象中不存在的成員屬性時,執行__get()方法
$obj->name = "張三";    //當給對象中不存在的成員屬性賦值時,執行__set()方法
isset($obj->name) ? 1 : 0;     //判斷對象中不存在的成員屬性時,執行__isset()方法
unset($obj->name);      //釋放對象中的不存在的屬性值時,執行__unset()方法
$obj2 = clone $obj;     //當對象被克隆時,執行__clone()方法
                        //對象執行完畢,執行__destruct()方法
?>
相關文章
相關標籤/搜索