成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP面試??純?nèi)容之面向?qū)ο螅?)

Barry_Ng / 3801人閱讀

摘要:繼上一篇面試常考內(nèi)容之面向?qū)ο蟀l(fā)表后,今天更新,需要的可以直接點(diǎn)擊文字進(jìn)行跳轉(zhuǎn)獲取。析構(gòu)函數(shù),當(dāng)對(duì)象被銷毀時(shí)調(diào)用。

PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。
繼上一篇“PHP面試常考內(nèi)容之面向?qū)ο螅?)”發(fā)表后,今天更新(2),需要(1)的可以直接點(diǎn)擊文字進(jìn)行跳轉(zhuǎn)獲取。
整個(gè)面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉及的內(nèi)容模塊有:

一、面向?qū)ο笈c面向過(guò)程有什么區(qū)別?
二、面向?qū)ο笥惺裁刺卣鳎?/strong>
三、什么是構(gòu)造函數(shù)和析構(gòu)函數(shù)?
四、面向?qū)ο蟮淖饔糜蚍秶心膸追N?
五、PHP 中魔術(shù)方法有哪些?
六、什么是對(duì)象克???
七、this、self和parent的區(qū)別是什么?
八、抽象類與接口有什么區(qū)別與聯(lián)系?
九、PHP面向?qū)ο蟮某?济嬖囶}講解

關(guān)于PHP面向?qū)ο蟮膬?nèi)容將會(huì)被分為三篇文章進(jìn)行講解完整塊內(nèi)容,第一篇主要講解一到四點(diǎn)內(nèi)容,第二篇主要講解五到八的內(nèi)容,第三篇圍繞第九點(diǎn)進(jìn)行講解。


以下正文的內(nèi)容都來(lái)自《PHP程序員面試筆試寶典》書籍,如果轉(zhuǎn)載請(qǐng)保留出處:


五、PHP種魔術(shù)方法有哪些?

在PHP中,把所有以__(兩個(gè)下畫線)開頭的類方法保留為魔術(shù)方法。所以在定義類方法時(shí),不建議使用 __ 作為方法的前綴。下面分別介紹每個(gè)魔術(shù)方法的作用。

1.__get、__set、__isset、__unset

這四個(gè)方法是為在類和它們的父類中沒(méi)有聲明的屬性而設(shè)計(jì)的。
1)在訪問(wèn)類屬性的時(shí)候,若屬性可以訪問(wèn),則直接返回;若不可以被訪問(wèn),則調(diào)用__get?函數(shù)。
方法簽名為:public?mixed?__get?(?string?$name?)
2)在設(shè)置一個(gè)對(duì)象的屬性時(shí),若屬性可以訪問(wèn),則直接賦值;若不可以被訪問(wèn),則調(diào)用__set?函數(shù)。
方法簽名為:public?void?__set?(?string?$name?,?mixed?$value?)
3)當(dāng)對(duì)不可訪問(wèn)的屬性調(diào)用?isset()?或?empty()?時(shí),__isset()?會(huì)被調(diào)用。
方法簽名為:public?bool?__isset?(?string?$name?)
4)當(dāng)對(duì)不可訪問(wèn)屬性調(diào)用?unset()?時(shí),__unset()?會(huì)被調(diào)用。
方法簽名為:public?bool?_unset (?string?$name?)
需要注意的是,以上存在的不可訪問(wèn)包括屬性沒(méi)有定義,或者屬性的訪問(wèn)控制為proteced或private(沒(méi)有訪問(wèn)權(quán)限的屬性)。
下面通過(guò)一個(gè)例子把對(duì)象變量保存在另外一個(gè)數(shù)組中。

data[$name] = $value;
     }
     public function __get($name){
        if(array_key_exists($name, $this->data))
            return $this->data[$name];
        return NULL;
     }
     public function __isset($name){
        return isset($this->data[$name]);
     }
     public function __unset($name){
        unset($this->data[$name]);
     }
  }
  $obj = new Test;
  $obj->a = 1;
  echo $obj->a . "
