PHP中__get()和__set()的用法實例詳

剛剛看到一個對我有用的文章,我就把它摘抄下來了。 ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? php面向對象_get(),_set()的用法?


一般來說,總是把類的屬性定義為private,這更符合現實的邏輯。但是,對屬性的讀取和賦值操作是非常頻繁的,因此在PHP5中,預定義了兩個函數“__get()”和“__set()”來獲取和賦值其屬性。類似于java中的javabean的操作,使用的方法也類似,只是不需要像javabean中那樣,對每個字段進行set和get的操作。只需要加上兩個魔術方法即可。即私有成員的設值和取值的操作。在PHP5中給我們提供了專門為屬性設置值和獲取值的方法,“__set()”和“__get()”這兩個方法,這兩個方法不是默認存在的,而是我們手工添加到類里面去的,像構造方法(__construct())一樣,類里面添加了才會存在,可以按下面的方式來添加這兩個方法,當然也可以按個人的風格來添加:?

1 //__set()方法用來設置私有屬性 
2 public function __set($name,$value){ 
3 $this->$name = $value; 
4 } 
5 //__get()方法用來獲取私有屬性 
6 public function __get($name){ 
7 return $this->$name; 
8 } 

__get()方法:這個方法用來獲取私有成員屬性值的,有一個參數,參數傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個方法不用我們手工的去調用,因為我們也可以把這個方法做成私有的方法,是在直接獲取私有屬性的時候對象自動調用的。因為私有屬性已經被封裝上了,是不能直接獲取值的,但是如果你在類里面加上了這個方法,在使用“echo$p1->name”這樣的語句直接獲取值的時候就會自動調用__get($name)方法,將屬性name傳給參數$name,通過這個方法的內部執行,返回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,對象本身就不會去自動調用這個方法。

__set()方法:這個方法用來為私有成員屬性設置值的,有兩個參數,第一個參數為你要為設置值的屬性名,第二個參數是要給屬性設置的值,沒有返回值。這個方法同樣不用我們手工去調用,它也可以做成私有的,是在直接設置私有屬性值的時候自動調用的,同樣屬性私有的已經被封裝上?
了,如果沒有__set()這個方法,是不允許的,比如:$this->name=‘zhangsan',這樣會出錯,但是如果你在類里面加上了__set($property_name, $value)這個方法,在直接給私有屬性賦值的時候,就會自動調用它,把屬性比如name傳給$property_name,把要賦的值“zhangsan”傳給$value,通過這個方法的執行,達到賦值的目的。如果成員屬性不封裝成私有的,對象本身就不會去自動調用這個方法。為了不傳入非法的值,還可以在這個方法給做一下判斷。代碼如下:

 1 <?php 
 2 class Person 
 3 { 
 4 //下面是人的成員屬性,都是封裝的私有成員 
 5 private $name; //人的名子 
 6 private $sex; //人的性別 
 7 private $age; //人的年齡 
 8 //__get()方法用來獲取私有屬性 
 9 private function __get($property_name) 
10 { 
11 echo "在直接獲取私有屬性值的時候,自動調用了這個__get()方法<br>"; 
12 if(isset($this->$property_name)) 
13 { 
14 return($this->$property_name); 
15 } 
16 else 
17 { 
18 return(NULL); 
19 } 
20 } 
21 //__set()方法用來設置私有屬性 
22 private function __set($property_name, $value) 
23 { 
24 echo "在直接設置私有屬性值的時候,自動調用了這個__set()方法為私有屬性賦值<br>"; 
25 $this->$property_name = $value; 
26 } 
27 } 
28 $p1=newPerson(); 
29 //直接為私有屬性賦值的操作,會自動調用__set()方法進行賦值 
30 $p1->name="張三"; 
31 $p1->sex="男"; 
32 $p1->age=20; 
33 //直接獲取私有屬性的值,會自動調用__get()方法,返回成員屬性的值 
34 echo "姓名:".$p1->name."<br>"; 
35 echo "性別:".$p1->sex."<br>"; 
36 echo "年齡:".$p1->age."<br>"; 
37 ?> 

