PHP中的__get和__set理解


先來了解一下PHP類中的__get__set函數

當我們試圖獲取一個不可達屬性時(比如private),類會自動調用__get函數。
當試圖設置一個不可達屬性時(比如private),類會自動調用__set函數,我們一起來看個例子:

<?php
class Person{
    public $name = '周伯通';
    private $sex = '男';
}
$class = new Person();
echo $class->sex;

這里$sex聲明了私用變量,私有變量或方法在類實例化是不能直接訪問的,所以上面會拋出異常

Fatal error: Uncaught Error: Cannot access private property Person::$sex 

我們再稍加改造一下:

<?php
class Person{
    public $name = '周伯通';
    private $sex = '男';
    function __get($name){
        echo '個人信息:'.$name.$this->sex;
    }
}
$class = new Person();
echo $class->sex;//個人信息:sex男

可以看出sex方法自動調用了,並可以訪問私有變量。
我們再來看一下__set函數,同樣也是先使用可達的私有屬性:

<?php
class Person{
    public $name = '周伯通';
    private $sex = '男';
    function __set($name, $val){
        echo '個人信息:'.$name. $val;
    }
}
$class = new Person();
$class->sex = '女';
echo $class->sex;
個人信息:sex女
( ! ) Fatal error: Uncaught Error: Cannot access private property Person::$sex in G:\web\gitlearn\set.php on line 11
( ! ) Error: Cannot access private property Person::$sex in G:\web\gitlearn\set.php on line 11

這里調用了__set函數並提示我們不能使用類的私有屬性。可以看到sex在外部是被改變 了,但是拋出了致命錯誤
現在我們來通過__set函數實現外部使用私有屬性:

<?php
class Person{
    public $name = '周伯通';
    private $sex = '男';
    function __set($name, $val){
        //echo '個人信息:'.$this->$name = $val;
        $this->$name = $val; //注意 這里是$name,是要設置訪問的變量名,如果大家用$this->name,會看到本例會輸出的是 男
    }
    function getSex(){
        echo $this->sex; //獲取新的屬性
    }
}
$class = new Person();
$class->sex = '女';
echo $class->getSex();// 輸出 女

通過上面幾個例子,相信大家對set/get應該有更深的理解啦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM