工作半年了,感覺(jué)這半年學(xué)到的東西比大學(xué)四年學(xué)到的還要多,主要原因是心靜下來(lái)了,目標(biāo)也明確了,不會(huì)去整天的和游戲糾纏在一起了。大學(xué)時(shí)候其實(shí)也意識(shí)到了玩游戲會(huì)影響自己的正常學(xué)習(xí)和工作的,但是一直控制不了自己,還是忍不住經(jīng)常去玩,沒(méi)日沒(méi)夜的玩(本來(lái)就是悶騷男,還宅著玩游戲,這也是大學(xué)四年只有游戲、左右手,沒(méi)有女朋友的一個(gè)原因了)?,F(xiàn)在工作了,每天都有任務(wù),看到旁邊的牛人們?cè)陧?xiàng)目中如魚(yú)得水,就有了趕超他們的想法,于是每天都會(huì)給自己一個(gè)額外的小任務(wù)去學(xué)習(xí)新的知識(shí),到現(xiàn)在工作有半年了,對(duì)以前不熟悉的linux現(xiàn)在也可應(yīng)熟悉的使用了,對(duì)不熟悉的js也有了新的認(rèn)識(shí),可以說(shuō)現(xiàn)在我對(duì)工作可以勝任(如果分為新手、高級(jí)新手、勝任者、精通者、專家)了,開(kāi)發(fā)過(guò)活動(dòng)、接口、后臺(tái),也優(yōu)化完善過(guò)系統(tǒng)的框架,只要是產(chǎn)品運(yùn)營(yíng)提出的合理需求都可以快速的支持到位。當(dāng)然還確確實(shí)實(shí)的感受到一點(diǎn):程序員真是一個(gè)奇怪的群體,大多時(shí)候總是會(huì)覺(jué)得自己的點(diǎn)子是最好的。當(dāng)然這個(gè)算是自信但有時(shí)候討論的時(shí)候你的咄咄逼人不一定是好事,所以還要多聽(tīng)聽(tīng)其他人的想法,不但可以發(fā)現(xiàn)自己的不足,還會(huì)建立良好的:”友誼“。跟大家瞎扯了這么多這半年的一點(diǎn)點(diǎn)感受,謝謝你可以堅(jiān)持看完^_^。
下面步入真題,說(shuō)說(shuō)如何巧妙的運(yùn)用php的魔術(shù)方法,我相信這個(gè)在大多數(shù)項(xiàng)目中會(huì)用到。
先說(shuō)明一下,這個(gè)小技巧我在項(xiàng)目中已經(jīng)有很好的應(yīng)用了,給我們項(xiàng)目帶來(lái)了很大的方便,在這里先賣(mài)賣(mài)關(guān)子,您不妨繼續(xù)往下看。
在項(xiàng)目中,可配的配置信息一定大量存在,比如說(shuō)一個(gè)游戲的機(jī)器人開(kāi)放時(shí)間段、支付方式的開(kāi)啟與否、商城顯示title的配置等等,這些配置信息一般有一個(gè)特點(diǎn)就是沒(méi)有特定的規(guī)則,而且產(chǎn)品運(yùn)營(yíng)可以隨時(shí)的給據(jù)實(shí)際情況去修改,這些信息怎么保存呢,肯定不會(huì)每種類(lèi)型都去建一張表,這樣做簡(jiǎn)直就是費(fèi)力不討好,你想下,也許一張表中就保存了一條信息,所以得想想其他的方法,雖然這些信息沒(méi)有規(guī)則,但是他們卻有一個(gè)特點(diǎn)就是不會(huì)有太多,而且一般情況下數(shù)組就可以保存所有需要配置的信息,因此用json字符串存儲(chǔ)信息是個(gè)不錯(cuò)的選擇,當(dāng)需要使用的時(shí)候直接取出json_decode這樣就可以直接使用了,下面看看具體怎么巧妙的利用php的魔術(shù)方法實(shí)現(xiàn)的。
這里你先要了解下php的一個(gè)魔術(shù)方法__call(),查下php官方的文檔,是這樣解釋這個(gè)函數(shù)的
public mixed __call ( string $name , array $arguments )__call() is triggered when invoking inaccessible methods in an object context.
意思就是說(shuō)當(dāng)在一個(gè)對(duì)象中調(diào)用一個(gè)不可訪問(wèn)的方法(沒(méi)有權(quán)限、不存在)時(shí)會(huì)觸發(fā)這個(gè)函數(shù),函數(shù)的參數(shù)$name是調(diào)用的函名,$arguments是調(diào)用的函數(shù)參數(shù)數(shù)組??纯聪旅孢@個(gè)例子:
class Test{ public function __call($name, $arguments) { echo "你調(diào)用了一個(gè)不存在的方法:/r"; echo "函數(shù)名:{$name}/r"; echo "參數(shù): /r"; PRint_r($arguments); }}$T = new Test();$T->setrobottime("12", "18");這個(gè)函數(shù)會(huì)輸出下面的結(jié)果
你調(diào)用了一個(gè)不存在的方法:函數(shù)名:setrobottime參數(shù): Array( [0] => 12 [1] => 18)
這樣,我們就可以不去直接定義函數(shù),而是用這個(gè)特性去做一些事情了。下面看看代碼的實(shí)現(xiàn)思路,主要是思路,其中有些我是假設(shè)的,就像數(shù)據(jù)庫(kù)連接,這里不主要講這個(gè)。
class Config{ /** * 這里假定下數(shù)據(jù)庫(kù)表名為 * config.config, * 字段為: * config_key varchar(50), * config_value text, * primary key(config_key) * * 數(shù)據(jù)庫(kù)連接為$link * 插入方法封裝為query * 獲取一條信息方法封裝為getOne */ /** * 要進(jìn)行的操作 */ private static $keys = array( //'調(diào)用方法' => 'key', 'roboottime' => 'ROBOOTTIME', 'dailysignin' => 'DAILYSIGNIN', ); /** * 設(shè)置方法 * @param string $config_key 配置項(xiàng)key * @param string $config_value 配置型內(nèi)容(一般為json格式) * @returne boolen true/false 插入是否成功 */ private function set($config_key, $config_value){ $sql = "insert into config.config (config_key,config_value) values ('{$config_key}','{$config_value}') on duplicate key update config_value='{$config_value}'"; return $link->query($sql); } /** * 獲取值的方法 * @param $config_key 要獲取的配置的key * @returne string/false json字符串/失敗 */ private function get($config_key) { $sql = "select * from config.config where config_key='{$config_key}'"; if($ret = $link->getOne($sql, MySQL_ASSOC)){ return $ret; } return false; } /** * 重載魔術(shù)方法 * @param string $name 被調(diào)用的方法名 * @param array $arguments 調(diào)用時(shí)傳遞的參數(shù) * @return mixed 返回結(jié)果 */ public function __call($name, $arguments) { $act = substr($name, 0, 3); $func = strtolower(substr($name, 3)); if(!in_array($func, self::$keys)){ return false; } if($act == 'set') { return $this->set(self::$keys[$name], $arguments[0]); } elseif($act == 'get') { return $this->get(self::$keys[$name]); } return false; }}這樣,我們的就可以通過(guò)一張表存儲(chǔ)多個(gè)信息了,調(diào)用時(shí)也很方便,只需要擴(kuò)展下Config::$keys數(shù)組中的信息就可以了,這樣做只是為了規(guī)范,為了可以清晰的知道哪些配置存放在了這張表中。
使用的時(shí)候可以像這樣去存儲(chǔ)和獲取
$config = new Config();$info = array("12","20");//設(shè)置$config->setroboottime(json_encode($info));//獲取$config->getroboottime();這里再說(shuō)一個(gè)要注意的點(diǎn),這些配置信息一般會(huì)緩存到redis中,放在數(shù)據(jù)庫(kù)中只是為了防止redis掛掉之后從數(shù)據(jù)庫(kù)中去恢復(fù),這里的一般指的是那些經(jīng)常去讀取的信息,為了減少和db的交互,直接放在緩存中。

本文版權(quán)歸作者iforever(luluyrt@163.com)所有,未經(jīng)作者本人同意禁止任何形式的轉(zhuǎn)載,轉(zhuǎn)載文章之后必須在文章頁(yè)面明顯位置給出作者和原文連接,否則保留追究法律責(zé)任的權(quán)利。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注