";
?>

程序的運(yùn)行結(jié)果為

1
2.__construct、__destruct

1)__construct?構(gòu)造函數(shù),實(shí)例化對(duì)象時(shí)被調(diào)用。
2)__destruct?析構(gòu)函數(shù),當(dāng)對(duì)象被銷毀時(shí)調(diào)用。通常情況下,PHP只會(huì)釋放對(duì)象所占有的內(nèi)存和相關(guān)的資源,對(duì)于程序員自己申請(qǐng)的資源,需要顯式地去釋放。通??梢园研枰尫刨Y源的操作放在析構(gòu)方法中,這樣可以保證在對(duì)象被釋放的時(shí)候,程序員自己申請(qǐng)的資源也能被釋放。
例如,可以在構(gòu)造函數(shù)中打開一個(gè)文件,然后在析構(gòu)函數(shù)中關(guān)閉文件。

file = fopen("test","r");
     }
     function __destruct(){
        fclose($this->file);
     }
  }
?>
3.__call()和__callStatic()

1)__call( $method, $arg_array ):當(dāng)調(diào)用一個(gè)不可訪問(wèn)的方法時(shí)會(huì)調(diào)用這個(gè)方法。
2)__callStatic的工作方式與 __call() 類似,當(dāng)調(diào)用的靜態(tài)方法不存在或權(quán)限不足時(shí),會(huì)自動(dòng)調(diào)用__callStatic()。
使用示例如下:

    method1("參數(shù)1");
      Test::method2("參數(shù)2");
    ?>

程序的運(yùn)行結(jié)果為

調(diào)用對(duì)象方法 "method1" 參數(shù)1 
調(diào)用靜態(tài)方法 "method2" 參數(shù)2
4.__sleep()和__wakeup()

1)__sleep 串行化的時(shí)候調(diào)用。
2)__wakeup 反串行化的時(shí)候調(diào)用。
也就是說(shuō),在執(zhí)行serialize()和unserialize()時(shí),會(huì)先調(diào)用這兩個(gè)函數(shù)。例如,在序列化一個(gè)對(duì)象時(shí),如果這個(gè)對(duì)象有一個(gè)數(shù)據(jù)庫(kù)連接,想要在反序列化中恢復(fù)這個(gè)連接的狀態(tài),那么就可以通過(guò)重載這兩個(gè)方法來(lái)實(shí)現(xiàn)。示例代碼如下:

server = $server;
         $this->user = $user;
         $this->pwd = $pwd;
         $this->db = $db;
         $this->connect();
     }
     private function connect()
     {
        $this->conn = mysql_connect($this->server, $this->user, $this->pwd);
        mysql_select_db($this->db, $this->conn);
     }
     public function __sleep()
     {
        return array("server", "user", "pwd", "db");
     }
     public function __wakeup()
     {
        $this->connect();
     }
     public function __destruct(){
        mysql_close($conn);
     }
  }
?>
5.__toString()

__toString?在打印一個(gè)對(duì)象時(shí)被調(diào)用,可以在這個(gè)方法中實(shí)現(xiàn)想要打印的對(duì)象的信息,使用示例如下:

age";
     }
  }
  $obj = new Test();
  $obj->age=20;
  echo $obj;
?>

程序的運(yùn)行結(jié)果為

age:20
6.__invoke()

在引入這個(gè)魔術(shù)方法后,可以把對(duì)象名當(dāng)作方法直接調(diào)用,它會(huì)間接調(diào)用這個(gè)方法,使用示例如下:


程序的運(yùn)行結(jié)果為

hello world
7.__set_state()

調(diào)用 var_export 時(shí)被調(diào)用,用__set_state的返回值作為var_export 的返回值。使用示例如下:

name = $arr["name"];
        $obj->age = $arr["aage"];
        return $obj;
     }
  }
  $p = new People;
  $p->age = 20;
  $p->name = "James";
  var_dump(var_export($p));
