溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP面向?qū)ο蟮闹攸c知識點總結(jié)

發(fā)布時間:2021-09-06 15:20:08 來源:億速云 閱讀:140 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“PHP面向?qū)ο蟮闹攸c知識點總結(jié)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

本文實例匯總了PHP面向?qū)ο蟪绦蛟O(shè)計的精要。

1 使用extends實現(xiàn)繼承以及重載、魔術(shù)方法的含義

class B extends A
聲明的時候B里可以沒有A里的方法
調(diào)用的時候:

$b=new B();
$b->A里的方法();
$b->A里的屬性=1;
$b->B里的方法();
$b->B里的方法();

如果$a=new A();
可以
$a->A里的方法();
$a->A里的屬性=1;
不可以
$a->B里的方法();
$a->B里的方法();
 
重載:B繼承A ,B里實現(xiàn)和A同名的方法屬性。
PHP中的"重載"與其它絕大多數(shù)面向?qū)ο笳Z言不同。傳統(tǒng)的"重載"是用于提供多個同名的 類方法,但各方法的參數(shù)類型和個數(shù)不同。
 
魔術(shù)方法:PHP把所有以__(兩個下劃線)開頭的類方法當(dāng)成魔術(shù)方法。所以你定義自己的類方法時,不要以 __為前綴。
 
2 繼承用private和protected訪問修飾符可見性

屬性方法private不可以被繼承
屬性方法protected類外部不可見,可以被繼承
屬性方法public 所定義的類成員可以在任何地方被訪問

3 php中雙冒號::的應(yīng)用

php類代碼中常看到"::"的操作符,這個是作用域限定操作符,是用一個雙冒號"::"表示,它用來置頂類中不同作用域的級別。左邊是作用域右邊是訪問作用域的成員。
在php中定義的作用域有self和parent兩種(在php6中提供了static作用域)。
 
范圍解析操作符(也可稱作 Paamayim Nekudotayim)或者更簡單地說是一對冒號,可以用于訪問靜態(tài)成員、方法和常量,還可以用于子類覆蓋父類中的成員和方法。

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

class MyClass {
    const CONST_VALUE = 'A constant value';
}

echo MyClass::CONST_VALUE;
class OtherClass extends MyClass
{
    public static $my_static = 'static var';

    public static function doubleColon() {
        echo parent::CONST_VALUE . "\n";
        echo self::$my_static . "\n";
    }
}

OtherClass::doubleColon();
//子類覆蓋父類
class MyClass
{
    protected function myFunc() {
        echo "MyClass::myFunc()\n";
    }
}

class OtherClass extends MyClass
{
    // 覆蓋父類中的方法
    public function myFunc()
    {
        // 但仍然可以調(diào)用已被覆蓋的方法
        parent::myFunc();
        echo "OtherClass::myFunc()\n";
    }
}

$class = new OtherClass();
$class->myFunc();

4 php中this和self以及parent的作用

this:就是指向當(dāng)前對象實例的指針,不指向任何其他對象或類。
self:表示當(dāng)前類的作用域,與this不同的是它不表示類的某個特定實例,在類之外的代碼中不能使用self,而且它不能識別自己在繼承中層次的位置。也就是說,當(dāng)在擴(kuò)展類中使用self時,它調(diào)用的不是父類的方法,而是擴(kuò)展類的重載的方法。self是指向類本身,也就是self是不指向任何已經(jīng)實例化的對象,一般self使用來指向類中的靜態(tài)變量。

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

private static $firstCount = 0;
private $lastCount;

//構(gòu)造函數(shù)
function __construct()
{
     $this->lastCount = ++self:$firstCount; //使用self來調(diào)用靜態(tài)變量,使用self調(diào)用必須使用::(域運算符號)
}
parent:表示當(dāng)前類父類的作用域,其余的跟self特性一樣。parent是指向父類的指針,一般我們使用parent來調(diào)用父類的構(gòu)造函數(shù)。

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

//繼承類的構(gòu)造函數(shù)
function __construct( $personSex, $personAge )
{
         parent::__construct( "test" ); //使用parent調(diào)用了父類的構(gòu)造函數(shù)
         $this->personSex = $personSex;
          $this->personAge = $personAge;
}

5 構(gòu)造函數(shù)與析構(gòu)函數(shù)

具有構(gòu)造函數(shù)的類會在每次創(chuàng)建對象時先調(diào)用此方法,所以非常適合在使用對象之前做一些初始化工作。
function __construct() {}
如果子類中定義了構(gòu)造函數(shù)則不會暗中調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中調(diào)用 parent::__construct()。
PHP 5 引入了析構(gòu)函數(shù)的概念,這類似于其它面向?qū)ο蟮恼Z言,如 C++。析構(gòu)函數(shù)會在到某個對象的所有引用都被刪除或者當(dāng)對象被顯式銷毀時執(zhí)行。
function __destruct() {}
 
6 final 關(guān)鍵字

PHP 5 新增了一個 final 關(guān)鍵字。如果父類中的方法被聲明為final,則子類無法覆蓋該方法; 如果一個類被聲明為final,則不能被繼承。
 
7 繼承和構(gòu)造函數(shù)

