一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - php5中類的學(xué)習(xí)

php5中類的學(xué)習(xí)

2019-10-27 11:46php教程網(wǎng) PHP教程

類的結(jié)構(gòu): 類的內(nèi)部能可能有三種東西,就是常量(constant),屬性(property)和方法(method),功能可以理解成類外部的常量,變量和函數(shù)。

代碼如下:


<?php      
class TEST      
{      
    const NAME = 'value'; // 常量      
    public $name = 'value'; // 屬性      
    public function name() // 方法      
    {      
        echo 'value';      
    }      
}      
?>    



在這之中,屬性和方法又可以使用public, protected, private三個(gè)不同的關(guān)鍵字來將屬性和方法的作用范圍做進(jìn)一步的區(qū)分,帶有private關(guān)鍵字的屬性和方法,只有所在的類中的方法才能調(diào)用;帶有protected關(guān)鍵字的屬性和方法,除了自己以外,自己的父類和子類中的方法也可以調(diào)用;帶有public關(guān)鍵字的屬性和方法,則可以從實(shí)例化以后的對象中進(jìn)行調(diào)用,這樣做最大的好處給所有的屬性和方法增加了一些描述的特征,更便于整理和組織代碼的結(jié)構(gòu)。const關(guān)鍵字先跳過,和后面的static一起講。 

static關(guān)鍵字是有別于public, protected, private的另一類型關(guān)鍵字(因此可以和public, protected, private疊加起來使用): 

復(fù)制代碼代碼如下:


<?php      
class TEST      
{      
    public static function name()       
    {      
        echo 'value';      
    }      
}      
?>


帶有static關(guān)鍵字的方法,可以在不對類進(jìn)行實(shí)例化的情況下直接通過“::”符號調(diào)用,和public, protected, private的搭配,也可以讓調(diào)用區(qū)分權(quán)限,但是一般都是和public搭檔,前面提到的常量關(guān)鍵字const,應(yīng)該就是public static類型的,因此只能通過self::NAME,TEST::NAME這樣的形式調(diào)用常量,后面的__construct,__destruct等方法,都是屬于static。 

類的結(jié)構(gòu)部分,最后介紹的兩個(gè)關(guān)鍵字是abstract和final,abstract關(guān)鍵字表示這個(gè)類必須被他的子類覆寫,而final關(guān)鍵字表示這個(gè)類必須不能被他的子類覆寫,這兩個(gè)關(guān)鍵字的功能是正好相反的,帶有abstract的方法被成為抽象方法,帶有抽象方法的類,成為抽象類,這個(gè)在后面還有介紹。 

類的使用: 

類的使用主要有兩種方法,一種是使用new關(guān)鍵字,另一種是使用“::”符號: 

PHP代碼 

復(fù)制代碼代碼如下:


<?php      
class TEST      
{      
    public static function name()       
    {      
        echo 'value';      
    }      
}      
//方法1:使用new關(guān)鍵字      
$test = new TEST;      
$test->name();      

//方法2:使用“::”符號      
TEST::name();      
?> 

   

(1):使用new關(guān)鍵字成為實(shí)例化,上面的$test就是一個(gè)通過TEST類實(shí)例化而產(chǎn)生的對象,$test->name()稱為調(diào)用$test對象的name方法。 
(2):使用new關(guān)鍵字使用類的時(shí)候,可以使用$this來指代類本身。 
(3):使用“::”符號的前提是方法必須是帶有static關(guān)鍵字的,使用new關(guān)鍵字時(shí),被調(diào)用的方法,必須帶有public關(guān)鍵字(一個(gè)方法如果不帶public, protected, private中的任何一個(gè)關(guān)鍵字,則默認(rèn)為public) 
(4):同一個(gè)類可以通過new關(guān)鍵字被實(shí)例成多個(gè)不同的對象,但是彼此之間的是隔離的;“::”符號在使用的時(shí)候,方法在多次使用之間,是共享的: 

PHP代碼 

復(fù)制代碼代碼如下:


<?php      
class TEST1      
{      
    public $name = 0;      
    public function name()       
    {      
        $this->name = $this->name + 1;      
    }      
}      

$test1 = new TEST1;      
$test2 = new TEST1;      
$test1->name(); //$name1 == 1      
$test2->name(); //$name1 == 1      

/*--------------------------------------------*/     

class TEST2      
{      
    public static $name = 0;      
    public static function name()       
    {      
        TEST2::$name = TEST2::$name + 1;      

    }      
}      
TEST2::name(); // $name == 1      
TEST2::name(); // $name == 2      
?>    

類的關(guān)系: 

