ホームページ  >  記事  >  バックエンド開発  >  php __callメソッドの使用手順_PHPチュートリアル

php __callメソッドの使用手順_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:00:17956ブラウズ

この記事では、php __call メソッドの使用手順を紹介します。php __call メソッドを学習する必要がある人は、参考にしてください。 PHP に触れ始めたばかりの子どもたちは、魔法のメソッド __call を参考書で目にしたり、その応用例を見たことがあると思います。しかし、実際にコードを書き始めるとき、それを使ったことがありますか? ?正直に言うと、私は PHP をしばらく使ってきましたが、実際の開発に適用したことはありませんでした。

最初に __call の機能について話しましょう: 「PHP5 オブジェクトには新しい特別なメソッドがあります。このメソッドは、オブジェクト内の他のメソッドを監視するために使用されます。オブジェクトに存在しないメソッドを呼び出そうとすると、__call メソッドが呼び出されます。自動的に「

」と呼ばれます。

典型的な使用例:

 
运行结果:
Calling object method 'runTest' in object context
不过,最近终于看到了一个__call在实际开发中的应用。thinkphp作为国内应用比较普遍的框架,在它里面对这个方法应用个人觉得算的上是完美啊!

比如在thinkphp的:lib->think->core->model.class.php文件里面(Model类)有这么一段代码:

コードは次のとおりです コードをコピー
runTest('オブジェクト コンテキスト内');

 代码如下 复制代码
    /**
     +----------------------------------------------------------
     * 利用__call方法实现一些特殊的Model方法
     +----------------------------------------------------------
     * @access public
     +----------------------------------------------------------
     * @param string $method 方法名称
     * @param array $args 调用参数
     +----------------------------------------------------------
     * @return mixed
     +----------------------------------------------------------
     */
    public function __call($method,$args) {
        if(in_array(strtolower($method),array('field','table','where','order','limit','page','alias','having','group','lock','distinct'),true)) {
            // 连贯操作的实现
            $this->options[strtolower($method)] =   $args[0];
            return $this;
        }elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){
            // 统计查询的实现
            $field =  isset($args[0])?$args[0]:'*';
            return $this->getField(strtoupper($method).'('.$field.') AS tp_'.$method);
        }elseif(strtolower(substr($method,0,5))=='getby') {
            // 根据某个字段获取记录
            $field   =   parse_name(substr($method,5));
            $where[$field] =  $args[0];
            return $this->where($where)->find();
        }else{
            throw_exception(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_'));
            return;
        }
    }

まず、コードの具体的な機能については説明しません。第 2 に、コード内のプログラミングのアイデアを調べることで学ぶべき価値がまだたくさんあります。

彼の呼び出し方について話せば、彼がいかに「強力」であるかがわかります。
電話:
$this->dao= M('table'); // テーブル モデルの高速かつ高パフォーマンスなインスタンス化
$this->dao->field($field)->where($where)->limit($offset . ',' . $limit)->select(); // クエリフィールドを設定します。 , クエリ条件、クエリ数量を設定し、最後にクエリ操作を実行します。もちろん、返されるのはデータベースのレコードです

「何かが間違っている」を参照してください。field メソッドがオブジェクトになり、where、limit、select メソッドもオブジェクトになりました。実際、field メソッドと where メソッドは Model クラスに存在しません。これらのメソッドが存在しないため、この時点で __call メソッドが実行され、$this オブジェクトが返されます。したがって、この「接続」の記述方法が実現でき、1行のコードですべてのSQL文を扱うことができます。

これ以上は説明しません。__call メソッドの実際の応用例を紹介するだけです。完全に理解したい場合は、thinkphp のソースコードを自分で見ることをお勧めします。 (免責事項: 私は thinkphp とは何の関係もありません。また、その良さを主張しているわけでもありません)

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/631250.html技術記事この記事では、php __call メソッドの使用手順を紹介します。php __call メソッドを学習する必要がある人は、参考にしてください。 PHPに触れ始めたばかりの方は参考書などで見たことがあるかと思います...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。