?>

程序的運(yùn)行結(jié)果為

People::__set_state(array(
   "name" => "James",
   "age" => 20,
))  NULL
8.__clone()

這個(gè)方法在對(duì)象克隆的時(shí)候被調(diào)用,php提供的__clone()方法對(duì)一個(gè)對(duì)象實(shí)例進(jìn)行淺拷貝,也就是說(shuō),對(duì)對(duì)象內(nèi)的基本數(shù)值類型通過(guò)值傳遞完成拷貝,當(dāng)對(duì)象內(nèi)部有對(duì)象成員變量的時(shí)候,最好重寫__clone方法來(lái)實(shí)現(xiàn)對(duì)這個(gè)對(duì)象變量的深拷貝。使用示例如下:

age 
";
     }
  }
  class MyCloneable
  {
     public $people;
     function __clone()
     {
        $this->people = clone $this->people; //實(shí)現(xiàn)對(duì)象的深拷貝
     }
  }
  $obj1 = new MyCloneable();
  $obj1->people = new People();
  $obj1->people->age=20;
  $obj2 = clone $obj1;
  $obj2->people->age=30;
  echo $obj1->people;
  echo $obj2->people;
?>

程序的運(yùn)行結(jié)果為

age:20 age:30

由此可見,通過(guò)對(duì)象拷貝后,對(duì)其中一個(gè)對(duì)象值的修改不影響另外一個(gè)對(duì)象。

9.__autoload()

當(dāng)實(shí)例化一個(gè)對(duì)象時(shí),如果對(duì)應(yīng)的類不存在,則該方法被調(diào)用。這個(gè)方法經(jīng)常的使用方法為:在方法體中根據(jù)類名,找出類文件,然后require_one?導(dǎo)入這個(gè)文件。由此,就可以成功地創(chuàng)建對(duì)象了,使用示例如下:
Test.php:

index.php:

hello();
?>

程序的運(yùn)行結(jié)果為

Hello world

在index.php中,由于沒(méi)有包含Test.php,在實(shí)例化Test對(duì)象的時(shí)候會(huì)自動(dòng)調(diào)用__autoload方法,參數(shù)$class的值即為類名Test,這個(gè)函數(shù)中會(huì)把Test.php引進(jìn)來(lái),由此Test對(duì)象可以被正確地實(shí)例化。
這種方法的缺點(diǎn)是需要在代碼中文件路徑做硬編碼,當(dāng)修改文件結(jié)構(gòu)的時(shí)候,代碼也要跟著修改。另一方面,當(dāng)多個(gè)項(xiàng)目之間需要相互引用代碼的時(shí)候,每個(gè)項(xiàng)目中可能都有自己的__autoload,這樣會(huì)導(dǎo)致兩個(gè)__autoload沖突。當(dāng)然可以把__autoload修改成一個(gè)。這會(huì)導(dǎo)致代碼的可擴(kuò)展性和可維護(hù)性降低。由此從PHP5.1開始引入了spl_autoload,可以通過(guò)spl_autoload_register注冊(cè)多個(gè)自定義的autoload方法,使用示例如下:
index.php

hello();
?>

spl_autoload是_autoload()的默認(rèn)實(shí)現(xiàn),它會(huì)去include_path中尋找$class_name(.php/.inc)?。除了常用的spl_autoload_register外,還有如下幾個(gè)方法:
1)spl_autoload:_autoload()的默認(rèn)實(shí)現(xiàn)。
2)spl_autoload_call:這個(gè)方法會(huì)嘗試調(diào)用所有已經(jīng)注冊(cè)的__autoload方法來(lái)加載請(qǐng)求的類。
3)spl_autoload_functions:獲取所有被注冊(cè)的__autoload方法。
4)spl_autoload_register:注冊(cè)__autoload方法。
5)spl_autoload_unregister:注銷已經(jīng)注冊(cè)的__autoload方法。
6)spl_autoload_extensions:注冊(cè)并且返回spl_autoload方法使用的默認(rèn)文件的擴(kuò)展名。

