国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

巧妙的重載魔術(shù)方法__call()

2019-11-15 02:01:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
巧妙的重載魔術(shù)方法__call()

工作半年了,感覺(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的交互,直接放在緩存中。

繪圖1

  本文版權(quán)歸作者iforever(luluyrt@163.com)所有,未經(jīng)作者本人同意禁止任何形式的轉(zhuǎn)載,轉(zhuǎn)載文章之后必須在文章頁(yè)面明顯位置給出作者和原文連接,否則保留追究法律責(zé)任的權(quán)利。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 喀喇沁旗| 郎溪县| 中西区| 汽车| 闻喜县| 博乐市| 舟山市| 澎湖县| 章丘市| 柳河县| 宕昌县| 固原市| 黄骅市| 吴江市| 西乡县| 横峰县| 和林格尔县| 祁东县| 卫辉市| 津南区| 监利县| 正定县| 米脂县| 雷山县| 手机| 开江县| 卢龙县| 福泉市| 巨野县| 宜宾县| 岗巴县| 合肥市| 潮州市| 浙江省| 黔江区| 页游| 隆德县| 马尔康县| 寻甸| 隆德县| 鄂州市|