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

資訊專欄INFORMATION COLUMN

PHP OOP

imtianx / 2977人閱讀

摘要:使用了一段時(shí)間從對(duì)的不了解再到使用覺得挺好特寫下看面向?qū)ο笪沂强吹倪@個(gè)雞啄米的并不是為了面向?qū)ο蠖嫦驅(qū)ο蠖菫榱诉_(dá)到代碼的重用性靈活性擴(kuò)展性對(duì)象和類從先有對(duì)象才有人類這個(gè)來說有點(diǎn)不合理的合理類具有相同屬性的一組對(duì)象的集合對(duì)象類實(shí)例化之后就

PHP 使用了一段時(shí)間, 從對(duì)OOP的不了解, 再到使用, 覺得挺好, 特寫下

看面向?qū)ο? 我是看的這個(gè)雞啄米的c++, http://www.jizhuomi.com/softw...

OOP并不是為了面向?qū)ο蠖嫦驅(qū)ο? 而是為了達(dá)到代碼的重用性、靈活性、擴(kuò)展性

對(duì)象和類

從先有對(duì)象才有人類, 這個(gè)來說, 有點(diǎn)不合理的合理

類:具有相同屬性的一組對(duì)象的集合
對(duì)象:類實(shí)例化之后就是對(duì)象
看下一般的類的定義

name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }
    // 析構(gòu)函數(shù)
    function __destruct(){
        echo "byebye
";
    }
    // 成員方法
    function eat(){
        echo "my name is ". $this->name;
    }
    function sleep(){
        echo "i am sleeping";
    }
}
// 類的實(shí)例化
$jaime = new Person("jaime", "man", 24);
$jaime->eat();

?>

保存為index.php, 在命令窗口輸入

$ php index.php
my name is jaime
byebye

如果

$jaime = new Person("jaime", "man", 24);

改為

$jaime = new Person("jaime", "man");

則會(huì)觸發(fā)異常, 會(huì)有以下的消息出來, 包括錯(cuò)誤信息, 錯(cuò)誤行數(shù), 和堆棧信息

$ php index.php

Fatal error: Uncaught exception "Exception" with message "must set name , sex, age" in E:
etindex.php on line 15

Exception: must set name , sex, age in E:
etindex.php on line 15

Call Stack:
    0.0025     242440   1. {main}() E:
etindex.php:0
    0.0025     243016   2. Person->__construct() E:
etindex.php:30
對(duì)象和內(nèi)存

說點(diǎn)理論上的東西吧,

內(nèi)存的分類:

堆(heap): 不可直接存取, 存儲(chǔ)占有空間很大的數(shù)據(jù)類型的數(shù)據(jù)

棧(stack): 可以直接存取, 存儲(chǔ)占用相同空間長(zhǎng)度并且占用空間小的數(shù)據(jù), 如存放局部變量,函數(shù)參數(shù),當(dāng)前狀態(tài),函數(shù)調(diào)用信息等

$jaime = new Person("jaime", "man", 24);

$jaime是存放在棧內(nèi)存里面的引用變量, 即存儲(chǔ)在堆中對(duì)象的首地址, 一個(gè)指針

new Person 實(shí)例化出來的對(duì)象是存放在堆內(nèi)存里面的, 是真正的對(duì)象實(shí)例

對(duì)象和成員

變量,方法(內(nèi)部成員函數(shù))的前綴:

private: 私有成員

public: ?公有成員(外部接口),沒有加修飾, 默認(rèn)就是public

protected: 保護(hù)型成員, 繼承的類可以調(diào)用

訪問private修飾的變量

Fatal error: Cannot access private property Person::$name in E:
etindex.php on line 36

如果想訪問private, protected修飾的成員:

把private改為public

使用__get(), ___set()魔術(shù)方法, 但是還是寫出代碼來看看根據(jù)實(shí)際情況使用

name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }
    function __destruct(){
        echo "byebye
";
    }

    function eat(){
        echo "my name is ". $this->name."
";
    }
    function sleep(){
        echo "i am sleeping
";
    }

    function __get($property_name){
        $access_array = ["age","name"];// 只允許訪問age,name兩個(gè)私有成員
        if(in_array($property_name, $access_array)){
            return ($this->$property_name);
        }
        else{
            return NULL;
        }
    }
    function __set($property_name, $value){
        $access_array = ["age"];// 只允許訪問age這個(gè)私有成員
        if(in_array($property_name, $access_array)){
            $this->$property_name = $value;
        }
    }

}

