Php面向?qū)ο?

1.類的繼承

在PHP和Java語言里面沒有多繼承字旭,只有單繼承

// 定義一個“人”類做為父類
class Person
{
    // 下面是人的成員屬性
    var $name;  //人的名子
    var $sex;   //人的性別
    var $age;   //人的年齡

    // 定義一個構(gòu)造方法參數(shù)為屬性姓名$name、性別$sex和年齡$age進(jìn)行賦值
    function __construct($name, $sex, $age) 
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }

    // 這個人可以說話的方法, 說出自己的屬性
    function say() 
    {
        echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age;
    }
}
class Student extends Person
{
    var $school;    // 學(xué)生所在學(xué)校的屬性

    // 這個學(xué)生學(xué)習(xí)的方法
    function study()
    {
        echo "我的名字叫:" . $this->name . " 我正在" . $this->school . "學(xué)習(xí)<br />";
    }
}

2.重載新的方法(parent::)

一種是使用父類的“類名::“來調(diào)用父類中被覆蓋的方法入挣;

class Student extends Person
{
    var $school;    // 學(xué)生所在學(xué)校的屬性

    function __construct($name, $sex, $age, $school)
    {
        // 使用父類中的方法為原有的屬性賦值
        parent::__construct($name, $sex, $age);
        $this->school = $school;
    }

    // 這個學(xué)生學(xué)習(xí)的方法
    function study()
    {
        echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 學(xué)習(xí)";
    }

    // 這個人可以說話的方法, 說出自己的屬性
    function say()
    {
        parent::say();

        // 加上一點(diǎn)自己的功能
        echo "我的年齡是:" . $this->age . " 我在" . $this->school . "上學(xué)";
    }
}

3.訪問類型(public专执,protected,private)

PHP5支持如下3種訪問修飾符:
public (公有的吭服、默認(rèn)的)擅羞,protected (受保護(hù)的)和private (私有的)三種尸变。
子類中方法的訪問權(quán)限一定不能低于父類被覆蓋方法的訪問權(quán)限,也就是一定要高于或等于父類方法的訪問權(quán)限减俏。

4.final關(guān)鍵字的應(yīng)用

使用final關(guān)鍵標(biāo)記的類不能被繼承召烂;

<?php
final class Person
{
    function say(){}
}
class Student extends Person
{
    function say() {}
}
?>

使用final關(guān)鍵標(biāo)記的方法不能被子類覆蓋,是最終版本垄懂;

<?php
class Person
{
    final function say()    {}
}
class Student extends Person
{
    function say()  {}
}
?>

5.static和const關(guān)鍵字的使用(self::)

類的靜態(tài)變量骑晶,非常類似全局變量痛垛,能夠被所有類的實(shí)例共享,類的靜態(tài)方法也是一樣的桶蛔,類似于全局函數(shù)匙头。

<?
class Person
{
    // 下面是人的靜態(tài)成員屬性
    public static $myCountry = "中國";

    // var $name; //人的名子

    // 這是人的靜態(tài)成員方法
    public static function say()
    {
        echo "我是中國人";
    }
}

// 輸出靜態(tài)屬性
echo Person::$myCountry;

// 訪問靜態(tài)方法
Person::say();

// 重新給靜態(tài)屬性賦值
Person::$myCountry = "美國";
echo Person::$myCountry;
?>

使用對象訪問不到靜態(tài)成員的
類里面的靜態(tài)方法只能訪問類的靜態(tài)的屬性仔雷,
靜態(tài)的方法是不用對象調(diào)用的蹂析,而是使用類名來訪問
self和$this相似,只不過self是代表這個靜態(tài)方法所在的類

<?
class Person
{
    // 下面是人的靜態(tài)成員屬性
    public static $myCountry = "中國";

    // 這是人的靜態(tài)成員方法碟婆, 通過self訪問其它靜態(tài)成員
    public static function say() 
    {
        echo "我是" . self::$myCountry;
    }
}
// 訪問靜態(tài)方法
Person::say();
?>

!!!用“const”修飾的成員屬性的訪問方式和“static”修飾的成員訪問的方式差不多电抚,也是使用“類名”,在方法里面使用“self”關(guān)鍵字竖共。但是不用使用“$”符號蝙叛,也不能使用對象來訪問

<?php
class MyClass
{
    // 定義一個常量constant
    const constant = 'constant value';