引申:PHP有哪些魔術(shù)常量?

除了魔術(shù)變量外,PHP還定義了如下幾個(gè)常用的魔術(shù)常量。
1)__LINE__:返回文件中當(dāng)前的行號(hào)。
2)__FILE__:返回當(dāng)前文件的完整路徑。
3)__FUNCTION__:返回所在函數(shù)名字。
4)__CLASS__:返回所在類的名字。
5)__METHOD__:返回所在類方法的名稱。與__FUNCTION__不同的是,__METHOD__返回的是“class::function”的形式,而__FUNCTION__返回“function”的形式。
6)__DIR__:返回文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄(PHP 5.3.0中新增)。
7)__NAMESPACE__:返回當(dāng)前命名空間的名稱(區(qū)分大小寫)。此常量是在編譯時(shí)定義的(PHP 5.3.0 新增)。
8)__TRAIT__:返回 Trait 被定義時(shí)的名字。Trait 名包括其被聲明的作用區(qū)域(PHP 5.4.0 新增)。


六、什么是對(duì)象克???

對(duì)于對(duì)象而言,PHP用的是引用傳遞,也就是說(shuō),對(duì)象間的賦值操作只是賦值了一個(gè)引用的值,而不是整個(gè)對(duì)象的內(nèi)容,下面通過(guò)一個(gè)例子來(lái)說(shuō)明引用傳遞存在的問(wèn)題:

color = "Red";
  $obj2 = $obj1;
  $obj2->color ="Blue";     //$obj1->color的值也會(huì)變成"Blue"
?>

因?yàn)镻HP使用的是引用傳遞,所以在執(zhí)行$obj2 = $obj1后,$obj1和$obj2都是指向同一個(gè)內(nèi)存區(qū)(它們?cè)趦?nèi)存中的關(guān)系如下圖所示),任何一個(gè)對(duì)象屬性的修改對(duì)另外一個(gè)對(duì)象也是可見的。

在很多情況下,希望通過(guò)一個(gè)對(duì)象復(fù)制出一個(gè)一樣的但是獨(dú)立的對(duì)象。PHP提供了clone關(guān)鍵字來(lái)實(shí)現(xiàn)對(duì)象的復(fù)制。如下例所示:

color = "Red";
    $obj2 = clone $obj1;
    $obj2->color ="Blue";     //此時(shí)$obj1->color的值仍然為"Red"
?>

$obj2 = clone $obj1把obj1的整個(gè)內(nèi)存空間復(fù)制了一份存放到新的內(nèi)存空間,并且讓obj2指向這個(gè)新的內(nèi)存空間,通過(guò)clone克隆后,它們?cè)趦?nèi)存中的關(guān)系如下圖所示。

此時(shí)對(duì)obj2的修改對(duì)obj1是不可見的,因?yàn)樗鼈兪莾蓚€(gè)獨(dú)立的對(duì)象。
在學(xué)習(xí)C++的時(shí)候有深拷貝和淺拷貝的概念,顯然PHP也存在相同的問(wèn)題,通過(guò)clone關(guān)鍵字克隆出來(lái)的對(duì)象只是對(duì)象的一個(gè)淺拷貝,當(dāng)對(duì)象中沒(méi)有引用變量的時(shí)候這種方法是可以正常工作的,但是當(dāng)對(duì)象中也存在引用變量的時(shí)候,這種拷貝方式就會(huì)有問(wèn)題,下面通過(guò)一個(gè)例子來(lái)進(jìn)行說(shuō)明:

color =&$c;   //這里用的是引用傳遞
    $obj2 = clone $obj1;  //克隆一個(gè)新的對(duì)象
    $obj2->color="Blue";  //這時(shí),$obj1->color的值也變成了"Blue"
?>

在這種情況下,這兩個(gè)對(duì)象在內(nèi)存中的關(guān)系如下圖所示。

