周末,说声php的settergetter(魔术)方法,你们辛苦了
? php 作為快速迭代項目的語言,其牛逼性質自不必多說。今天咱們要來說說php語言幾個魔術方法,當然了,本文主要以setter&getter方法說明為主。
首先,咱們得知道什么叫魔術方法? 官方定義為:__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被稱為"魔術方法"(Magic methods)。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術功能。
媽蛋,看了這么長一句,還是不明白什么叫魔術方法?
換句簡單的話就是(片面的),普通方法做不了的事,這個方法能做到,這就是魔術方法! 總之就是,你平時一般不會用到的方法。
好,現在咱們來說說,哪幾個方法是咱們用得最多的呢?當然是 __construct, __destruct 了,創建一個類時,會使用到構造方法(__construct),你可以初始化你的基本數據在里面。銷毀一個類時,則會調用析構方法(__destruct),你可以回收一些東西。
除了這前面兩個方法之外,其他的方法就不一定是每個同學都會用得上的功能了。如果說一定要使用的話,那可能還會用到 __call 方法,因為有時候你可能就是要讓外面訪問你某些變異了的方法,以迷惑對手。
那么,回到本文話題,php的setter&getter方法,其實就是 __set & __get 方法,為什么說是setter&getter呢,因為在面向對象語言中,就是setXX($value),getXX(); 這兩個魔術方法有什么用呢?
首先,我們還是魔術方法的方針政策上,魔術方法是具有魔術的,是不能隨便調用的,它只會在特定的情況下才會生效。
那么__set 方法呢,就是在你在設置某個類屬性變量的時候(如$obj->mm = "c";),如果沒有找到這個變量或者該變量不可訪問,那么__set就會生效被調用了。
而 __get 方法,就是在你獲取類的某個類屬性變量的時候(如$a = $obj->mm),如果訪問不到這個屬性,那么 __get就會生效被調用了。 舉例:
<?phperror_reporting(E_ALL^E_NOTICE);class SampleMagicTest {public $a;private $privVar = "privateVar";protected $protectedVar = "protectedVar";public function __construct($a) {$this->a = $a;var_dump("in __construct method....", $a);}public function __set($name, $value) {echo "in __set method...\n";$this->$name = $value; //設置$name屬性為該類屬性變量,我猜測修飾符應該是 private, 也就是說 外部仍然是訪問不到該變量的,但是結果卻讓我失望了,居然被設置成public,也就是說,你可直接訪問到該變量了//當然了,你還可以做其他沒用的事 }public function __get($name) {echo "in __get method...\n";return $this->$name; //返回類屬性變量 $name, 該$name通常是私有的變量//當然了,你還可以做其他沒用的事 }public function __call($name, $arguments) {var_dump("you called a none defined method,methodName is:", $name, " args is:", $arguments);}public function __destruct() {echo "in __construct method...\n";return "SampleMagicTest.class.toString\n";}public function __toString() {echo "in __toString method...\n";}}$sample = new SampleMagicTest("1");$sample->yourName = "jue"; //屬性不存在, __set 魔術將生效echo "yourName:" . $sample->yourName . PHP_EOL; //由于前面的 __set已經將變量放入,此處可以直接調用,沒毛病var_dump($sample->aNoneExistVar); //直接調用一個不存在的變量$sample->sayHi("hello"); //調用一個不存在的方法,則會觸發 __call方法,也就是說,當有了 __call方法之后,php就再也不會報方法未定義之類的錯誤了,這坑可是不小哦var_dump($sample); unset($sample); // 可以主動調用銷毀方法,當然了,實際開發中是不建議這么干的echo "real over..."; ?>輸出結果如下:
$-#: php SampleMagicTest.php string(25) "in __construct method...." string(1) "1" in __set method... yourName:jue in __get method... NULL string(47) "you called a none defined method,methodName is:" string(5) "sayHi" string(9) " args is:" array(1) {[0]=>string(5) "hello" } in __toString method... SampleMagicTest.class.toString object(SampleMagicTest)#1 (4) {["a"]=>string(1) "1"["privVar":"SampleMagicTest":private]=>string(10) "privateVar"["protectedVar":protected]=>string(12) "protectedVar"["yourName"]=>string(3) "jue" } in __construct method... real over...如此,測試完畢。?
說實話,我一點都沒感覺到 __set&__get 方法的方便之處在哪里,而__call方法反而作用會大些(有坑自己別往里跳就行),尤其作為反射功能的調用時。
而我能想到的setter&getter的作用,則更多的是提示你在獲取屬性時,IDE能給你一個準確的提示,那將是美好的。
我看過某人寫過的代碼,將某個配置設值功能作為調用 __set方法的場景(如: public funtion($name, $value) {$this->config[$name] = $value;},這種情況,恕在下不敢茍同。你直接寫個易記的方法不就行了嗎?
魔術方法存在自然有其過人之處,但是,并不是每個場景都能使用,大部分情況可能只需要看看就好。
如果一定要給這些魔術方法的功能重要性排個序的話,我想官方已經把他排出來了。
你有什么場景在用這些牛逼的魔術方法呢?不訪說出來,嚇我一跳。。。
總結
以上是生活随笔為你收集整理的周末,说声php的settergetter(魔术)方法,你们辛苦了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跑跑卡丁车属性强化加点
- 下一篇: 搜狗输入法如何换行(搜狗搜索引擎)