PHP類中的__get()和__set函數到底有什么用


PHP類中的__get()和__set函數到底有什么用

一、總結

一句話總結:當試圖獲取一個不可達變量時,類會自動調用__get。同樣的,當試圖設置一個不可達變量時,類會自動調用__set。在網站中,這兩個並不是什么非用不可的函數。所以可以用於輸出提示消息,或者返回值。

 

1、php中使用什么代替java面相對象中的常用的get和set方法?

類默認自帶的__get()和__set()

 

2、php中類中默認自帶的__get()方法什么時候被調用?

當試圖獲取一個不可達變量時,類會自動調用__get

所以在php中相當於可以直接用對象訪問私有屬性(因為會自動調用__get()方法)

 

3、php中如何調用類的私有屬性?

a、new對象($modelTime =new ModelTime();

b、用new出來的對象直接調用屬性(echo $modelTime->perDayTS;die;

c、在類中要寫__get()方法返回值

10     public function __get($my_var){ 11 return $this->$my_var; 12 }

 

 

二、PHP類中的__get()和__set函數到底有什么用?

當試圖獲取一個不可達變量時,類會自動調用__get。

同樣的,當試圖設置一個不可達變量時,類會自動調用__set。
在網站中,這兩個並不是什么非用不可的函數。
 
例如:
Class Test
{
    private $a = 1;
    private $b = 2;
    public  $c = 3;
 
    public function  __get($vname)
    {
        return "you can not get";
    }
 
    public function __set($vname,$value)
    {
        echo  "you can not set";
    }
}
 
$t = new Test;
 
echo $t->a;//這里試圖要打印出私有變量
$t->b=3;//這里試圖要把私有變量進行設置
 
想要直接對私有變量操作,當然是做不到的。
於是在讀取的時候,調用__get(),輸出“you can not get”;
在設置的時候,調用__set(),輸出“you can not set”。
 
順便提一下,__get()和__set()函數要設置為public,要不然會Warning。
__get()和__set()函數定義時的參數分別為1個和2個,不管函數中到底有沒用,都是不可省略的。
 
通過修改__get()和__set()函數內部的語句,就可以實現在外部調用類的私有變量。
例如:
private __get($vname)
{
    return $this->$vname;
}
如果$vname的值是a,那么就返回了正確的值。
__set()也同理。
 

public function __set($vname,$value)
{
    $this->$vname = $value;
}

 

 

參考:

PHP類中的__get()和__set函數到底有什么用? - East2_100 - 博客園
https://www.cnblogs.com/east2-100/p/5272699.html

 
 

三、php中使用類默認自帶的__get()和__set()代替java中的常用的get和set方法

關鍵代碼

 1 class Time extends Common
 2 {
 3     private $perDayTS;
 4     public function __construct() {
 5         parent::__construct();
 6         $this->perDayTS=24*60*60;
 7         echo "正在調用構造函數".$this->perDayTS;
 8     }
 9 
10     public function __get($my_var){
11         return $this->$my_var;
12     }

調用

1     public function test1(){
2         $modelTime =new ModelTime();
3         echo $modelTime->perDayTS;die;
4     }

 

 

 
 
 


免責聲明!

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



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