從上圖中可以看出,雖然obj1與obj2指向的對(duì)象占用了獨(dú)立的內(nèi)存空間,但是對(duì)象的屬性color仍然指向一個(gè)相同的存儲(chǔ)空間,因此當(dāng)修改了obj2->color的值后,意味著c的值被修改,顯然這個(gè)修改對(duì)obj1也是可見的。這就是一個(gè)非常典型的淺拷貝的例子。為了使兩個(gè)對(duì)象完全獨(dú)立,就需要對(duì)對(duì)象進(jìn)行深拷貝。那么如何實(shí)現(xiàn)呢,PHP提供了類似于__clone方法(類似于C++的拷貝構(gòu)造函數(shù))。把需要深拷貝的屬性,在這個(gè)方法中進(jìn)行拷貝:使用示例如下:

color = clone $this->color;
      }
    }
    $c ="Red";
    $obj1 = new My_Class ();
    $obj1->color =&$c;   
    $obj2 = clone $obj1;  
    $obj2->color="Blue";  //這時(shí),$obj1->color的值仍然為"Red"
?>

通過(guò)深拷貝后,它們?cè)趦?nèi)存中的關(guān)系如圖1-4所示。

通過(guò)在__clone方法中對(duì)對(duì)象的引用變量color進(jìn)行拷貝,使obj1與obj2完全占用兩塊獨(dú)立的存儲(chǔ)空間,對(duì)obj2的修改對(duì)obj1也不可見。


自己整理了一篇“如果遇到代碼怎么改都沒(méi)效果,怎么辦?”的文章,關(guān)注公眾號(hào):“琉憶編程庫(kù)”,回復(fù):“問(wèn)題”,我發(fā)給你。

七、this、self和parent的區(qū)別是什么?

this、self、parent三個(gè)關(guān)鍵字從字面上比較好理解,分別是指這、自己、父親。其中,this指的是指向當(dāng)前對(duì)象的指針(暫用C語(yǔ)言里面的指針來(lái)描述),self指的是指向當(dāng)前類的指針,parent指的是指向父類的指針。
以下將具體對(duì)這三個(gè)關(guān)鍵字進(jìn)行分析。

##1.this關(guān)鍵字##
  1 name = $name; // 這里已經(jīng)使用了this指針
  6         }
  7         // 析構(gòu)函數(shù)
  8         function __destruct() {
  9         }
 10          // 打印用戶名成員函數(shù)
 11          function printName() {
 12              print ($this->name."
") ; // 又使用了this指針
 13          }
 14     }
 15     // 實(shí)例化對(duì)象
 16     $nameObject = new UserName ( "heiyeluren" );
 17     // 執(zhí)行打印
 18     $nameObject->printName (); // 輸出: heiyeluren
 19     // 第二次實(shí)例化對(duì)象
 20     $nameObject2 = new UserName ( "PHP5" );
 21     // 執(zhí)行打印
 22     $nameObject2->printName (); // 輸出:PHP5
 23 ?>

上例中,分別在5行和12行使用了this指針,那么this到底是指向誰(shuí)呢?其實(shí),this是在實(shí)例化的時(shí)候來(lái)確定指向誰(shuí),例如,第一次實(shí)例化對(duì)象的時(shí)候(16行),當(dāng)時(shí)this就是指向$nameObject?對(duì)象,那么執(zhí)行第12行打印的時(shí)候就把print($this->name)變成了print ($nameObject->name),輸出"heiyeluren"。
對(duì)于第二個(gè)實(shí)例化對(duì)象,print( $this- >name )變成了print( $nameObject2->name ),于是就輸出了"PHP5"。
所以,this就是指向當(dāng)前對(duì)象實(shí)例的指針,不指向任何其他對(duì)象或類。

2.self關(guān)鍵字

