1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
/* ----------------------------------------------------------------------------------
 *  クラス・オブジェクト:存在しないメソッドへのアクセス制御:「__call関数」の例
 *  2015.10.14 作成 yoshi of CXMedia Inc.
 * ----------------------------------------------------------------------------------
 */
header("Content-type:text/plain; charset=UTF-8");

/* -------------------
 *   クラスの構成
 * ------------------- */
class Test{
    
/* ------------------------------------------------------------------------------------
     *   __call関数は、存在しないメソッドがコールされたときに自動的に呼び出される特殊な関数
     *   引数として、コールされた「メソッド名」と「引数」(配列)が渡されます。
     * ------------------------------------------------------------------------------------ */
    
function __call($name$params){
        echo 
"■__call()関数がコールされた\n";

        
// メソッドに別名をつける
        
if(preg_match("/^(sample|example)$/"$name)){
            
$this->testMethod($params[0]);
        }else{
            echo 
$name,":そのようなメソッドなし\n";
            exit();
        }
    }
    
// メソッド
    
public function testMethod($arg){
        
printf("testMethod(%d)をコール\n\n"$arg);
    }
}

/* --------------
 *  クラスの利用
 * -------------- */
// ---インスタンス(オブジェクト)を作成--- //
$obj = new Test();

// Testのクラス内にあるメソッドのため、__call関数はコールされない
$obj->testMethod(1);

// Testのクラス内にないメソッドのため、__call関数がコールされる
$obj->sample(2);
$obj->example(3);
$obj->undefMethod(4);
?>