巧妙的過載魔術方法 call

2022-03-09 12:22:27 字數 2885 閱讀 6180

工作半年了,感覺這半年學到的東西比大學四年學到的還要多,主要原因是心靜下來了,目標也明確了,不會去整天的和遊戲糾纏在一起了。大學時候其實也意識到了玩遊戲會影響自己的正常學習和工作的,但是一直控制不了自己,還是忍不住經常去玩,沒日沒夜的玩(本來就是悶騷男,還宅著玩遊戲,這也是大學四年只有遊戲、左右手,沒有女朋友的乙個原因了)。現在工作了,每天都有任務,看到旁邊的牛人們在專案中如魚得水,就有了趕超他們的想法,於是每天都會給自己乙個額外的小任務去學習新的知識,到現在工作有半年了,對以前不熟悉的linux現在也可應熟悉的使用了,對不熟悉的js也有了新的認識,可以說現在我對工作可以勝任(如果分為新手、高階新手、勝任者、精通者、專家)了,開發過活動、介面、後台,也優化完善過系統的框架,只要是產品運營提出的合理需求都可以快速的支援到位。當然還確確實實的感受到一點:程式設計師真是乙個奇怪的群體,大多時候總是會覺得自己的點子是最好的。

當然這個算是自信但有時候討論的時候你的咄咄逼人不一定是好事,所以還要多聽聽其他人的想法,不但可以發現自己的不足,還會建立良好的:」友誼「。跟大家瞎扯了這麼多這半年的一點點感受,謝謝你可以堅持看完^_^。

下面步入真題,說說如何巧妙的運用php的魔術方法,我相信這個在大多數專案中會用到。

先說明一下,這個小技巧我在專案中已經有很好的應用了,給我們專案帶來了很大的方便,在這裡先賣賣關子,您不妨繼續往下看。

在專案中,可配的配置資訊一定大量存在,比如說乙個遊戲的機械人開放時間段、支付方式的開啟與否、**顯示title的配置等等,這些配置資訊一般有乙個特點就是沒有特定的規則,而且產品運營可以隨時的給據實際情況去修改,這些資訊怎麼儲存呢,肯定不會每種型別都去建一張表,這樣做簡直就是費力不討好,你想下,也許一張表中就儲存了一條資訊,所以得想想其他的方法,雖然這些資訊沒有規則,但是他們卻有乙個特點就是不會有太多,而且一般情況下陣列就可以儲存所有需要配置的資訊,因此用json字串儲存資訊是個不錯的選擇,當需要使用的時候直接取出json_decode這樣就可以直接使用了,下面看看具體怎麼巧妙的利用php的魔術方法實現的。

這裡你先要了解下php的乙個魔術方法__call(),查下php官方的文件,是這樣解釋這個函式的

public

mixed __call ( string

$name , array

$arguments

)__call() is triggered when invoking inaccessible methods in an

object context.

意思就是說當在乙個物件中呼叫乙個不可訪問的方法(沒有許可權、不存在)時會觸發這個函式,函式的引數$name是呼叫的函名,$arguments是呼叫的函式引數陣列。看看下面這個例子:

class

test

\r";

echo "引數: \r";

print_r($arguments

); }

}$t = new

test();

$t->setrobottime("12", "18");

這個函式會輸出下面的結果

你呼叫了乙個不存在的方法:

函式名:setrobottime

引數:

array

( [0] => 12[1] => 18)

這樣,我們就可以不去直接定義函式,而是用這個特性去做一些事情了。下面看看**的實現思路,主要是思路,其中有些我是假設的,就像資料庫連線,這裡不主要講這個。

class

config

','') on duplicate key update config_value=''";

return

$link->query($sql

); }

/*** 獲取值的方法

* @param $config_key 要獲取的配置的key

* @returne string/false json字串/失敗

*/private

function get($config_key

) '";

if($ret = $link->getone($sql,mysql_assoc))

return

false

; }

/*** 過載魔術方法

* @param string $name 被呼叫的方法名

* @param array $arguments 呼叫時傳遞的引數

* @return mixed 返回結果

*/public

function __call($name, $arguments

)

if($act == 'set')

elseif($act == 'get')

return

false

; }

}

這樣,我們的就可以通過一張表儲存多個資訊了,呼叫時也很方便,只需要擴充套件下config::$keys陣列中的資訊就可以了,這樣做只是為了規範,為了可以清晰的知道哪些配置存放在了這張表中。

使用的時候可以像這樣去儲存和獲取

$config = new

config();

$info = array("12","20");

//設定

$config->setroboottime(json_encode($info

));//

獲取$config->getroboottime();

這裡再說乙個要注意的點,這些配置資訊一般會快取到redis中,放在資料庫中只是為了防止redis掛掉之後從資料庫中去恢復,這裡的一般指的是那些經常去讀取的資訊,為了減少和db的互動,直接放在快取中。

魔術方法 call 和

php 5.3 後新增了 call 與 callstatic 魔法方法。call 當要呼叫的方法不存在或許可權不足時,會自動呼叫 call 方法。callstatic 當呼叫的靜態方法不存在或許可權不足時,會自動呼叫 callstatic方法。call funcname,arguments call...

對於魔術方法 call,

call方法在物件方法不存在的時候被呼叫 callstatic方法在呼叫物件靜態方法不存在的時候被呼叫 例如class car new car color class bus bus issale 其實上面的解釋在某些情況下是正確的。但是在一些特殊情形,如果按照這個解釋來理解,就會覺得結果不可思議了...

魔術方法之 call

1.call 作用,當呼叫不存在的方法時,會呼叫該方法。實際應用,當程式呼叫不存在的方法時,意外導致程式終止。或者當你呼叫了受保護的或者是私人的方法時,也會自動呼叫 call方法 結果 2.callstatic 形式 callstatic name,arr 應用場景 1 物件呼叫未定義的靜態函式時,...