    function showConstant()
    {
        echo self::constant . " "; // 使用self訪問公给,不要加“$”
    }
}

echo MyClass::constant . " "; // 使用類名來訪問借帘,也不加“$”

$class = new MyClass();
$class->showConstant();
// echo $class::constant; // 是不允許的
?>

6.__toString()方法

<?php
// Declare a simple class
class TestClass
{
    public $foo;

    public function __construct($foo) 
    {
        $this->foo = $foo;
    }

    // 定義一個__toString方法,返加一個成員屬性$foo
    public function __toString() 
    {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
// 直接輸出對象
echo $class;
?>

7.克隆對象__clone()方法

在PHP4中我們使用“clone”這個關(guān)鍵字克隆對象淌铐;

<?
class Person
{
    // 下面是人的成員屬性
    var $name;  // 人的名子
    var $sex;   // 人的性別
    var $age;   // 人的年齡

    // 定義一個構(gòu)造方法參數(shù)為屬性姓名$name肺然、性別$sex和年齡$age進(jìn)行賦值
    function __construct($name = "", $sex = "", $age = "") 
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }

    // 這個人可以說話的方法,說出自己的屬性
    function say() 
    {
        echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
    }
}

$p1 = new Person("張三", "男", 20);

// 使用“clone”克隆新對象p2腿准,和p1對象具有相同的屬性和方法际起。
$p2=clone $p1;
$p2->say();
?>

如果想在克隆后改變原對象的內(nèi)容,需要在__clone()中重寫原本的屬性和方法吐葱, “__clone()”方法可以沒有參數(shù)街望,它自 動包含$this和$that兩個指針,$this指向復(fù)本唇撬,而$that指向原本它匕;

<?
class Person
{
    // 下面是人的成員屬性
    var $name;  // 人的名子
    var $sex;   // 人的性別
    var $age;   // 人的年齡

    // 定義一個構(gòu)造方法參數(shù)為屬性姓名$name、性別$sex和年齡$age進(jìn)行賦值
    function __construct($name = "", $sex = "", $age = "")
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }

    // 這個人可以說話的方法, 說出自己的屬性
    function say()
    {
        echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
    }

    // 對象克隆時自動調(diào)用的方法, 如果想在克隆后改變原對象的內(nèi)容窖认,需要在__clone()中重寫原本的屬性和方法
    function __clone()
    {
        // $this指的復(fù)本p2, 而$that是指向原本p1,這樣就在本方法里告希,改變了復(fù)本的屬性扑浸。
        $this->name = "我是假的 $that->name";
        $this->age = 30;
    }
}

$p1 = new Person("張三", "男", 20);
$p2 = clone $p1;
$p1->say();
$p2->say();
?>
我的名子叫:張三 性別:男 我的年齡是:20我的名子叫:我是假的張三 性別:男 我的年齡是:30

8.__call()處理調(diào)用錯誤

可不可以在程序調(diào)用對象內(nèi)部 不存在的方法時,提示我們調(diào)用的方法及使用的參數(shù)不存在燕偶,但程序還可以繼續(xù)執(zhí)行喝噪,這個時候我們就要使用在調(diào)用不存在的方法時自動調(diào)用的方 法“__call()”

<?php
//這是一個測試的類,里面沒有屬性和方法
class Test
{
}
//產(chǎn)生一個Test類的對象
$test = new Test();
//調(diào)用對象里不存在的方法
$test->demo("one", "two", "three");
//程序不會執(zhí)行到這里
echo "this is a test<br>";
?>

//Fatal error: Call to undefined method Test::demo()


<?php
//這是一個測試的類指么,里面沒有屬性和方法
class Test
{
    // 調(diào)用不存的方法時自動調(diào)用的方法酝惧,第一個參數(shù)為方法名榴鼎,第二個參數(shù)是數(shù)組參數(shù)
    function __call($function_name, $args)
    {
        print "你所調(diào)用的函數(shù):$function_name(參數(shù):";
        print_r($args);
        echo ")不存在!<br>";
    }
}
// 產(chǎn)生一個Test類的對象
$test=new Test();
// 調(diào)用對象里不存在的方法
$test->demo("one", "two", "three");
// 程序不會退出可以執(zhí)行到這里
echo "this is a test<br>";
?>

9.抽象方法和抽象類(abstract)

子類必須把父類中的抽象方法全部都實(shí)現(xiàn)晚唇,否則子類中還存在抽象方法巫财,那么子類還是抽象類,還是不能實(shí)例化類