類與類之間的關(guān)系,主要有抽象,接口和繼承: 

PHP代碼 

復(fù)制代碼代碼如下:


<?php      
abstract class TEST1 // 抽象      
{      
    abstract public function name1();      
    public function name2()      
    {      

    }      
}      

class TEST2 extends TEST1 implements TEST3 // 繼承      
{      
    public function name1()      
    {      

    }      
}      

interface TEST3 // 接口      
{      
    public function name2();      
}      
?>   



(1)帶有abstract關(guān)鍵字的類是抽象類,帶有abstract關(guān)鍵字的方法是抽象方法,抽象類中的抽象方法,必須在子類中被覆寫。 
(2)帶有interface關(guān)鍵字的類,就是接口,接口不允許實(shí)現(xiàn)任何的方法,接口中所有的方法,都必須在子類中被覆寫。 
(3)帶有 classA extends classB 或者 classA implements classB 字樣的就是繼承,extends表示繼承另一個(gè)類,implements表示繼承另一個(gè)接口,一次只能extends一個(gè)類,但是可以implements多個(gè)接口。 
(4)抽象類,接口,以及最終繼承并實(shí)現(xiàn)的方法,都必須是public的。 

在繼承的過程中,子類會(huì)覆寫父類的同名方法,這個(gè)時(shí)候如果需要在子類中調(diào)用父類的方法,可以使用parent關(guān)鍵字或者類名加上“::”符號調(diào)用: 

PHP代碼 

復(fù)制代碼代碼如下:


<?php      
class TEST1 extends TEST2      
{      
    public function name()      
    {      
        echo parent::name2();      
        echo TEST2::name2();      
    }      
}      
class TEST2      
{      
    public function name2()      
    {      
        echo 'value2';      
    }      
}      
$test = new TEST1;      
$test->name();      
?>  

  

這里再解釋一下“::”方法在類中的作用,一個(gè)作用是在沒有實(shí)例化的情況下調(diào)用常量(其實(shí)也理解成static就可以了),static屬性和方法,再一個(gè)是在類的內(nèi)部,通過self,parent和類名建立便捷的調(diào)用通道。 

對象于對象之間的關(guān)系,主要是“==”等于,“===”全等于,不等于和clone: 

PHP代碼 
<?php     
class TEST     
{     
    public function name()     
    {     

    }     
}     

$test1 = new TEST;     
$test2 = new TEST;     
$test3 = $test1;     
echo $test1 == $test2 ? true : false; // true     
echo $test1 == $test3 ? true : false; // true     
echo $test2 == $test3 ? true : false; // true     
echo $test1 === $test2 ? true : false; // false     
echo $test1 === $test3 ? true : false; // true     
echo $test2 === $test3 ? true : false; // false     
?>    

(1)兩個(gè)類只要擁有相同的屬性和方法,就是“==”等于。 
(2)兩個(gè)類必須是指向的同一個(gè)對象,才能是“===”全等于。 

clone比較特殊,在上面的例子中,$test3 = $test1的過程并不是給了 $test3 一份 $test1 對象的拷貝,而是讓 $test3 指向了 $test1,如果一定要獲得一份$test1的拷貝,就必須使用clone關(guān)鍵字: 

PHP代碼 

復(fù)制代碼代碼如下:


<?php      
$test3 = clone $test1;      
?>    



類的鉤子: 

__autoload: 
是一個(gè)函數(shù)名,也是唯一一個(gè)在類的外部使用的鉤子,在實(shí)例化一個(gè)對象的時(shí)候,如果沒有預(yù)先載入類,就會(huì)調(diào)用這個(gè)鉤子。 

__construct 
在類被實(shí)例話的時(shí)候,被調(diào)用的鉤子,可以做一些初始化的操作。 

__destruct 
在類被銷毀的時(shí)候,被調(diào)用的鉤子。 

__call 
當(dāng)對象試圖調(diào)用一個(gè)不存在的方法的時(shí)候,被調(diào)用的鉤子 

__sleep 
當(dāng)使用serialize()函數(shù)對一個(gè)類進(jìn)行序列話操作的時(shí)候,會(huì)調(diào)用這個(gè)鉤子 

__wakeup 
當(dāng)使用unserialize()函數(shù)對一個(gè)類進(jìn)行反序列話操作的時(shí)候,會(huì)調(diào)用這個(gè)鉤子 

__toString 
當(dāng)一個(gè)對象將被轉(zhuǎn)變?yōu)樽址臅r(shí)候,會(huì)調(diào)用這個(gè)鉤子(比如echo的時(shí)候) 