先要明確一點(diǎn),self是指向類本身,也就是self是不指向任何已經(jīng)實(shí)例化的對(duì)象,一般self用來(lái)訪問(wèn)類中的靜態(tài)變量。

 1 lastCount = ++ selft::$firstCount;
 10          }
 11          // 打印lastCount數(shù)值
 12          function printLastCount() {
 13              print ($this->lastCount) ;
 14          }
 15      }
 16       // 實(shí)例化對(duì)象
 17      $countObject = new Counter ();
 18      $countObject->printLastCount (); // 輸出 1
 19 ?>

上述示例中,在第4行定義了一個(gè)靜態(tài)變量$firstCount,并且初始值為0,那么在第9行的時(shí)候調(diào)用了這個(gè)值,使用的是self來(lái)調(diào)用,中間使用域運(yùn)算符“::”來(lái)連接,這時(shí)候調(diào)用的就是類自己定義的靜態(tài)變量$firstCount,它與下面對(duì)象的實(shí)例無(wú)關(guān),只是與類有關(guān),無(wú)法使用this來(lái)引用,只能使用 self來(lái)引用,因?yàn)閟elf是指向類本身,與任何對(duì)象實(shí)例無(wú)關(guān)。

3.parent關(guān)鍵字

parent是指向父類的指針,一般使用parent來(lái)調(diào)用父類的構(gòu)造函數(shù)。

 1 name = $name;
  9           }
 10       }
 11        // 派生類
 12       class Person extends Animal  // Person類繼承了Animal類
 13       {
 14           public $personSex; // 性別
 15           public $personAge; // 年齡
 16           // 繼承類的構(gòu)造函數(shù)
 17           function __construct($personSex, $personAge) {
 18                parent::__construct ( "heiyeluren" ); // 使用parent調(diào)用了父類的構(gòu)造函數(shù)
 19                $this->personSex = $personSex;
 20                $this->personAge = $personAge;
 21           }
 22           function printPerson() {
 23                print ($this->name . " is " . $this->personSex . ",this year " . $this->personAge) ;
 24           }
 25       }
 26       // 實(shí)例化Person對(duì)象
 27       $personObject = new Person ( "male", "21" );
 28       // 執(zhí)行打印
 29       $personObject->printPerson (); // 輸出:heiyeluren is male,this year 21
 30 ?>

上例中,成員屬性都是public的,特別是父類的,是為了供繼承類通過(guò)this來(lái)訪問(wèn)。第18行: parent::__construct( "heiyeluren" ),使用了parent來(lái)調(diào)用父類的構(gòu)造函數(shù)進(jìn)行對(duì)父類的初始化,因?yàn)楦割惖某蓡T都是public的,于是就能夠在繼承類中直接使用 this來(lái)訪問(wèn)從父類繼承的屬性。


八、抽象類與接口有什么區(qū)別與聯(lián)系?

抽象類應(yīng)用的定義如下:

abstract class ClassName{
}

抽象類具有以下特點(diǎn):
1)定義一些方法,子類必須實(shí)現(xiàn)父類所有的抽象方法,只有這樣,子類才能被實(shí)例化,否則子類還是一個(gè)抽象類。
2)抽象類不能被實(shí)例化,它的意義在于被擴(kuò)展。
3)抽象方法不必實(shí)現(xiàn)具體的功能,由子類來(lái)完成。
4)當(dāng)子類實(shí)現(xiàn)抽象類的方法時(shí),這些方法的訪問(wèn)控制可以和父類中的一樣,也可以有更高的可見性,但是不能有更低的可見性。例如,某個(gè)抽象方法被聲明為protected的,那么子類中實(shí)現(xiàn)的方法就應(yīng)該聲明為protected或者public的,而不能聲明為private。
5)如果抽象方法有參數(shù),那么子類的實(shí)現(xiàn)也必須有相同的參數(shù)個(gè)數(shù),必須匹配。但有一個(gè)例外:子類可以定義一個(gè)可選參數(shù)(這個(gè)可選參數(shù)必須要有默認(rèn)值),即使父類抽象方法的聲明里沒(méi)有這個(gè)參數(shù),兩者的聲明也無(wú)沖突。下面通過(guò)一個(gè)例子來(lái)加深理解:

