08-類與對象

類與對象

php的類與對象這節(jié)叙谨,和其它面向對象語言可謂是基本一樣法严,如果說你學了Java或者C++,理解起來就十分容易欧宜,當然php自己也拓展了許多類的其它功能。我們一起探究下

直接看php類的代碼拴魄,學習它的類基本語法冗茸,我們可以看出席镀,php類的定義還是和Java很像的

class People
{
    private $age;
    private $name;
    //構造函數
    public function __construct($age,$name)
    {
        $this->age = $age;
        $this->name = $name;
    }
    //方法getInfo
    public function getInfo()
    {
        echo "age: ".$this->age." name: ".$this->name.self::num;
        echo "<hr>";
    }
    //析構函數
    public function __destruct()
    {
        // TODO: Implement __destruct() method.
        echo "我被釋放了";
    }
}

1.創(chuàng)建對象的六大方法

get_class(對象):可以查看這個對象的類名

//father類
class Father
{
    //構造函數
    public function __construct()
    {

    }
    //類里創(chuàng)建Father對象,返回給外界
    public function creatF()
    {
        return new self();
    }
    //類里創(chuàng)建Father對象夏漱,返回給外界
    public function creatFs()
    {
        return new static();
    }
    //析構函數
    public function __destruct()
    {
        // TODO: Implement __destruct() method.
    }
}

//Son類繼承Father類
class Son extends Father
{
    //Son類定義創(chuàng)建父親對象的方法
    public function creatS()
    {
        return new parent; // TODO: Change the autogenerated stub
    }
}
  1. 通過new直接創(chuàng)建

     $f1 = new Father();
     echo get_class($f1);//Father
    
  • 通過已經創(chuàng)建的對象間接創(chuàng)建新對象

      $f1 = new Father();
      $f2 = new $f1();
      echo get_class($f2);//Father
    
  • 通過類變量創(chuàng)建對象豪诲,php函數有函數變量,就是變量的值等于函數名挂绰,類變量也是如此屎篱,一個變量的值等于類的名稱,可以用這個變量直接創(chuàng)建對象.

      $num = "Father";
      $f3 = new $num();
      echo get_class($f3);//Father
    
  • 通過類方法self創(chuàng)建對象

      //在類里隨便創(chuàng)建個函數葵蒂,函數功能實現返回self創(chuàng)建對象就行
      $f1 = new Father();
      $f4 = $f1->creatF();
      echo get_class($f4);//Father
    
  • 通過類方法static創(chuàng)建對象

      //在類里隨便創(chuàng)建個函數芳室,函數功能實現返回static創(chuàng)建的對象
      $f1 = new Father();
      $f5 = $f1->creatFs();
      echo get_class($f5);//Father
    
  • 通過子類的間接創(chuàng)建目標父類對象,返回給外界

      $s = new Son;
      $f6 = $s->creatS();
      echo get_class($f6);//Father
    

總結刹勃,雖然我們列出來6種創(chuàng)建對象的方法,其實最多的還是第一種嚎尤,其它5種也得能看懂荔仁。

2.類常量

類常量就是類里面始終不會變化的變量,用const修飾芽死,且創(chuàng)建時常量前面不用加$符號
且前面不加權限修飾符public/protected/private,常量不可修改

class Test_1
{
    const num = 10;
    public function getNum()
    {
        echo Test_1::num;
        echo self::num;
    }
}

//類常量在類方法里面通過兩種方式訪問
//1 類名::常量
//2 self::常量
//類常量在類外面訪問也是兩種方式
//1 類名::常量
//2 實例對象::常量

$t1 = new Test_1();
$t1->getNum();//10 10
echo $t1::num;//10
echo Test_1::num;//10

3.類文件的自動加載

當我們需要調用其它php文件的類時乏梁,需要引入其它類對應的php文件,這個時候我們需要去找php文件地址关贵,而且代碼會出現大量require/include的字樣遇骑,為了省去引入文件的過程,我們可以通過spl_autoload_register(function)實現自動加載外部類

文件1

//Test1.php
<?php
class Class1{

}

文件2

//Test2.php
<?php
class Class2{

}

文件3

<?php
//聲明這個揖曾,就可以在調用外部類時落萎,自動加載文件,不用寫加載php文件了
spl_autoload_register(
    function ($name)
    {
        include_once $name.".php";
    }
);
$t1 = new Class1();//自動加載
$t2 = new Class2();//自動加載

4.對象的封裝

對象通過public/private/protected訪問控制符和get與set方法對類進行完成的封裝炭剪,除此以外练链,php還提供了讓類的外部對象可以直接訪問類里任何變量,甚至可以直接修改類里的變量.

class Father
{
    private $age;
    //構造函數
    public function __construct($age)
    {
        $this->age = $age;
    }
    //析構函數
    public function __destruct()
    {
        // TODO: Implement __destruct() method.
    }
    //設置私有age的值
    public function setAge($age)
    {
        $this->age = $age;
    }
    //返回私有age值
    public function getAge()
    {
        return $this->age;
    }
    //可以直接訪問類的全部變量
    public function __get($name)
    {
        return $this->$name;
    }
    //可以直接修改類的全部變量
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
    //查詢類是否包含這個屬性
    public function __isset($num)
    {
        return isset($this->$num);  
    }   
    //刪除類的某個屬性
    public function __unset($num)
    {
        unset($this->$num);
    }
}

