PHPチェーン操作基本原理、call_user_func(),call_user_func_Array()とMagic Methods_get(),__set(),__call()の使い方

4030 ワード

前言
フレームワークのソースコードを読むと、ソースコードにはチェーン動作、およびcall_user_func()およびcall_user_func_array()という呼び出し関数の方法が大量に使用されていることが分かった.両者は関連していないが,コードをより簡潔にし,論理をより明確にすることを目的としている.資料を整理してみんなと一緒に勉強します.call_user_func()およびcall_user_func_array():call_user_func():最初のパラメータをコールバック関数として呼び出し、後のパラメータをコールバック関数のパラメータとする.http://php.net/manual/zh/function.call-user-func.php
call_user_func_array():コールバック関数を呼び出し、1つの配列パラメータをコールバック関数のパラメータとし、第2の各配列パラメータをコールバック関数のパラメータとする.http://php.net/manual/zh/function.call-user-func-array.php
2つの方法は類似しており、異なる場合には異なるパラメータ伝達方式があり、call_user_func()を例に様々な状況を説明します.
コールバック関数は匿名関数、有名関数、クラスを渡す方法、
最初のパラメータが有名な関数の場合は、関数の名前を渡すだけで、クラスのメソッドを使用する場合は、クラスの名前とメソッド名を渡す必要があります.
内部メソッドはコールバック関数として使用されます.


コールバック関数として外部クラス:
";
    }
   public function number($num){
        return $num ? $num+1:$num;
    }  
}
//    
//    \  ::   
call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0
//    \  ','   '
call_user_func([__NAMESPACE__ .'\Foo', 'test']); // As of PHP 5.3.0
//    
$o = new Foo;
$return = call_user_func([$o,'number'],1);//                    
var_dump($return);
??>

外部クラスはまた、相対パスの方法をコールバック関数として使用することもできる.例えば、コールバック関数が'\\think\\paginator\\driver\\'getCurrentPageの方法、パラメータが$var_pageの方法である.
        $class = '\\think\\paginator\\driver\\' ;
        $page  = call_user_func([
            $class,
            'getCurrentPage',
        ],$var_page);

最初のパラメータが匿名関数の場合:call_user_func関数はphpが匿名関数を参照する方式であり、phpはjsのように匿名関数を変数に付与して参照することはできないが、call_user_func関数は匿名関数を呼び出し,局所変数がグローバルに汚染されないようにすることもできる.
';
    echo ++$call,'
'; },1);

チェーン操作の原理
参照先:https://www.jb51.net/article/103836.htm
チェーン操作の核心は$thisポインタを返して、後ろの関数を呼び出して、パラメータと共有させます!__get(),__set(),__call()__construct(構成方法)を組み合わせて実現する.__constructは、クラスを作成するときに呼び出される__get()が、存在しないメンバー変数にアクセスするときに呼び出される方法を構築する.__set()は、存在しないメンバー変数を設定するときに呼び出される.__call()呼び出しクラスに存在しないメソッドがある場合に呼び出されます.
通常、文字列関数を計算するときは、文字列にスペースをフィルタしてから、その長さを求めます.
strlen(trim($str))

しかし、どのようにしてチェーン操作の形式で実現することができますか?
$str->trim()->strlen();

核心思想:
チェーン操作、クラスのライフサイクルの終了はチェーン操作の最後にあり、すべてのパラメータの共有はメンバー変数によって行うことができ、__constructによってメンバー変数の付与を行い、__get(),__set(),__call()によって呼び出し関係を処理する.
value = $value;
  }
 
  function __call($function, $args){
    $this->value = call_user_func($function, $this->value, $args[0]);//     trim()  ,  2   
    return $this;
  }
 
  function strlen() {
    return strlen($this->value);
  }
}
 
$str = new StringHelper("hi boys and girls ! ");
echo $str->trim('0')->strlen();

詳細:Magic Methodshttp://php.net/manual/zh/language.oop5.magic.php
最後に
ここで紹介するチェーン操作は最も基本的な原理であり、フレームワークではどのように柔軟に運用されているのだろうか.
フォローしてください!(o゜▽゜)o☆