greet("James");
    $b->greet("James","Good morning ");
?>

程序的運(yùn)行結(jié)果為

Hello James
Good morning James

定義抽象類時(shí),通常需要遵循以下規(guī)則:
1)一個(gè)類只要含有至少一個(gè)抽象方法,就必須聲明為抽象類。
2)抽象方法不能夠含有方法體。
接口可以指定某個(gè)類必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容。在PHP中,接口是通過(guò)interface關(guān)鍵字來(lái)實(shí)現(xiàn)的,與定義一個(gè)類類似,唯一不同的是接口中定義的方法都是公有的而且方法都沒(méi)有方法體。接口中所有的方法都是公有的,此外接口中還可以定義常量。接口常量和類常量的使用完全相同,但是不能被子類或子接口所覆蓋。要實(shí)現(xiàn)一個(gè)接口,可以通過(guò)關(guān)鍵字implements來(lái)完成。實(shí)現(xiàn)接口的類中必須實(shí)現(xiàn)接口中定義的所有方法。雖然PHP不支持多重繼承,但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,用逗號(hào)來(lái)分隔多個(gè)接口的名稱。下面給出一個(gè)接口使用的示例:

name;
     }
     function setName($_name) {
        $this->name = $_name;
     }
  }

  $b = new Banana(); //創(chuàng)建對(duì)象
  $b->setName("香蕉");
  echo $b->getName();
  echo "
"; echo Banana::MAX_WEIGHT; //靜態(tài)常量 ?>

程序的運(yùn)行結(jié)果為

香蕉
3

接口和抽象類主要有以下區(qū)別:
抽象類:PHP5支持抽象類和抽象方法。被定義為抽象的類不能被實(shí)例化。任何一個(gè)類,如果它里面至少有一個(gè)方法是被聲明為抽象的,那么這個(gè)類就必須被聲明為抽象的。被定義為抽象的方法只是聲明了其調(diào)用方法和參數(shù),不能定義其具體的功能實(shí)現(xiàn)。抽象類通過(guò)關(guān)鍵字abstract來(lái)聲明。
接口:可以指定某個(gè)類必須實(shí)現(xiàn)哪些方法,但不需要定義這些方法的具體內(nèi)容。在這種情況下,可以通過(guò)interface關(guān)鍵字來(lái)定義一個(gè)接口,在接口中聲明的方法都不能有方法體。
二者雖然都是定義了抽象的方法,但是事實(shí)上兩者區(qū)別還是很大的,主要區(qū)別如下:
1)對(duì)接口的實(shí)現(xiàn)是通過(guò)關(guān)鍵字implements來(lái)實(shí)現(xiàn)的,而抽象類繼承則是使用類繼承的關(guān)鍵字extends實(shí)現(xiàn)的。
2)接口沒(méi)有數(shù)據(jù)成員(可以有常量),但是抽象類有數(shù)據(jù)成員(各種類型的成員變量),抽象類可以實(shí)現(xiàn)數(shù)據(jù)的封裝。
3)接口沒(méi)有構(gòu)造函數(shù),抽象類可以有構(gòu)造函數(shù)。
4)接口中的方法都是public類型,而抽象類中的方法可以使用private、protected或public來(lái)修飾。
5)一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口,但是只能實(shí)現(xiàn)一個(gè)抽象類。


預(yù)告:PHP面試??純?nèi)容之面向?qū)ο螅?)將于本周五(2019.2-15)更新。

以上內(nèi)容摘自《PHP程序員面試筆試寶典》書籍,該書已在天貓、京東、當(dāng)當(dāng)?shù)入娚唐脚_(tái)銷售。

更多PHP相關(guān)的面試知識(shí)、考題可以關(guān)注公眾號(hào)獲取:琉憶編程庫(kù)

