巧妙的重載魔術方法__call(),重載魔術__call_PHP教程

來源:互聯網
上載者:User

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


工作半年了,感覺這半年學到的東西比大學四年學到的還要多,主要原因是心靜下來了,目標也明確了,不會去整天的和遊戲糾纏在一起了。大學時候其實也意識到了玩遊戲會影響自己的正常學習和工作的,但是一直控制不了自己,還是忍不住經常去玩,沒日沒夜的玩(本來就是悶騷男,還宅著玩遊戲,這也是大學四年只有遊戲、左右手,沒有女朋友的一個原因了)。現在工作了,每天都有任務,看到旁邊的牛人們在項目中如魚得水,就有了趕超他們的想法,於是每天都會給自己一個額外的小任務去學習新的知識,到現在工作有半年了,對以前不熟悉的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{    public function __call($name, $arguments)    {        echo "你調用了一個不存在的方法:\r";        echo "函數名:{$name}\r";        echo "參數: \r";        print_r($arguments);    }}$T = new Test();$T->setrobottime("12", "18");

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

你調用了一個不存在的方法:函數名:setrobottime參數: Array(    [0] => 12    [1] => 18)

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

class Config{    /**     * 這裡假定下資料庫表名為     * config.config,     * 欄位為:     * config_key varchar(50),     * config_value text,     * primary key(config_key)     *     * 資料庫連接為$link     * 插入方法封裝為query     * 擷取一條資訊方法封裝為getOne     */    /**     * 要進行的操作     */    private static $keys = array(        //'調用方法' => 'key',        'roboottime'    => 'ROBOOTTIME',        'dailysignin'   => 'DAILYSIGNIN',    );    /**     * 設定方法     * @param string $config_key 配置項key     * @param string $config_value 配置型內容(一般為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;    }    /**     * 重載魔術方法     * @param string $name 被調用的方法名     * @param array $arguments 調用時傳遞的參數     * @return mixed 返回結果     */    public function __call($name, $arguments)    {        $act    = substr($name, 0, 3);        $func   = substr($name, 3);        if(!in_array($func, self::$keys)){            return false;        }        if($act == 'set')        {            return $this->set(self::[$func], $arguments[0]);        }        elseif($act == 'get')        {            return $this->get(self::[$func]);        }        return false;    }}

這樣,我們的就可以通過一張表格儲存體多個資訊了,調用時也很方便,只需要擴充下Config::$keys數組中的資訊就可以了,這樣做只是為了規範,為了可以清晰的知道哪些配置存放在了這張表中。

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

$config = new Config();$info = array("12","20");//設定$config->setroboottime(json_encode($info));//擷取$config->getroboottime();

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

  本文著作權歸作者iforever(luluyrt@163.com)所有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文串連,否則保留追究法律責任的權利。

http://www.bkjia.com/PHPjc/940335.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/940335.htmlTechArticle巧妙的重載魔術方法__call(),重載魔術__call 工作半年了,感覺這半年學到的東西比大學四年學到的還要多,主要原因是心靜下來了,目標也...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.