$jaime = new Person("jaime", "man", 24);
$jaime->eat();
echo ($jaime->age === NULL)? "NULL":$jaime->age;
echo "
";
echo ($jaime->sex === NULL)? "NULL":$jaime->sex;
$jaime->age = 80;
echo "
";
echo ($jaime->age === NULL)? "NULL":$jaime->age;
echo "
";
$jaime->name = "lll";
echo ($jaime->name === NULL)? "NULL":$jaime->name;
echo "
";
?>

執(zhí)行結(jié)果如下

$ php index.php
my name is jaime
24
NULL
80
jaime
byebye
類的繼承
name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }
    function __destruct(){
        echo "byebye
";
    }

    function hello(){
        echo "my name is ". $this->name."
";
    }
    function sleep(){
        echo "i am sleeping
";
    }
}


class Student extends Person
{
    private $school;

    function __construct($name, $sex, $age, $school)
    {
        // 調(diào)用父類方法, 構(gòu)造函數(shù)
        parent::__construct($name, $sex, $age);
        $this->school = $school;
    }
    // 重載了父類方法
    function sleep(){
        echo "afternoon sleep
";
        // 調(diào)用父類方法
        parent::sleep();
    }
}

$jaime = new Student("jaime", "man", 24,"zh");
$jaime->hello();
$jaime->sleep();
?>

執(zhí)行后輸出

$ php index.php
my name is jaime
afternoon sleep
i am sleeping

byebye

調(diào)用父類的方法需要用parent

靜態(tài)成員和常量

no bb, show code

show();
?>

結(jié)果

$ php is.php
China
 en
I live in China
I live in American
xxxAmerican en

類的靜態(tài)變量,類似于全局變量,能夠被所有類的實(shí)例共享,類的靜態(tài)方法也是一樣的,類似于全局函數(shù), 靜態(tài)成員被這個(gè)類的每個(gè)實(shí)例對(duì)象所共享

訪問靜態(tài)方法訪問靜態(tài)成員不能用$this, 需要用self

$this表示了此方法的對(duì)象

"self"表示此靜態(tài)方法所在的類, self::成員

抽象方法和抽象類

什么叫抽象?不具體的就叫抽象! so

抽象方法 : 類里面沒有具體方法體的方法(其實(shí)就是不具體的方法)

抽象類: 含有抽象方法的類,

抽象類不能實(shí)例化會(huì)報(bào)錯(cuò)"Cannot instantiate abstract class ", 有點(diǎn)像C里面的函數(shù)聲明, 僅僅只是一個(gè)聲明

fun1();
(new demo0())->fun2();
(new demo0())->fun3();
?>
接口interface 什么是接口?

如果一個(gè)內(nèi)里面所有的方法都是抽象方法, 我們可以把聲明方式換為接口

接口是一種特殊的抽象類, 接口不能包含成員的任何代碼,只定義成員身。接口成員的具體代碼由實(shí)現(xiàn)接口的類提供

接口的繼承
接口的實(shí)現(xiàn)
fun1();
(new demo())->fun2();
(new demo())->fun3();
(new demo())->fun4();
?>
一個(gè)類實(shí)現(xiàn)多個(gè)接口

一個(gè)人要遵守的法律不止一步吧, 所以see code

fun1();
(new demo())->fun2();
(new demo())->fun3();
(new demo())->fun4();
?>

你娶了你老婆你得對(duì)她的家人負(fù)責(zé)吧, 就像下面

// 使用extends繼承一個(gè)類,使用implements實(shí)現(xiàn)多個(gè)接口
class demo extend AbstractClass implements One, Two{
    ......
    // 所有接口中的方法都要實(shí)現(xiàn)才可以實(shí)例化對(duì)象
}
反射Reflection

需求: 導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細(xì)信息, 甚至是判斷某個(gè)方法是否存在
這里我不做多說, 看我在實(shí)際的項(xiàng)目中的實(shí)際應(yīng)用,
這是一個(gè)API的入口處理函數(shù), 如果存在這個(gè)方法就執(zhí)行并返回結(jié)果, 不存在就拋出異常,
因?yàn)榻涌诤瘮?shù)是不斷增加甚至是變化的, 使用反射作為api的入口可以讓你的具體的api函數(shù)變化了入口也不用改

