面向?qū)ο?/h2>
面向?qū)ο蟮娜筇匦裕悍庋b躲履、繼承见间、多態(tài)
多態(tài)
多態(tài)也就是多種形態(tài),分為方法重寫和方法重載.但是PHP不允許方法重載
原因有下:
函數(shù)的重載需要滿足下面兩個條件
1工猜、參數(shù)的個數(shù)不同——而php支持參數(shù)缺省米诉,無法用參數(shù)個數(shù)區(qū)別
2、參數(shù)的類型不同——而php是弱類型語言篷帅,會根據(jù)上下文自動做類型轉(zhuǎn)換
方法重寫(override)
方法重寫:子類重寫了父類的同名的方法
有下面三個規(guī)則:
子類的方法名必須和父類的方法名一致
子類重寫的方法的參數(shù)個數(shù)可以和父類的不一致史侣,仍然可以執(zhí)行,但會彈出E_STRICT嚴格模式的警告
Declaration of Son::show(
age) should be compatible with Father::show()
<?php
class Father{
public function show(){
echo 'this is father</br>';
}
}
class Son extends Father{
public function show($name,$age){
echo 'this is Son';
}
}
?>
3.子類重寫的方法的訪問權(quán)限不能比父類的更加嚴格,也不能變?yōu)閟tatic
<?php
class Father{
public function show(){
echo 'this is father</br>';
}
}
class Son extends Father{
// 重寫為protected魏身,錯誤
protected function show(){
echo 'this is Son';
}
}
?>
報錯提示:
Fatal error: Access level to Son::show() must be public (as in class Father)
成員修飾符
static(靜態(tài)的)
static的用法與C++一樣惊橱,修飾的成員是屬于類的,而不是屬于對象箭昵,因此共存族類間税朴,所有族類都可以調(diào)用
靜態(tài)屬性
靜態(tài)屬性不能通過一個類已實例化的對象來訪問
靜態(tài)屬性在加載類的時候分配空間,所以不需要實例化就可以直接訪問
靜態(tài)成員在內(nèi)存只有就一份家制,是屬于類的
靜態(tài)方法
類的靜態(tài)方法不能訪問普通成員正林,只能訪問靜態(tài)成員。因為靜態(tài)成員被創(chuàng)建的時候可能還沒有任何實例被實例化
由于靜態(tài)方法不需要通過對象即可調(diào)用颤殴,static聲明的方法沒有$this
指針觅廓,所以偽變量 $this 在靜態(tài)方法中不可用。
self
self表示當(dāng)前的類
self可以防止類名修改導(dǎo)致多處修改的問題涵但,提升程序健壯性
非靜態(tài)方法被self::調(diào)用杈绸,自動轉(zhuǎn)成靜態(tài)方法(因為方法在類存在時就存在了因此可以從代碼區(qū)調(diào)用,而變量未實例化對象之前是沒有的贤笆,所以不能用self轉(zhuǎn)為靜態(tài)屬性)蝇棉,但會彈出嚴格模式的警告(Deprecated: Non-static method Son::show() should not be called statically)
讨阻,可以使用@錯誤控制運算符屏蔽掉
<?php
class Father{
}
class Son extends Father{
public function show(){
echo 'this is Son</br>';
}
public static function fun(){
echo 'this is static</br>';
//@屏蔽就不會報錯了
@self::show();
}
}
Son::fun();
?>
static靜態(tài)延時綁定芥永,確定當(dāng)前對象
可以使用static進行延時綁定,表示使用該成員的對象钝吮,而self表示的是self所在的對象
class Person {
public static $type='人類';
public function showPerson() {
//var_dump($this); //object(Student)#1 (0) { }
echo self::$type; //人類
echo static::$type; //學(xué)生 【靜態(tài)延時綁定】
}
}
class Student extends Person {
public static $type='學(xué)生';
public function showStu() {
//var_dump($this); //object(Student)#1 (0) { }
echo self::$type; //學(xué)生
echo static::$type; //學(xué)生 【靜態(tài)延時綁定】
}
}
//測試
$stu=new Student;
$stu->showPerson();
echo '<hr>';
$stu->showStu();
final
PHP 5 新增了一個 final 關(guān)鍵字
final修飾的類不能被繼承
final修飾的方法不能重寫
abstract
主要用來修飾方法和類
1埋涧、abstruct修飾的方法叫抽象方法板辽,abstruct修飾的類叫抽象類
2、任何一個類棘催,如果它里面至少有一個方法是被聲明為抽象的劲弦,那么這個類就必須被聲明為抽象的。
3醇坝、被定義為抽象的方法能聲明邑跪,不能實現(xiàn)。
4呼猪、繼承一個抽象類的時候画畅,子類必須定義父類中的所有抽象方法;另外宋距,這些方法的訪問控制不能比父類的更嚴格
interface接口
1轴踱、如果一個類中所有的方法全都是抽象方法,那么這個類就可以聲明成接口,接口是一個特殊的抽象類
3谚赎、接口中的抽象方法只能是public的淫僻,默認也是public權(quán)限
4、通過implements實現(xiàn)接口壶唤。實現(xiàn)類中必須實現(xiàn)接口中定義的所有方法雳灵,否則會報一個致命錯誤。類可以實現(xiàn)多個接口闸盔,用逗號來分隔多個接口的名稱
5细办、不能通過final和abstract修飾接口中的抽象方法
//例子來源于PHP中文網(wǎng)
<?php
// 聲明一個'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;
}
}
繼承類與實現(xiàn)接口
繼承類與實現(xiàn)接口時,要先繼承類再實現(xiàn)接口
class extends Father implements interface{}
類常量
類(接口)中可以放屬性蕾殴、方法笑撞、常量
類中的常量使用const定義,可以在類外使用::來訪問
<?php
class Father{
const cvar = 9;
}
echo Father::cvar;
?>