php 面向?qū)ο?學(xué)習(xí)筆記

類温艇,成員方法,類的實(shí)例化,成員變量蜡饵,類常量

class SportObject{ //定義類
    function beatBasketball($name,$height,$age){  //聲明成員方法
        echo "姓名:".$name;
        echo "身高:".$height;
        echo "年齡:".$age;

        if($height>180 and $age>15){
            return $name."符合";
        }else{
            return $name."不符合";
        }
    }

    // 定義變量的關(guān)鍵字:public private protected static final
    public $name; //定義成員變量
    public $height;
    public $age;
    
    public function bootFootBall($name,$height,$age){ //聲明成員方法
        $this->name=$name;
        $this->height=$height;
        $this->age=$age;

        if($this->height<185 and $this->age>20){ 
            return $this->name."符合<br>"; //方法實(shí)現(xiàn)的功能
        }else{
            return $this->name."不符合<br>";
        }
    }

    const BOOK_TYPE='計(jì)算機(jī)圖書'; //聲明常量
    public $object_name; //聲明變量

    function setObjectName($name){ //聲明方法
        $this->object_name=$name; //設(shè)置成員變量值

    }

    function getObjectName(){ //聲明方法
        return $this->object_name;
    }
}
$sport=new SportObject(); //類的實(shí)例化
echo $sport->beatBasketball('空空','40','20'); //調(diào)用方法
echo $sport->bootFootball('空空','180','30'); //執(zhí)行類中的方法
//輸出計(jì)算機(jī)圖書->php類

//定義常量的關(guān)鍵字:const
$c_book=new SportObject(); //實(shí)例化
$c_book->setObjectName('php類'); //調(diào)用方法
echo SportObject::BOOK_TYPE."->"; //輸出常量
echo $c_book->getObjectName();

1.類要在一個(gè)<?php...?>中条辟,不可被分割
2.成員方法即類中函數(shù)黔夭,實(shí)現(xiàn)類的行為
3.類的實(shí)例化:對(duì)象名=new 類名
4.調(diào)用方法:對(duì)象名->成員方法
5.$this->xxx作用是調(diào)用本類中的成員變量或成員方法
6.類中的變量:成員變量
7.無論是使用$this->xxx還是對(duì)象名->xxx的格式,后面的變量都是沒有$符號(hào)的
8.輸出常量不需要實(shí)例化對(duì)象羽嫡,直接由類名::常量名調(diào)用即可(域操作符


構(gòu)造方法和析構(gòu)方法

class SportObject2{
    public $name;
    public $height;
    public $age;

    public function __construct($name,$height,$age){ //定義構(gòu)造方法
        $this->name=$name;
        $this->height=$height;
        $this->age=$age;
    }

    public function bootFoot(){
        if($this->height<185 and $this->age>20){ 
            return $this->name."都符合<br>"; //方法實(shí)現(xiàn)的功能
        }else{
            return $this->name."都不符合<br>";
        }
    }

    function showMe(){
        echo "這句話不會(huì)顯示"; //用于驗(yàn)證下面多態(tài)的覆蓋
    }

   function __destruct(){
        echo "<p>對(duì)象被銷毀本姥,調(diào)用析構(gòu)函數(shù)</p>"; 
    } 
    //當(dāng)對(duì)象結(jié)束其生命周期,如對(duì)象所在的函數(shù)已調(diào)用完畢時(shí)杭棵,系統(tǒng)自動(dòng)執(zhí)行析構(gòu)函數(shù)婚惫。

}

$sport=new SportObject2('xixi','185','29'); //實(shí)例化類并傳遞參數(shù)
// 與上面不同的是:實(shí)例化時(shí)只需一條語句即可賦值執(zhí)行
echo $sport->bootFoot(); //執(zhí)行類中的方法

1.構(gòu)造方法是生成對(duì)象時(shí)自動(dòng)執(zhí)行的方法,作用是初始化對(duì)象
2.析構(gòu)函數(shù)往往用來做“清理善后” 的工作(例如在建立對(duì)象時(shí)用new開辟了一片內(nèi)存空間魂爪,delete會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)后釋放內(nèi)存)
3.如果類中有構(gòu)造方法先舷,則在實(shí)例化時(shí)只需一條語句即可對(duì)成員變量進(jìn)行賦值$sport=new SportObject2('xixi','185','29');