//正常過程,沒有寫__get與__set函數前
$f1 = new Father(20);
$f1->age = 21;//error
echo $f1->age;//error
$f1->setAge(21);//通過方法間接修改age
echo $f1->getAge();//21
//通過設置__get奴拦,可以直接訪問原來不可以直接訪問的變量
//通過設置__set媒鼓,可以直接修改原來不可以直接修改的變量
$f1 = new Father(20);
$f1->age = 21;
echo $f1->age;//21
//通過設置__isset(),可以查看類是否存在某個屬性
echo isset($f1->age);//1,存在
//通過設置__unset(),可以刪除類的對應的屬性
unset($this->age);//類的age屬性被刪除

5.類的靜態(tài)屬性和方法

php類的靜態(tài)屬性和方法規(guī)則和Java一樣,用static修飾

  • 靜態(tài)屬性和靜態(tài)方法屬于全部類共有的错妖。
  • 靜態(tài)方法只可以調用靜態(tài)方法和靜態(tài)屬性
  • 靜態(tài)方法和屬性訪問格式 類名::靜態(tài)方法/屬性
    class Test
    {
        //靜態(tài)屬性
        public static $num = 10;
        public $arr = 20;
        //靜態(tài)方法
        public static function getNum()
        {
            echo Test::$num;
        }
        public static function getArr()
        {
            echo $this->arr;//error,靜態(tài)方法不可以訪問非靜態(tài)屬性和方法
        }

    }
    echo Test::$num;//10,通過類名直接訪問
    Test::getNum();//10,通過類名直接訪問

6.對象的克隆和拷貝

對象變量之間的賦值是引用賦值,指向同一塊內存绿鸣,
對象的克隆是值拷貝,指向兩塊內存暂氯,只是對象的值一樣潮模。

class Test_2
{
    private $age;
    public function __construct($age)
    {
        $this->age = $age;
    }

    public function __get($name)
    {
        return $this->$name;
    }

    public function __set($name, $value)
    {
        $this->$name = $value;
    }
}
$t1 = new Test_2(10);
echo $t1->age;//10
$t2 = $t1;
$t2->age = 20;
echo $t1->age." ".$t2->age;//20 20
$t3 = clone $t1;
echo $t1->age." ".$t3->age;//20 20
$t3->age = 30;
echo $t1->age." ".$t3->age;//20 30

7.抽象方法與抽象類

包含抽象方法的類就是抽象類,抽象類不能被構造株旷,只能由子類繼承后實現其全部抽象方法

//抽象類再登,不能創(chuàng)建對象
abstract class F
{
    abstract public function eat();
    abstract public function sleep();
    public function see()
    {
        echo "i am seeing";
    }
}
//繼承抽象類尔邓,實現全部抽象方法
class S extends F
{
    public function eat()
    {
        echo "i am eating";
    }
    public function sleep()
    {
        echo "i am sleeping";
    }
}
$s1 = new S;
$s1->eat();//i am eatting

8.接口

接口就是一組規(guī)范化的屬性和方法集合體,一個類實現了某接口必須實現對應接口的全部方法

  • 接口的屬性必須是常量
  • 接口的方法必須是public修飾符
    interface face1
    {
        const num = 100;
        public function add();
        public function go($num);
    }
    
    class S1 implements face1
    {
        public function add()
        {
            echo "add";
        }
    
        public function go($num)
        {
            echo $num;
        }
    }
    $s1 = new S1();
    $s1->add();//add
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末锉矢,一起剝皮案震驚了整個濱河市梯嗽,隨后出現的幾起案子,更是在濱河造成了極大的恐慌沽损,老刑警劉巖灯节,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異绵估,居然都是意外死亡炎疆,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門国裳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來形入,“玉大人,你說我怎么就攤上這事缝左∫谒欤” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵渺杉,是天一觀的道長蛇数。 經常有香客問我,道長是越,這世上最難降的妖魔是什么耳舅? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮倚评,結果婚禮上浦徊,老公的妹妹穿的比我還像新娘。我一直安慰自己天梧,他們只是感情好辑畦,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腿倚,像睡著了一般纯出。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敷燎,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天暂筝,我揣著相機與錄音,去河邊找鬼硬贯。 笑死焕襟,一個胖子當著我的面吹牛,可吹牛的內容都是我干的饭豹。 我是一名探鬼主播鸵赖,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼务漩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了它褪?” 一聲冷哼從身側響起饵骨,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茫打,沒想到半個月后居触,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡老赤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年轮洋,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抬旺。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡弊予,死狀恐怖,靈堂內的尸體忽然破棺而出开财,到底是詐尸還是另有隱情块促,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布床未,位于F島的核電站,受9級特大地震影響振坚,放射性物質發(fā)生泄漏薇搁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一渡八、第九天 我趴在偏房一處隱蔽的房頂上張望啃洋。 院中可真熱鬧,春花似錦屎鳍、人聲如沸宏娄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孵坚。三九已至,卻和暖如春窥淆,著一層夾襖步出監(jiān)牢的瞬間卖宠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工忧饭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扛伍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓词裤,卻偏偏與公主長得像刺洒,于是被迫代替她去往敵國和親鳖宾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • 常量 public class Demo3 { int num1 ; // 常量作為全局變量中沒有默認值逆航,必須賦值...
    果凍_4c9b閱讀 108評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,093評論 1 32
  • 一鼎文、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,729評論 0 10
  • 把當前目錄作為Root Document只需要這條命令即可:php -S localhost:3300 也可以指定...
    絢爛的時光閱讀 728評論 0 1
  • 飛翔 不一定需要翅膀 夢想 不一定得到贊揚 懷揣一顆平靜的心 卻在喧鬧的世界里 飽經風霜 曾以為 堅定了信念 忘記...
    Eimbro閱讀 176評論 0 0