<?
abstract class Demo
{
    var $test;

    abstract function fun1();
    abstract function fun2();

    function fun3() 
    {
        ...
    }
}
$demo = new Demo(); // 抽象類不能產(chǎn)生實(shí)例對象哩陕,所以這樣做是錯的平项,實(shí)例化對象交給子類
class Test extends Demo
{
    function fun1() 
    {
        ...
    }
    function fun2() 
    {
        ...
    }
}

$test = new Test(); // 子類可以實(shí)例化對象,因?yàn)閷?shí)現(xiàn)了父類中所有抽象方法
?>

10.PHP5接口技術(shù)(interface)

<?php
// 使用”extends”繼承另外一個接口
interface Two extends One
{
    function fun3();
    function fun4();
}
?>
<?php
// 使用“implements”這個關(guān)鍵字去實(shí)現(xiàn)接口中的抽象方法 接口和類之間
class Three implements One
{
    function fun1() 
    {
        ...
    }
    function fun2() 
    {
        ...
    }
}

// 實(shí)現(xiàn)了全部方法悍及,我們?nèi)タ梢允褂米宇惾?shí)例化對象了
$three = new Three();
?>
<?php
// 使用extends繼承一個類闽瓢,使用implements實(shí)現(xiàn)多個接口
class Four extends 類名一 implemtns 接口一, 接口二, ...
{
    // 所有接口中的方法都要實(shí)現(xiàn)才可以實(shí)例化對象
    ...
}
?>

11.多態(tài)的應(yīng)用

<?php
// 定義了一個形狀的接口,里面有兩個抽象方法讓子類去實(shí)現(xiàn)
interface Shape
{
    function area();
    function perimeter();
}

// 定義了一個矩形子類實(shí)現(xiàn)了形狀接口中的周長和面積
class Rect implements Shape
{
    private $width;
    private $height;

    function __construct($width, $height)
    {
        $this->width = $width;
        $this->height = $height;
    }

    function area()
    {
        return "矩形的面積是:" . ($this->width * $this->height);
    }

    function perimeter()
    {
        return "矩形的周長是:" . (2 * ($this->width + $this->height));
    }
}

// 定義了一個圓形子類實(shí)現(xiàn)了形狀接口中的周長和面積
class  Circular implements Shape
{
    private $radius;

    function __construct($radius)
    {
        $this->radius=$radius;
    }

    function area()
    {
        return "圓形的面積是:" . (3.14 * $this->radius * $this->radius);
    }

    function perimeter()
    {
        return "圓形的周長是:" . (2 * 3.14 * $this->radius);
    }
}

// 把子類矩形對象賦給形狀的一個引用
$shape = new Rect(5, 10);
echo $shape->area() . "<br>";
echo $shape->perimeter() . "<br>";

// 把子類圓形對象賦給形狀的一個引用
$shape = new Circular(10);
echo $shape->area() . "<br>";
echo $shape->perimeter() . "<br>";
?>

12.把對象串行化serialize()方法心赶,__sleep()方法扣讼,__wakeup()方法

有時候需要把一個對象在網(wǎng)絡(luò)上傳輸,為了方便傳輸缨叫,可以把整個對象轉(zhuǎn)化為二進(jìn)制串届谈,等到達(dá)另一端時,再還原為原來的對象弯汰,這個過程稱之為串行化(也叫序列化)

<?
class Person
{
    // 下面是人的成員屬性
    var $name;  // 人的名子
    var $sex;   // 人的性別
    var $age;   // 人的年齡

    // 定義一個構(gòu)造方法參數(shù)為屬性姓名$name艰山、性別$sex和年齡$age進(jìn)行賦值
    function __construct($name = "", $sex = "", $age = "")
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }

    // 這個人可以說話的方法, 說出自己的屬性
    function say()
    {
        echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
    }
}

$p1 = new Person("張三", "男", 20);
$p1_string = serialize($p1);    // 把一個對象串行化,返一個字符串
echo $p1_string . "<br>";       // 串行化的字符串我們通常不去解析
$p2 = unserialize($p1_string);  // 把一個串行化的字符串反串行化形成對象$p2
$p2->say();
?>