繼承,多態(tài)

//子類 beatBall
class BeatBall extends SportObject2{ //定義子類甫窟,繼承父類
    public $height;
    function __construct($name,$height){ //定義構(gòu)造方法
        $this->height=$height;
        $this->name=$name;
    }

    function showMe(){ //再次定義方法showMe()->驗(yàn)證多態(tài)的覆蓋
        if($this->height>170){
            return $this->name."體重符合<br>";
        }else{
            return $this->name."體重不符合<br>";
        }
    }
}

//子類 WeightLift
class WeightLift extends SportObject2{
    function showMe(){ //再次定義方法showMe()->驗(yàn)證多態(tài)的覆蓋
        if($this->age>15){
            return $this->name."年齡符合<br>";
        }else{
            return $this->name."年齡不符合<br>";
        }
    }
}

$beatball=new BeatBall('heihei','190');
$weightlift=new WeightLift('xixi','190','25');
echo $beatball->showMe()."<br>";
//輸出:heihei體重符合 調(diào)用的是第二個(gè)showMe()方法
echo $weightlift->showMe()."<br>";
//輸出:xixi年齡符合 調(diào)用的是第三個(gè)showMe()方法

class C{ 
    function __call($name,$num){ //調(diào)用不存在的方法時(shí)會(huì)執(zhí)行的方法
        // $name 為調(diào)用的不存在的函數(shù)名
        // $num 為調(diào)用不存在函數(shù)時(shí)傳遞的參數(shù)密浑,類型為數(shù)組
        // count($array) 返回?cái)?shù)組的總個(gè)數(shù)
      
        
        echo "方法名:".$name; //輸出方法名
        echo "參數(shù)存在個(gè)數(shù):".count($num); //輸出參數(shù)個(gè)數(shù)
        if(count($num)==1){  //根據(jù)參數(shù)不同調(diào)用不同的方法
            echo $this->list1($num[0]);
        }
        if(count($num)==2){
            echo $this->list2($num[0],$num[1]);
        }

    }

    public function list1($a){
        return "list1:$a";
    }
    public function list2($a,$b){
        return "list2:a->$a,b->$b";
    }
    
}

$a=new C;
echo $a->firstshow('kongkong','18'); //兩個(gè)參數(shù)
//輸出:方法名:firstshow 參數(shù)存在個(gè)數(shù):2
echo $a->secondshow('kongkong'); //一個(gè)參數(shù)
//輸出:方法名:secondshow 參數(shù)存在個(gè)數(shù):1

