1. 程式人生 > >PHP:魔術方法set和get的深入特性分析

PHP:魔術方法set和get的深入特性分析

在類當中,設計通用的set和get方法,可以簡化對屬性的讀寫,這種方法不同於針對於獨立的屬性的普通的get和set方法,後者針對每個屬性,都必須提供一對方法,前者針對所有屬性,因此,可以看作是批量定義set和get方法的策略。

另外一種常見的魔術方法是construct,在這裡作為對照進行介紹。

第一,關於訪問許可權修飾符。construct設計為public,那麼可以在new建立物件時,系統會呼叫構造方法對物件進行初始化,否則將無法例項化此類(常用於純靜態類,或者單例模式當中),而set和get,設計為private並不影響功能本身,即系統呼叫這些方法是不受訪問許可權所左右的。而設計為public,則可以直接呼叫這些方法本身。

第二,關於返回值。get方法的返回值,作為屬性結果,而construct和set方法的返回值是沒有任何意義的,並不會被採用。如下:

echo $obj->pro = "value";

列印的值將是value,而不論set方法的返回值是什麼。

第三,關於使用的情境。需要取得$obj->pro值的情況下,會首先尋找公共的pro屬性,如果沒有找到,會檢視是否有get方法,並將其返回值作為結果,如果沒有get方法,將會尋找私有屬性,找到後會報錯,如果私有屬性也找不到,會臨時建立一個公共屬性。

在$obj->pro = "value"的情況下,會首先尋找公共pro屬性,如果沒有找到,會啟用set方法,如get類似。

上述語法,在類本身也有用,如果類的某個方法有$obj->pro的表示式,那麼,它會首先尋找屬性,然後採用get方法,當然,私有屬性和公共屬性都會被首先尋找,然後才會考慮get方法,set方法類似。

但是isset魔術方法,是優先於get方法的,也就是說,如果客戶端程式碼如下:

isset($obj->pro),會首先檢查是否有pro公共變數,然後檢查isset方法,如果有,將會讀取isset方法,然後將返回值確定為檢查結果,如果沒有,才會考慮用get方法的過程。

第四,關於繼承。這些魔術方法均會被子類繼承,繼承時,父類可以訪問子類中的非私有變數和方法,但是無法訪問私有變數和方法。這個問題會導致一個值得注意的細節,比如在父類當中,我們把set方法定義為賦值給一個叫_pro的變數,那麼,如果子類直接繼承這個set方法,它將能夠有效賦值給父類當中定義的私有變數,但是對於子類當中的私有變數,它並沒有多型的許可權,因此,無法賦值。

相關推薦

PHP魔術方法setget深入特性分析

在類當中,設計通用的set和get方法,可以簡化對屬性的讀寫,這種方法不同於針對於獨立的屬性的普通的get和set方法,後者針對每個屬性,都必須提供一對方法,前者針對所有屬性,因此,可以看作是批量定義set和get方法的策略。 另外一種常見的魔術方法是construct,在

PHP魔術方法__get__set的用法

PHP中,魔術方法有很多種,本文章給大家記錄分享:__get\__set的用法跟理解 首先,我們得明白oop中的三個訪問修飾符:public、protected、private 分別的意思: 1、公共的,任何地方都可以訪問,包括本類,子類,外部 2、受保護的成員屬性或者方法,只能

php類中為什麼設定setget方法操作屬性

php程式規範中會建議大家儘量將類中的屬性私有化,即定義為private變數,通過設定set和get函式來對屬性進行操作。一些人存在這樣的疑問,為什麼不直接將屬性設定為public,以後呼叫屬性時直接通過物件進行訪問不是更方便? 當然php中這樣做有它的原因: 1  將資

JAVA中關於set()get()方法的理解及使用

當我 一般來說 怎麽 而是 知識 了解 構造 set 今後 https://www.cnblogs.com/fly-sky-han/p/6564439.html 我們先來看看set和get這兩個詞的表面意思,set是設置的意思,而get是獲取的意思,顧名思義,這兩個方法是對

Vue中computed的setget方法

拆分 ack data his col ted this mpat idt 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"&g

Eclipse快速生成setget方法