在PHP5中有兩個魔術(shù)方法__sleep()方法和__wakeup()方法咏闪,在對象串行化的時候曙搬,會調(diào)用一個__sleep()方法來完成一 些睡前的事情;而在重新醒來鸽嫂,即由二進(jìn)制串重新組成一個對象的時候纵装,則會自動調(diào)用PHP的另一個函數(shù)__wakeup(),做一些對象醒來就要做的動作据某。

<?
class Person
{
    // 下面是人的成員屬性
    var $name;  // 人的名子
    var $sex;   // 人的性別
    var $age;   // 人的年齡

    // 定義一個構(gòu)造方法參數(shù)為屬性姓名$name橡娄、性別$sex和年齡$age進(jìn)行賦值
    function __construct($name = "", $sex = "", $age = "")
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }

    // 這個人可以說話的方法, 說出自己的屬性
    function say()
    {
        echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
    }

    // 指定串行化時把返回的數(shù)組中$name和$age值串行化,忽略沒在數(shù)組中的屬性$sex
    function __sleep()
    {
        $arr = array("name", "age"); // 此時癣籽,屬性$sex將被刪除M彀Α!筷狼!
        return($arr);
    }

    // 重新生成對象時瓶籽,并重新賦值$age為40
    function __wakeup()
    {
        $this->age = 40;
    }
}

$p1 = new Person("張三", "男", 20);

// 把一個對象串行化,返一個字符串埂材,調(diào)用了__sleep()方法,忽略沒在數(shù)組中的屬性$sex
$p1_string = serialize($p1);
echo $p1_string . "<br>"; // 串行化的字符串我們通常不去解析

$p2 = unserialize($p1_string); // 反串行化形成對象$p2重新賦值$age為40
$p2->say();
?>
//output
O:6:"Person":2:{s:4:"name";s:4:"張三";s:3:"age";i:20;}
我的名子叫:張三 性別: 我的年齡是:40

13.自動加載類 __autoload()函數(shù)

在 PHP 5 中塑顺,可以定義一個 __autoload()函數(shù),它會在試圖使用尚未被定義的類時自動調(diào) 用俏险,通過調(diào)用此函數(shù)严拒,腳本引擎在 PHP 出錯失敗前有了最后一個機(jī)會加載所需的類扬绪, __autoload()函數(shù)接收的一個參數(shù),就是你想加載的類的 類名

<?php
function __autoload($classname)
{
    require_once $classname . '.php';
}

//MyClass1類不存在時裤唠,自動調(diào)用__autoload()函數(shù)挤牛,傳入?yún)?shù)”MyClass1”
$obj = new MyClass1();

//MyClass2類不存在時,自動調(diào)用__autoload()函數(shù)巧骚,傳入?yún)?shù)”MyClass2”
$obj2 = new MyClass2();
?>

注意:__autoload() 是專門為 類的不存在 而設(shè)計的I薜摺!劈彪!很多框架利用這個函數(shù)竣蹦,實(shí)現(xiàn) 類文件的自動加載 2病q小蕾久!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末之斯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子烂完,更是在濱河造成了極大的恐慌钱慢,老刑警劉巖宝磨,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疮绷,死亡現(xiàn)場離奇詭異翰舌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冬骚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門椅贱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人只冻,你說我怎么就攤上這事庇麦。” “怎么了喜德?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵山橄,是天一觀的道長。 經(jīng)常有香客問我舍悯,道長航棱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任贱呐,我火速辦了婚禮丧诺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奄薇。我一直安慰自己,他們只是感情好抗愁,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布馁蒂。 她就那樣靜靜地躺著呵晚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沫屡。 梳的紋絲不亂的頭發(fā)上饵隙,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機(jī)與錄音沮脖,去河邊找鬼金矛。 笑死,一個胖子當(dāng)著我的面吹牛勺届,可吹牛的內(nèi)容都是我干的驶俊。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼免姿,長吁一口氣:“原來是場噩夢啊……” “哼饼酿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胚膊,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤故俐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后紊婉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體药版,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年喻犁,在試婚紗的時候發(fā)現(xiàn)自己被綠了槽片。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡株汉,死狀恐怖筐乳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乔妈,我是刑警寧澤蝙云,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站路召,受9級特大地震影響勃刨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜股淡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一身隐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唯灵,春花似錦贾铝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玖绿。三九已至,卻和暖如春叁巨,著一層夾襖步出監(jiān)牢的瞬間斑匪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工锋勺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚀瘸,地道東北人。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓庶橱,卻偏偏與公主長得像贮勃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子悬包,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評論 2 361

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