try {
    // 使用工廠方法實(shí)例化具體的接口
    $instance = new ApiLibraryApiFactory($module, $server, $this->params);
    // 反射方法
    $action   = new ReflectionMethod($instance->instance, $method);
    // 判斷方法的類型
    if (!$action->isPublic() || $action->isStatic()) throw new ReflectionException();
    // 驗(yàn)證api參數(shù)
    $validator = new ApiLibraryApiValidator();
    $result    = $validator->check($this->params);
    if (false === $result)  {
        $this->result["code"] = $validator->code ? : $this->result["code"];
        $this->result["msg"]  = $validator->msg  ? : $this->result["msg"];
        throw new Exception();
    }
} catch(Exception $e){
    $this->_format();
}

參考:

《細(xì)說PHP 》 兄弟連

《PHP手冊(cè)》

《php面向?qū)ο?OOP)編程完全教程》

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

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

相關(guān)文章

  • Learning PHP —— 設(shè)計(jì)模式 | Chap1:淺談設(shè)計(jì)模式中的OOP

    摘要:而哈士奇區(qū)別于普通狗,又有新的特征逗比,愛搗亂為了保證類之間的松綁定,通常會(huì)繼承抽象類,而且是淺繼承只有一層子類。如果知道所有類都會(huì)共享一個(gè)公共的行為實(shí)現(xiàn),就使用抽象類,并在其中實(shí)現(xiàn)該行為。 為什么使用OOP OOP是一個(gè)模塊化的過程,目的是為了把復(fù)雜問題簡(jiǎn)單化,一個(gè)模塊解決一個(gè)復(fù)雜問題的某一個(gè)方面,即一個(gè)類應(yīng)當(dāng)只有一個(gè)職責(zé) OOP區(qū)別于順序式編程與過程式編程,在于: 1.順序編程...

    SunZhaopeng 評(píng)論0 收藏0
  • PHP面向?qū)ο?OOP)----分頁(yè)類

    摘要:男獲取端口號(hào)當(dāng)前運(yùn)行腳本所在的服務(wù)器的主機(jī)名。如果腳本運(yùn)行于虛擬主機(jī)中,該名稱是由那個(gè)虛擬主機(jī)所設(shè)置的值決定本文由甲爪廣告聯(lián)盟整理編輯 同驗(yàn)證碼類,分頁(yè)也是在個(gè)人博客,論壇等網(wǎng)站中不可缺少的方式,通過分頁(yè)可以在一個(gè)界面展示固定條數(shù)的數(shù)據(jù),而不至于將所有數(shù)據(jù)全部羅列到一起,實(shí)現(xiàn)分頁(yè)的原理其實(shí)就是對(duì)數(shù)據(jù)庫(kù)查詢輸出加了一個(gè)limit限制,接下來我們就開始準(zhǔn)備今天分頁(yè)類的邏輯 #### 邏輯準(zhǔn)...

    qqlcbb 評(píng)論0 收藏0
  • 成為一個(gè)PHP專家:缺失的環(huán)節(jié)

    摘要:為了成為一個(gè)專家,他必須先成為中級(jí)者。它非常適合于急于求成或者沒有太多技術(shù)的人,但掌握絕對(duì)無法使你成為一個(gè)專業(yè)的開發(fā)者它使用意大利面條式的編碼,教你的是不合適的設(shè)計(jì)原則。 這一篇文章是Becoming a PHP Professional系列 4 篇博文中的第 1 篇。 當(dāng)瀏覽各類與PHP相關(guān)的博客時(shí),比如Quora上的問題,谷歌群組,簡(jiǎn)訊和雜志,我經(jīng)常注意到技能的等級(jí)分化。問題都類...

    cooxer 評(píng)論0 收藏0
  • 我的 PHP 學(xué)習(xí)路線

    摘要:我的學(xué)習(xí)路線入門入門沒啥好說的,會(huì)基本編碼,基本的開發(fā)結(jié)構(gòu)通常指,呵呵噠,類與對(duì)象,就差不多了,可以說是入門了。在這些已有基礎(chǔ),我們需要學(xué)習(xí)并且還需要學(xué)會(huì)各種推陳出新,這樣才可以讓自己讓他人走得更遠(yuǎn)。 我的 PHP 學(xué)習(xí)路線 1. PHP 入門 PHP 入門沒啥好說的,會(huì)基本編碼,基本的開發(fā)結(jié)構(gòu)(通常指MVC,呵呵噠),類與對(duì)象,就差不多了,可以說是入門了。 1.1 OOP 寫 PHP...

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

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

0條評(píng)論

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