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);
?>