1.繼承通過關(guān)鍵字 extends 來聲明 格式 class subClass extends superClass{...}
2.如果繼承的父類中無構(gòu)造函數(shù),而子類調(diào)用方法時(shí)直接實(shí)例化傳遞參數(shù)是傳遞不了的
3.多態(tài)兩種形式:覆蓋和重載
4.覆蓋:在子類中重寫父類方法粗井,調(diào)用時(shí)會(huì)先調(diào)用子類的(如上文中關(guān)于showMe()的調(diào)用
5.重載:一個(gè)標(biāo)識(shí)符被用作多個(gè)函數(shù)名尔破,且能通過函數(shù)的參數(shù)個(gè)數(shù)或參數(shù)類型將這些同名的函數(shù)區(qū)分開來街图,做到調(diào)用時(shí)不發(fā)生混淆


數(shù)據(jù)隱藏

限定類成員(包括變量和方法)訪問權(quán)限的關(guān)鍵字:public private , protected , static , final

private

class book{
    private $name='computer'; //聲明私有變量
    public function setname($name){ //設(shè)置私有變量方法
        $this->name=$name;
    }
    public function getname(){ //讀取私有變量
        return $this->name;
    }
}

class lbook extends book{

}

$lbook=new lbook();

//只能用調(diào)用成員方法的方式來訪問私有變量
echo 'true pratice:';
$lbook->setname('jiuzhe');
echo $lbook->getname();
//輸出:true pratice:jiuzhe
echo '<br>false result:'; 
echo book::$name; //錯(cuò)誤操作,會(huì)報(bào)錯(cuò)

private修飾的變量和方法只能在所屬類內(nèi)部被調(diào)用懒构,不可以在類外部被訪問餐济,子類也不行

protected

//被protected修飾可以在本類和子類中被調(diào)用
class book2{
    protected $name='computer';
}
class lbook2 extends book2{
    public function showme(){
        echo '$name:'.$this->name;
    }
}
$lbook2=new lbook2();
$lbook2->showme();
//輸出:$name:computer

protected修飾可以在本類和子類中被調(diào)用,其他地方不行

static

class book3{
    static $num=0; //聲明靜態(tài)變量$num
    public function showme(){
        echo '第'.self::$num.'位訪客';
        self::$num++; //調(diào)用靜態(tài)變量的方式
    }

}
$book1=new book3();
$book1->showme();
//輸出:第0位訪客

$book2=new book3();
$book2->showme();
//輸出:第1位訪客
echo '第'.book3::$num.'位訪客'; //直接使用類名調(diào)用靜態(tài)變量
//輸出:第2位訪客

1.關(guān)鍵字static胆剧,使用靜態(tài)變量可以不需要實(shí)例化而直接調(diào)用絮姆,如關(guān)鍵字::靜態(tài)成員
2.靜態(tài)方法只能調(diào)用靜態(tài)變量,普通方法可以調(diào)用靜態(tài)變量

final

final class finaltest{ //final類
    function __construct(){
        echo 'initialize object';
    }
}
class heihei extends finaltest{ //創(chuàng)建子類
     static function exam(){
         echo '1';
     }
 }
heihei::exam(); 
//調(diào)用子類方法 - 報(bào)錯(cuò)Class heihei may not inherit from final class

關(guān)鍵字final 秩霍,final方法不可以被繼承篙悯、不能再有子類


抽象類

abstract class commodity{ //定義抽象類,關(guān)鍵字abstract
    abstract function service($getname,$price,$num); //定義抽象方法
}
class mybook extends commodity{  //定義抽象類的子類
    function service($getname,$price,$num){ //實(shí)現(xiàn)抽象類中的方法
        echo '商品:'.$getname.',價(jià)格是:'.$price.'數(shù)量為:'.$num;
    }
}
class mycomputer extends commodity{ //定義抽象類的子類
    function service($getname,$price,$num){ //實(shí)現(xiàn)抽象類中的方法
        echo '商品:'.$getname.',價(jià)格是:'.$price.'數(shù)量為:'.$num;
    }
}
$book=new mybook();
$computer=new mycomputer();
$book->service('php','123','10');
//輸出: 商品:php,價(jià)格是:123數(shù)量為:10

1.抽象類不能被實(shí)例化铃绒,只能作為其他類的父類使用 使用 abstract 來聲明
2.抽象類至少要包含一個(gè)抽象方法
3.子類必須實(shí)現(xiàn)抽象父類的方法鸽照,除此之外可以實(shí)現(xiàn)其他的方法


接口

//聲明接口MPopedom
interface MPopedom{
    function popedom();
}
//聲明接口MPuview
interface MPuview{
    function purview();
}
//創(chuàng)建子類Member 實(shí)現(xiàn)一個(gè)接口MPuview
class Member implements MPuview{
    function purview(){
        echo '會(huì)員擁有的權(quán)限';
    }
}
//創(chuàng)建子類Manager 實(shí)現(xiàn)多個(gè)接口MPuview和MPopedom
class Manager implements MPuview,MPopedom{
    function purview(){
        echo '管理員擁有會(huì)員擁有的權(quán)限';
    }
    function popedom(){
        echo '管理員還有會(huì)員沒的';
    }
    function heihei(){ //除了接口的方法還可以實(shí)現(xiàn)新的方法
        echo 'haha !';
    }
}
$member=new Member();
$manager=new Manager();
$member->purview();
//輸出:會(huì)員擁有的權(quán)限
$manager->purview();
//輸出:管理員擁有會(huì)員擁有的權(quán)限
$manager->popedom();
//輸出:管理員還有會(huì)員沒的
$manager->heihei();
//輸出:haha !

1.接口使用interface來聲明,子類通過implements`來實(shí)現(xiàn)接口
2.要實(shí)現(xiàn)多個(gè)接口就應(yīng)在每個(gè)接口間用逗號(hào)分割颠悬,且接口中的方法需要在子類中全部實(shí)現(xiàn)
3.除了接口方法矮燎,可以使用新方法


克隆

class bookbook{
    private $obtype='book';
    public function settype($obtype){
        $this->obtype=$obtype;
    }
    public function gettype(){
        return $this->obtype;
    }
}
$book1=new bookbook();
$book2=$book1; //使用普通數(shù)據(jù)類型的方法賦值
$book2->settype('computer'); //改變$boo2的值
echo $book1->gettype().'<br>'; //輸出對(duì)象$book1的值
//輸出:computer
echo $book2->gettype(); //輸出對(duì)象$book2的值
//輸出:computer

可見連$book1的值也被改變

class cloneobject{
    private $obtype='book';
    public function settype($type){
        $this->obtype=$type;

    }
    public function gettype(){
        return $this->obtype;
    }
    public function __clone(){ //聲明clone方法
        $this->obtype='game';
    }
}
$book1=new cloneobject();
$book2=clone $book1;  //使用克隆對(duì)象的方法給對(duì)象book2賦值
echo 'book1:'.$book1->gettype();
//輸出:book1:book
echo 'book2:'.$book2->gettype();
//輸出:book2:game

使用克隆對(duì)象,$boo1的值未被改變


對(duì)象比較

class compareobject{
    private $name;
    function __construct($name){
        $this->name=$name;
    }
}
$book=new compareobject('book');
$clonebook=clone $book; //克隆對(duì)象
$rebook=$book; //引用對(duì)象
if($clonebook==$book){
    echo '兩個(gè)對(duì)象的內(nèi)容相等<br>';
}
if($rebook===$book){
    echo '兩個(gè)對(duì)象的引用地址相等';
}

輸出:
兩個(gè)對(duì)象的內(nèi)容相等
兩個(gè)對(duì)象的引用地址相等

==比較兩個(gè)對(duì)象的內(nèi)容 ===比較對(duì)象的引用地址


對(duì)象類型檢測(cè)

class objecttype{} //父類
class myitem extends objecttype{ //子類
    private $type;
}
$citem=new myitem();
if($citem instanceof myitem)
    echo '對(duì)象citem屬于myitem類<br>';
if($citem instanceof objecttype)
    echo '對(duì)象citem屬于objecttype類';

輸出:
對(duì)象citem屬于myitem類
對(duì)象citem屬于objecttype類

instanceof檢測(cè)當(dāng)前對(duì)象屬于哪個(gè)類


魔術(shù)方法 __set() __get()

class magicobject{
    private $type='';
    public function __get($name){
        if(isset($this->$name)){ //判斷變量是否被聲明
            echo '已聲明赔癌,變量值為:'.$this->$name.'<br>';
        }else{
            echo '未聲明诞外,初始化為0'.'<br>';
            $this->$name=0; //未聲明則對(duì)變量初始化
        }
    }
    public function __set($name,$value){
        if(isset($this->$name)){
            $this->$name=$value;
            echo '存在的變量,賦值為:'.$value.'<br>';
        }else{
            $this->$name=$value;
            echo '不存在的變量灾票,初始化為'.$value.'<br>';
        }
    }
}
$mycomputer=new magicobject();
$mycomputer->type='diy'; //給變量賦值
$mycomputer->type; //調(diào)用變量$type
//輸出:存在的變量峡谊,賦值為:diy<br>已聲明,變量值為:diy
$mycomputer->name; //調(diào)用變量$name
//輸出:未聲明刊苍,初始化為0<br>不存在的變量靖苇,初始化為0

1.寫入不存在或者不可見的成員變量時(shí),__set()方法班缰,兩個(gè)參數(shù),變量名和變量值(不可省略)
2.調(diào)用未定義或不可見的成員變量時(shí)悼枢,__get()方法埠忘,一個(gè)參數(shù),變量名


魔術(shù)方法 __call()

class callobject{
    public function mydream(){
        echo '方法存在<br>';
    }
    public function __call($method,$parameter){
        echo '不存在馒索,執(zhí)行__call方法<br>';
        var_dump($parameter);
    }
}
$exam=new callobject();
$exam->mydream();
//輸出:方法存在
$exam->hisdream('how','what','why');
//輸出:不存在莹妒,執(zhí)行__call方法 array(3) { [0]=> string(3) "how" [1]=> string(4) "what" [2]=> string(3) "why" }

__call()方法存儲(chǔ)方法名及參數(shù)(調(diào)用不存在或者不可見的成員方法時(shí)),兩個(gè)參數(shù):方法名和方法參數(shù)(方法參數(shù)是以數(shù)組形式存在的)


魔術(shù)方法 __sleep() __wakeup()

1.__sleep() 方法常用于提交未提交的數(shù)據(jù),或類似的清理操作绰上。同時(shí)旨怠,如果有一些很大的對(duì)象,但不需要全部保存蜈块,這個(gè)功能就很好用鉴腻。
2.__wakeup() 經(jīng)常用在反序列化操作中迷扇,例如重新建立數(shù)據(jù)庫連接,或執(zhí)行其它初始化操作爽哎。
3.實(shí)現(xiàn)序列化接口的類將不再支持__sleep()__wakeup()蜓席。


魔術(shù)方法 __toString()

class stringobject{
    private $type='diy';
    public function __toString(){ 
        return $this->type;
    }
}
$mycom=new stringobject();
echo '對(duì)象值為:'.$mycom; 
//輸出:對(duì)象值為:diy

1.__toString()echo print輸出時(shí)將對(duì)象轉(zhuǎn)化成字符串
2.如果沒有__toString直接輸出對(duì)象將發(fā)生致命錯(cuò)誤

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市课锌,隨后出現(xiàn)的幾起案子厨内,更是在濱河造成了極大的恐慌,老刑警劉巖渺贤,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雏胃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡志鞍,警方通過查閱死者的電腦和手機(jī)瞭亮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來述雾,“玉大人街州,你說我怎么就攤上這事〔C希” “怎么了唆缴?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黍翎。 經(jīng)常有香客問我面徽,道長,這世上最難降的妖魔是什么匣掸? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任趟紊,我火速辦了婚禮,結(jié)果婚禮上碰酝,老公的妹妹穿的比我還像新娘霎匈。我一直安慰自己,他們只是感情好送爸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布铛嘱。 她就那樣靜靜地躺著,像睡著了一般袭厂。 火紅的嫁衣襯著肌膚如雪墨吓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天纹磺,我揣著相機(jī)與錄音帖烘,去河邊找鬼。 笑死橄杨,一個(gè)胖子當(dāng)著我的面吹牛秘症,可吹牛的內(nèi)容都是我干的照卦。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼历极,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窄瘟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起趟卸,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蹄葱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锄列,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體图云,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年邻邮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竣况。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筒严,死狀恐怖丹泉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸭蛙,我是刑警寧澤摹恨,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站娶视,受9級(jí)特大地震影響晒哄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肪获,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一寝凌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孝赫,春花似錦较木、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刹前,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雌桑,已是汗流浹背喇喉。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留校坑,地道東北人拣技。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓千诬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膏斤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徐绑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容