__set_state 
當(dāng)調(diào)用var_export()函數(shù)操作一個(gè)類的時(shí)候,會(huì)調(diào)用這個(gè)鉤子 

__clone 
當(dāng)使用clone關(guān)鍵字對一個(gè)類進(jìn)行拷貝操作的時(shí)候,會(huì)調(diào)用這個(gè)鉤子 

__get 
在獲取一個(gè)類中的屬性值的時(shí)候,會(huì)調(diào)用這個(gè)鉤子 

__set 
在設(shè)置一個(gè)類中的屬性值的時(shí)候,會(huì)調(diào)用這個(gè)鉤子 

__isset 
在使用isset()函數(shù)對類中的屬性值進(jìn)行判定的時(shí)候,會(huì)調(diào)用這個(gè)鉤子 

__unset 
在使用unset()函數(shù)銷毀一個(gè)屬性值的時(shí)候,會(huì)調(diào)用這個(gè)鉤子 

類的小技巧: 

在實(shí)例話一個(gè)類的時(shí)候,可以使用這樣的形式給__construct鉤子傳遞參數(shù): 

PHP代碼 

復(fù)制代碼代碼如下:


<?php      
class TEST      
{      
    public function __construct($para)      
    {      
        echo $para;      
    }      
}      

$test = new TEST('value'); // 顯示 value      
?>   



foreach()函數(shù)可以用來對類或者對象中的屬性進(jìn)行遍歷,遍歷的時(shí)候會(huì)先判斷public, protected, private的情況而顯示: 

PHP代碼 

復(fù)制代碼代碼如下:


<?php      
class TEST      
{      
    public $property1 = 'value1';      
    public $property2 = 'value2';      
    public $property3 = 'value3';      

    public function name()      
    {      
        foreach($this as $key => $value)      
        {      
            print "$key => $value\n";      
        }      
    }      
}      

$test = new TEST;      
foreach($test as $key => $value)      
{      
    print "$key => $value\n";      
}      
$test->name();      
?>    


在給類中的方法傳遞參數(shù)的時(shí)候,可以對參數(shù)進(jìn)行強(qiáng)制的判定,這里只支持對數(shù)組和對象的判定: 

PHP代碼 

復(fù)制代碼代碼如下:


<?php      
class TEST1      
{      
    public function name( TEST2 $para )      
    {      

    }      
}      

class TEST2      
{      

}      

$test2 = new TEST2;      
$test1 = new TEST1;      

$test1->name('value'); // 會(huì)報(bào)錯(cuò),因?yàn)檫@個(gè)參數(shù)必須是TEST2實(shí)例化以后的對象      
$test1->name($test1); // 不會(huì)報(bào)錯(cuò)      
?>    



兼容php4的語法: 

php5的類是往下兼容php4的,這些php4時(shí)代的語法也得到了繼承,但是并不建議在php5的環(huán)境中使用。 

(1)使用var預(yù)設(shè)屬性,會(huì)自動(dòng)轉(zhuǎn)換成public。 

(2)使用類名作為構(gòu)造函數(shù),在沒有__construct構(gòu)造方法的情況下,會(huì)尋找和類名相同的函數(shù)作為構(gòu)造函數(shù)。 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天噜| 亚洲国产五月综合网 | 国产一级视频久久 | 欧美特黄一级大片 | 久久偷拍国2017| 国产91 最新 在线 | 天天天做天天天天爱天天想 | 视频大全在线观看网址 | 久久精品视在线观看85 | 韩国三级视频网站 | 97精品国产高清在线看入口 | 色老板免费 | 国产一区二区三区水野朝阳 | 成人高清网站 | nxgx在线观看国产中文 | 九草视频在线 | 视频一区国产精戏刘婷 | 天堂精品高清1区2区3区 | 丰满大乳欲妇三级k8 | 美女视频一区二区三区在线 | 免费yjsp妖精com | 2020韩国三级理论在线观看 | 亚洲成人福利 | 99在线观看视频免费精品9 | 俄罗斯激情性孕妇孕交大全 | 亚洲精品成人A8198A片漫画 | 饭冈加奈子在线播放观看 | 免费永久观看美女视频网站网址 | 丫鬟粗大狠狠贯穿h | 狠狠干2017 | 国产欧美成人不卡视频 | 日本videossexx日本人 | 无颜之月5集全免费看无删除 | 日韩在线观看一区二区不卡视频 | 四虎1515hh.com | 国产福利兔女郎在线观看 | 国内精品99 | 69日本xxⅹxxxxx19| 美女脱了内裤让男生尿囗 | 欧美日韩国产另类一区二区三区 | 涩色网|