程序執行結果:?
在直接設置私有屬性值的時候,自動調用了這個__set()方法為私有屬性賦值?
在直接設置私有屬性值的時候,自動調用了這個__set()方法為私有屬性賦值?
在直接設置私有屬性值的時候,自動調用了這個__set()方法為私有屬性賦值?
在直接獲取私有屬性值的時候,自動調用了這個__get()方法?
姓名:張三?
在直接獲取私有屬性值的時候,自動調用了這個__get()方法?
性別:男?
在直接獲取私有屬性值的時候,自動調用了這個__get()方法?
年齡:20?
以上代碼如果不加上__get()和__set()方法,程序就會出錯,因為不能在類的外部操作私有成員,而上面的代碼是通過自動調用__get()和__set()方法來幫助我們直接存取封裝的私有成員的。

轉載于:https://www.cnblogs.com/yuyu1993/p/5563276.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374566.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374566.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374566.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javascript 異步編程的4種方法

你可能知道&#xff0c;Javascript語言的執行環境是"單線程"&#xff08;single thread&#xff09;。 所謂"單線程"&#xff0c;就是指一次只能完成一件任務。如果有多個任務&#xff0c;就必須排隊&#xff0c;前面一個任務完成&#xff0c;再執行后面一…

力扣奇偶鏈表

給定單鏈表的頭節點 head &#xff0c;將所有索引為奇數的節點和索引為偶數的節點分別組合在一起&#xff0c;然后返回重新排序的列表。 第一個節點的索引被認為是 奇數 &#xff0c; 第二個節點的索引為 偶數 &#xff0c;以此類推。 請注意&#xff0c;偶數組和奇數組內部的…

JAVA入門之方法

所謂方法&#xff0c;就是用來解決一類問題的代碼的有序組合&#xff0c;是一個功能模塊。 一般情況下&#xff0c;定義一個方法的語法是&#xff1a; 其中&#xff1a; 1、 訪問修飾符&#xff1a;方法允許被訪問的權限范圍&#xff0c; 可以是 public、protected、private 甚…

使用Netbeans開發App Engine Java

如果您剛開始進行App引擎開發&#xff0c;那么您可能會感覺Eclipse是首選的IDE。 而且&#xff0c;Google還單獨提供了它的Eclipse IDE 官方插件 。 但是不使用Eclipse的人呢&#xff1f; 當然&#xff0c;您始終可以進行命令行開發&#xff0c;但是現在這些人是誰&#xff01;…

JAVA基本類庫介紹

我們曾經講過&#xff0c;Java已經為編程者編制了許多類&#xff0c;這些類已經經過測試&#xff0c;基本上不存在錯誤&#xff0c;這些類都是我們編程的基礎。如果不利用這些已存在的類&#xff0c;我們的 編程工作將變得異常復雜&#xff0c;所以我們應盡可能多的掌握Java基本…

力扣回文鏈表

給你一個單鏈表的頭節點 head &#xff0c;請你判斷該鏈表是否為回文鏈表。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 class Solution {public boolean isPalindrome(ListNode head) {List<Integer> res new ArrayList<Integer>()…

JAVA運算符和優先級

1、算術運算符&#xff1a; 和 -- 既可以出現在操作數的左邊&#xff0c;也可以出現在右邊&#xff0c;但結果是不同&#xff0c;如&#xff1a; ①int a5&#xff1b;int ba&#xff1b; #先把a賦給b&#xff0c;a再自增 ②int a5&#xff1b;int ba&#xff1b;   #a先…

將JSON功能添加到您的GWT應用程序中

JSON簡介 在Web應用程序上工作時&#xff0c;總是會出現客戶端-服務器數據交換的問題。 在此問題上有多種方法&#xff0c;其中許多使用XML進行交換。 執行此任務的一種不太知名的格式是JSON。 JSON&#xff08;JavaScript對象表示法&#xff09;是一種輕量級的數據交換格式。…

win10資源管理器怎么打開_讓你效率倍增的電腦神器,最強資源管理器增強工具「QTTabBar」...

前言Windows 自帶的資源管理器的功能比較簡單&#xff0c;夠用是夠用了&#xff0c;但有時也確實無法滿足我們對更便捷高效的操作方式的追求。「QTTabBar」正是一個非常強大的 Windows 資源管理器增強工具&#xff01;不僅支持多標簽頁管理&#xff0c;還有許多便捷的擴展功能&…

android橫向滑動選擇的view

做文字編輯&#xff0c;從網上找來的。 HorizontalScrollSelectView&#xff1a; public boolean mAlwaysOverrideTouch true;protected ListAdapter mAdapter;private int mLeftViewIndex -1;private int mRightViewIndex 0;protected int mCurrentX;protected int mNextX;…

適用于Mac OS X的官方Java 7 –狀態

希望到現在&#xff0c;每個人都知道蘋果公司去年加入了OpenJDK項目。 這意味著什么&#xff1f; 蘋果將??把用于私有Mac Java構建的代碼作為GPL代碼貢獻給OpenJDK 甲骨文將接管Java的Mac端口 隨著時間的流逝&#xff0c;Mac平臺將成為Java世界中完全一流的公民 對于想要在…

excel使用教程_數據分析Excel必備技能:數據透視表使用教程

江米小棗tonylua | 作者掘金 | 來源處理數量較大的數據時&#xff0c;一般分為數據獲取、數據篩選&#xff0c;以及結果展示幾個步驟。在 Excel 中&#xff0c;我們可以利用數據透視表(Pivot Table)方便快捷的實現這些工作。本文首先手把手的教你如何在 Excel 中手動構建一個基…

.典型用戶 - 場景

典型用戶&#xff1a; 名字黃德勝性別、年齡男&#xff0c;35歲職業自由投資人收入20萬元/年知識層次和能力專科&#xff0c;有一定的投資經驗&#xff0c;對經濟有自己的看法生活/工作情況已婚&#xff0c;生活負擔在加重動機&#xff0c;目的&#xff0c;困難想要增加收入&am…

java調用webservice_篤學私教:Java開發網站架構演變過程-從單體應用到微服務架構詳解...

原標題&#xff1a;篤學私教&#xff1a;Java開發網站架構演變過程-從單體應用到微服務架構詳解Java開發網站架構演變過程&#xff0c;到目前為止&#xff0c;大致分為5個階段&#xff0c;分別為單體架構、集群架構、分布式架構、SOA架構和微服務架構。下面玄武老師來給大家詳細…

再把你的錢加倍

總覽 很久以前&#xff0c;我寫了一篇關于用雙倍賺錢的文章。 但是&#xff0c;當解決方案相當簡單時&#xff0c;仍然是許多開發人員普遍擔心的問題。 用雙倍賺錢的問題 double有兩種類型的錯誤。 它存在表示錯誤。 即&#xff0c;它不能完全代表所有可能的十進制值。 即使0…

單元測試中Assert類的用法

Assert類所在的命名空間為Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll就可以使用了&#xff0c; 在這里我會舉例說明Assert里面的一些主要的靜態成員。 1、 AreEqual&#xff1a;方法被重載…

CocoaPods安裝使用

$ gem sources --remove https://rubygems.org/ //等有反應之后再敲入以下命令 $ gem sources -a http://ruby.taobao.org/*** CURRENT SOURCES ***http://ruby.taobao.org/ //出現這個說明安裝正確$ sudo gem install cocoapods 安裝cocoaPods到項目的路徑下 $ touch Pod…

303. 區域和檢索 - 數組不可變(數組前綴和知識應用)

給定一個整數數組 nums&#xff0c;處理以下類型的多個查詢: 計算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之間的 nums 元素的 和 &#xff0c;其中 left < right 實現 NumArray 類&#xff1a; NumArray(int[] nums) 使用數組 nums 初始化對象 in…

pat1049. Counting Ones (30)

1049. Counting Ones (30) 時間限制10 ms內存限制65536 kB代碼長度限制16000 B判題程序Standard作者CHEN, YueThe task is simple: given any positive integer N, you are supposed to count the total number of 1s in the decimal form of the integers from 1 to N. For ex…

加油站會員管理系統源碼php_加油站使用會員管理系統,如何解決行業瓶頸?

隨著人們生活條件的不斷改善&#xff0c;基本上家家戶戶都有了私家車輛&#xff0c;這對于加油站而言&#xff0c;覆蓋的客戶量也逐漸增多。現在很多加油站還是處于比較傳統的收銀模式和會員營銷管理模式&#xff0c;收銀效率低&#xff0c;客戶得不到全方面的管理。尤其是在高…