首先建立好該類的field; 然後選中需要生成的變數,然後shift+alt+s,選擇generate getters and getters, 上面可以再一次選擇需要生成的變數,底下可以選擇生成的程式碼插入的地方,first number ,lastnumber或某個定

java中set()get()方法的理解

1.名詞理解 從名字看set是設定的意思而get是獲取的意思,所以顧名思義這兩個方法是對資料進行設定和獲取操作的,我們往往不會單獨的使用它們而是用一些修飾詞配合使用,比如setname(), getname() ,setage(), getage(),等等 2.使用場景 JAVA

呼叫private(有setget方法)私有化修飾的變數

我們先來看看set和get這兩個詞的表面意思,set是設定的意思,而get是獲取的意思,顧名思義,這兩個方法是對資料進行設定和獲取用的。而且,在類中使用set和get方法時,都是在set和get後面跟上一些特定的詞來形成特定意思的方法名,比如setage()和getage(),表示設定年齡和獲取年齡

java類中為什麼設定set get 方法操作屬性

樣例一: class person {       public String name ;       public String sex ; } 如上這麼一個類我們可以對它的實體進行:    起名操作,如     person1.name = "小明";   取名操作

java中關於set()get()方法的理解使用

  我們來了解一下JAVA面向物件程式設計中的封閉性和安全性。封閉性即對類中的域變數進行封閉操作,即用private來修飾他們,如此一來其他類則不能對該變數訪問。這樣我們就將這些變數封閉在了類內部,這樣就提高了資料的安全性,當我們想要操作這些域變數怎麼辦呢?我們可以通過兩種方法,第一中即通過public方式的

swift學習之setget方法

在swift 中get,set被稱之為“計算屬性”,它用來間接獲取/改變其他屬性的值。 - set 和get 是針對 計算變數(Calculated property ) 是不可以賦值的 - 普通的儲存變數(storage property)才是可以賦值的

重寫setget方法後,為什麼使用時會發生無效?解析命名規範

今天博主偶然遇到如題的問題,方法寫的沒錯,都是一一對應的,但就是不呼叫set方法,百度了很多,有人說要強制寫@synthesize,還有的說@property有沒有寫,之類的,既然重寫了get,set方法,@property肯定是不會缺失的,都是一些不疼不癢的回

通過PropertyDescriptor反映射調用setget方法

getc UNC extends pen except extend port rac bject package com.zhoushun; import java.lang.reflect.Method; import java.lang.reflect.Field;

【封裝】java中為什麼要將屬性進行私有化,又使用setget方法來設定獲取屬性呢?

其實這裡體現的就是封裝的思想: 將資料與行為進行分離。 試想, 如果外面的程式可以隨意修改一個類的成員變數,會造成不可預料的程式錯誤, 就象一個人的名字, 不能被外部隨意修改,只能通過各種給定的方法去

重寫Swift中的setget方法

//定義一個變數 var _tittle: String? var tittle: String?{ set{ _tittle=newValue } get{ return _tittle

PHP魔術方法__get()__set()用法

<?php class person { private $name; function __set($_name, $_value) { $this->$_name = 'set-' . $_value; }

C#中的setget方法

在面向物件程式設計(OOP)中,是不允許外界直接對類的成員變數直接訪問的,既然不能訪問,那定義這些成員變數還有什麼意義呢?所以C#中就要用set和get方法來訪問私有成員變數,它們相當於外界訪問物件的一個通道,一個“介面”。先來看一段程式碼: class Employee 

iOS開發之--屬性關鍵字以及setget方法

數據 重寫 per 針對 生成 string類 對象 創建 @property 一、屬性分為三大類 1、讀寫性控制 a.readOnly只讀,只會生成get方法,不會生成set方法 b.readWrite可讀可寫,會生成set方法,也會生成get方法(默認設置

PHP OOP 魔術方法

需要 con 實例化 echo 對象 def sse ase urn 1、__construct():構造函數,new一個新對象時,自動調用    [public] function __construct($name=""){ $this ->

9魔術方法

魔術方法的定義 就是那些在某些特定的時刻,會自動執行的方法,統稱為魔術方法。 他們最大的特點是以:__雙下劃線開頭。 例如建構函式,解構函式,克隆函式,__get函式,__set函式,都是魔術方法。 在PHP中系統自帶的函式和方法就有四千多個,記得住嗎???