對(duì)本文有什么問(wèn)題或建議都可以進(jìn)行留言,我將不斷完善追求極致,感謝你們的支持。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30084.html

相關(guān)文章

  • PHP面試常考內(nèi)容面向對(duì)象(3)

    摘要:面試專欄正式起更,每周一三五更新,提供最好最優(yōu)質(zhì)的面試內(nèi)容。繼上一篇面試??純?nèi)容之面向?qū)ο蟀l(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?。面向?qū)ο蟮闹饕卣鳛榉庋b繼承多態(tài)。為了提高內(nèi)聚性減少引起變化,單一原則是低耦合高內(nèi)聚的面向原則上的引申。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。繼上一篇PHP面試??純?nèi)容之面向?qū)ο螅?)發(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?...

    xfee 評(píng)論0 收藏0
  • PHP面試面向對(duì)象(1)

    摘要:二面向?qū)ο笥惺裁刺卣髅嫦驅(qū)ο蟮闹饕卣饔谐橄罄^承封裝和多態(tài)。析構(gòu)函數(shù)析構(gòu)函數(shù)是在引入的,它的作用與調(diào)用時(shí)機(jī)和構(gòu)造函數(shù)剛好相反,它在對(duì)象被銷毀時(shí)自動(dòng)執(zhí)行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。PHP中面向?qū)ο蟪?嫉闹R(shí)點(diǎn)有以下7點(diǎn),我將會(huì)從以下幾點(diǎn)進(jìn)行詳細(xì)介紹說(shuō)明,幫助你更好的應(yīng)對(duì)PHP面試常考的面向?qū)ο笙嚓P(guān)的知識(shí)點(diǎn)和考題。整個(gè)面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉...

    phodal 評(píng)論0 收藏0
  • PHP面試???/em>內(nèi)容Memcache和Redis(1)

    摘要:以下正文的部分內(nèi)容來(lái)自程序員面試筆試寶典書籍,如果轉(zhuǎn)載請(qǐng)保留出處一什么是是一個(gè)開源免費(fèi)高性能的分布式對(duì)象緩存系統(tǒng),它基于一個(gè)存儲(chǔ)鍵值對(duì)的來(lái)存儲(chǔ)數(shù)據(jù)到內(nèi)存中。預(yù)告面試??純?nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試??純?nèi)容之面向?qū)ο髮n}后,發(fā)布的第二個(gè)專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點(diǎn)為以下幾點(diǎn),更新時(shí)...

    wenyiweb 評(píng)論0 收藏0
  • PHP面試???/em>內(nèi)容Memcache和Redis(1)

    摘要:以下正文的部分內(nèi)容來(lái)自程序員面試筆試寶典書籍,如果轉(zhuǎn)載請(qǐng)保留出處一什么是是一個(gè)開源免費(fèi)高性能的分布式對(duì)象緩存系統(tǒng),它基于一個(gè)存儲(chǔ)鍵值對(duì)的來(lái)存儲(chǔ)數(shù)據(jù)到內(nèi)存中。預(yù)告面試??純?nèi)容之和將于本周三更新。 你好,是我琉憶。繼上周(2019.2-11至2-15)發(fā)布的PHP面試常考內(nèi)容之面向?qū)ο髮n}后,發(fā)布的第二個(gè)專題,感謝你的閱讀。本周(2019.2-18至2-22)的文章內(nèi)容點(diǎn)為以下幾點(diǎn),更新時(shí)...

    nanfeiyan 評(píng)論0 收藏0
  • PHP面試???/em>設(shè)計(jì)模式——建造者模式

    摘要:你好,是我琉憶,程序員面試筆試系列圖書的作者。建造者模式介紹建造者模式又名生成器模式,是一種對(duì)象構(gòu)建模式。表示被構(gòu)造的復(fù)雜對(duì)象。創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過(guò)程。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試??贾O(shè)計(jì)模式——工廠模式周三:PHP面試常考之設(shè)計(jì)模式——建造者模式周五:PHP面...

    alexnevsky 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<