父類子類結(jié)果
有構(gòu)造函數(shù)無構(gòu)造函數(shù)父構(gòu)造
有構(gòu)造函數(shù)有構(gòu)造函數(shù)子構(gòu)造


 
8 接口

可以通過interface來定義一個接口,就像定義一個標(biāo)準(zhǔn)的類一樣。
注意:
1)但其中定義所有的方法都是空的;
2)接口中定義的所有方法都必須是public,這是接口的特性;
3)實現(xiàn)多個接口時,接口中的方法不能有重名;
4)接口也可以繼承,通過使用extends操作符;
5)接口中也可以定義常量。接口常量和類常量的使用完全相同。 它們都是定值,不能被子類或子接口修改。

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

// 聲明一個'iTemplate'接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}
// 實現(xiàn)接口
// 下面的寫法是正確的
class Template implements iTemplate
{
    private $vars = array();
 
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
 
    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }
 
        return $template;
    }
}

9 屬性

類的變量成員叫做“屬性”,屬性聲明是由關(guān)鍵字public或者protected或者private開頭,然后跟一個變量來組成。 屬性中的變量可以初始化,但是初始化的值必須是常數(shù),這里的常數(shù)是指php腳本在編譯階段時就為常數(shù),而不是在編譯階段之后在運行階段運算出的常數(shù)。
在PHP5 中,預(yù)定義了兩個函數(shù)“__get()”和“__set()”來獲
取和賦值其屬性,以及檢查屬性的“__isset()”和刪除屬性的方法“__unset()”。
簡單的說一個是取值,一個是賦值。,“__set()”和“__get()”這兩個方法,這兩個方法不是默認(rèn)存在的,而是我們手工添加到類里面去的,像構(gòu)造方法(__construct())一樣, 類里面添加了才會存在,可以按下面的方式來添加這兩個方法,當(dāng)然也可以按個人的風(fēng)格來添加://__get()方法用來獲取私有屬性

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

<?php  
class Person{  
//下面是人的成員屬性   
private $name; //人的名字  
private $sex; //人的性別  
private $age; //人的年齡  
//__get()方法用來獲取私有屬性   
private function __get($property_name){  
if(isset($this->$property_name)){  
return($this->$property_name);}else {  
return(NULL);  
}  
}  
}  
//__set()方法用來設(shè)置私有屬性   
private function __set($property_name, $value){  
$this->$property_name = $value;  
}  
//__isset()方法   
private function __isset($nm){  
echo "isset()函數(shù)測定私有成員時,自動調(diào)用<br>";  
return isset($this->$nm);  
}  
//__unset()方法   
private function __unset($nm){  
echo "當(dāng)在類外部使用unset()函數(shù)來刪除私有成員時自動調(diào)用的<br>";  
unset($this->$nm);  
}  
}  
$p1=new Person();  
$p1->name="this is a person name";  
//在使用isset()函數(shù)測定私有成員時,自動調(diào)用__isset()方法幫我們完成,返回結(jié)果為true  
echo var_dump(isset($p1->name))."<br>";  
echo $p1->name."<br>";  
//在使用unset()函數(shù)刪除私有成員時,自動調(diào)用__unset()方法幫我們完成,刪除name私有屬性  
unset($p1->name);  
//已經(jīng)被刪除了, 所這行不會有輸出   
echo $p1->name;  
?>

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

<?php
class Person{
//下面是人的成員屬性
private $name;
//人的名字
private $sex;
//人的性別
private $age;
//人的年齡
//__get()方法用來獲取私有屬性
private function __get($property_name){
if(isset($this->$property_name)){
return($this->$property_name);
}else{
return(NULL);
}
}
}
//__set()方法用來設(shè)置私有屬性
private function __set($property_name, $value){
$this->$property_name = $value;
}
//__isset()方法
private function __isset($nm){
echo "isset()函數(shù)測定私有成員時,自動調(diào)用<br>";
return isset($this->$nm);
}
//__unset()方法
private function __unset($nm){
echo "當(dāng)在類外部使用unset()函數(shù)來刪除私有成員時自動調(diào)用的<br>";
unset($this->$nm);
}
}
$p1=new Person();
$p1->name="this is a person name";
//在使用isset()函數(shù)測定私有成員時,自動調(diào)用__isset()方法幫我們完成,返回結(jié)果為true
echo var_dump(isset($p1->name))."<br>";
echo $p1->name."<br>";
//在使用unset()函數(shù)刪除私有成員時,自動調(diào)用__unset()方法幫我們完成,刪除name私有屬性
unset($p1->name);
//已經(jīng)被刪除了, 所這行不會有輸出
echo $p1->name;
?>

10 克隆

對象復(fù)制可以通過clone關(guān)鍵字來完成(如果對象中存在__clone()方法,會先被調(diào)用)。對象中的 __clone()方法不能直接調(diào)用。
當(dāng)對象被復(fù)制后,PHP5會對對象的所有屬性執(zhí)行一個“淺復(fù)制”(shallow copy)。所有的屬性中的引用 仍然不變,指向原來的變量。如果定義了__clone()方法,則新創(chuàng)建的對象(復(fù)制生成的對象)中的__clone()方法會被調(diào)用, 可用于修改屬性的值(如果有必要的話)。

“PHP面向?qū)ο蟮闹攸c知識點總結(jié)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI