PHP 魔術(shù)方法 __get() 和 __set()

在 php 的面向?qū)ο缶幊讨校?dāng)一個成員屬性被定義為 private 或 protected 時枉氮,如果我們試圖在外面直接調(diào)用它或者給屬性賦值都會出現(xiàn)“不能訪問某個私有屬性或受保護(hù)屬性”的錯誤示损。面對這樣的需求朗和,PHP 提供了 __get() 和 __set() 的魔術(shù)方法。其中 __get() 可以訪問非公有屬性谊娇,__set() 可以給非公有屬性賦值肺孤。

1、__get()

方法必須有一個參數(shù)

public function __get($name) // 必有一個參數(shù)

案例

class Person
{
    private $name;
    private $age;

    function __construct($name="", $age=1)
    {
        $this->name = $name;
        $this->age = $age;
    }

    /**
     * 在類中添加__get()方法济欢,在直接獲取非公有屬性時自動調(diào)用一次赠堵,以屬性名作為參數(shù)傳入并處理
     * @param $name 訪問的屬性名
     *
     * @return int
     */
    public function __get($name)
    {
        if ($name == "age") {
            if ($this->age > 30) {
                return $this->age - 10;
            } else {
                return $this->$name;
            }
        } else {
            return $this->$name;
        }
    }
}
$person = new Person("kevin", 60);   // 通過Person類實(shí)例化的對象,并通過構(gòu)造方法為屬性賦初值
echo "姓名:" . $person->name . "\r\n";   // kevin, 直接訪問私有屬性name法褥,自動調(diào)用了__get()方法可以間接獲取
echo "年齡:" . $person->age . "\r\n";    // 50, 自動調(diào)用了__get()方法茫叭,根據(jù)對象本身的情況會返回不同的值
echo "\r\n";

2、__set()

方法必須有兩個參數(shù)半等,參數(shù)一:屬性名揍愁,參數(shù)二:屬性值

public function __set($name, $value)

案例

class Person
{
    private $name;
    private $age;

    function __construct($name="", $age=1)
    {
        $this->name = $name;
        $this->age = $age;
    }

    /**
     * 在類中添加 __get()方法,在直接獲取非公有屬性時自動調(diào)用一次杀饵,以屬性名作為參數(shù)傳入并處理
     * @param $propertyName
     *
     * @return int
     */
    public function __get($propertyName)
    {
        if ($propertyName == "age") {
            if ($this->age > 30) {
                return $this->age - 10;
            } else {
                return $this->$propertyName;
            }
        } else {
            return $this->$propertyName;
        }
    }

    /**
     * 在類中添加 __set()方法莽囤,給對象的非公有屬性賦值
     * @param $name 要賦值的屬性
     * @param $value
     */
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
}
$person = new Person("kevin", 60);   // 通過Person類實(shí)例化的對象,并通過構(gòu)造方法為屬性賦初值
$person->name = 'loedan';
$person->age = 20;
echo "姓名:" . $person->name . "\r\n";   // loedan, 通過 __set() 給屬性賦值
echo "年齡:" . $person->age . "\r\n";    // 20, 通過 __set() 給屬性賦值
echo "\r\n";
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末切距,一起剝皮案震驚了整個濱河市朽缎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谜悟,老刑警劉巖话肖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異葡幸,居然都是意外死亡最筒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蔚叨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來是钥,“玉大人掠归,你說我怎么就攤上這事∏哪啵” “怎么了虏冻?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弹囚。 經(jīng)常有香客問我厨相,道長,這世上最難降的妖魔是什么鸥鹉? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任蛮穿,我火速辦了婚禮,結(jié)果婚禮上毁渗,老公的妹妹穿的比我還像新娘践磅。我一直安慰自己,他們只是感情好灸异,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布府适。 她就那樣靜靜地躺著,像睡著了一般肺樟。 火紅的嫁衣襯著肌膚如雪檐春。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天么伯,我揣著相機(jī)與錄音疟暖,去河邊找鬼。 笑死田柔,一個胖子當(dāng)著我的面吹牛俐巴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播硬爆,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼窜骄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摆屯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤糠亩,失蹤者是張志新(化名)和其女友劉穎虐骑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赎线,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廷没,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垂寥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颠黎。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡另锋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狭归,到底是詐尸還是另有隱情夭坪,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布过椎,位于F島的核電站室梅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疚宇。R本人自食惡果不足惜亡鼠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敷待。 院中可真熱鬧间涵,春花似錦、人聲如沸榜揖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽根盒。三九已至钳幅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炎滞,已是汗流浹背敢艰。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留册赛,地道東北人钠导。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像森瘪,于是被迫代替她去往敵國和親牡属。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,096評論 1 32
  • 類是一個重要的C#編程概念扼睬,它在一個單元內(nèi)定義了表示和行為逮栅。類提供了面向?qū)ο缶幊毯兔嫦蚪M件編程所需的語言支持,是創(chuàng)...
    CarlDonitz閱讀 833評論 0 2
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔窗宇,今天18年5月份再次想寫文章措伐,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,746評論 2 9
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,397評論 0 17
  • 一军俊、Apache侥加、PHP、MySQL安裝 1粪躬、Apache的安裝 1.1 安裝: 在dos界面進(jìn)入安裝包的bin目...
    wscfan閱讀 1,227評論 3 4