PHPはどのように関数の重荷を実現します
10153 ワード
よく知られているように、PHPはばらばらな言語なので、関数のリロードはサポートされていません(関数のオーバーライドとは異なります).しかし、今日Exceptionを見たとき、Exceptionのコンストラクタにリロードがあることに気づきました.以下のように呼び出すことができます. throw new Exception("Something bad just happened", 4); throw new Exception("Something bad just happened"); throw new Exception("",4);
明らかに、上記の方法は重荷です.PHPでは関数のリロードが可能なのですが、どのように実現されているのでしょうか.しばらく考えてみると、PHPの弱いタイプである以上、関数パラメータのタイプによって関数を識別することはできないが、関数パラメータの個数を統計することができるだろう.そこで、この考え方に基づいて、以下のコードがあります.
ClassTest.phpファイルコード
index.phpファイルコード
上記のコードから、主にfunc_のおかげであることがわかります.num_args()関数の使用.
明らかに、上記の方法は重荷です.PHPでは関数のリロードが可能なのですが、どのように実現されているのでしょうか.しばらく考えてみると、PHPの弱いタイプである以上、関数パラメータのタイプによって関数を識別することはできないが、関数パラメータの個数を統計することができるだろう.そこで、この考え方に基づいて、以下のコードがあります.
ClassTest.phpファイルコード
1
<?
php
2
class
ClassTest{
3
4
public
function
fun(
$x
=
null
,
$y
=
null
){
5
if
(
func_num_args
()
==
1
){
6
$this
->
fun1(
$x
);
7
}
8
if
(
func_num_args
()
==
2
){
9
$this
->
fun2(
$x
,
$y
);
10
}
11
}
12
13
private
function
fun1(
$x
){
14
echo
"
fun1 is called!\t\$x=
$x
<br/>
"
;
15
}
16
17
private
function
fun2(
$x
,
$y
){
18
echo
"
fun2 is called!\t\$x=
$x
\t\$y=
$y
<br/>
"
;
19
}
20
21
public
function
funWithoutParam(){
22
$temp
=
"
funWithoutParam
"
.
func_num_args
();
23
$this
->
$temp
();
24
}
25
26
private
function
funWithoutParam1(){
27
echo
"
funWithoutParam1 is called!<br/>
"
;
28
}
29
private
function
funWithoutParam2(){
30
echo
"
funWithoutParam2 is called!<br/>
"
;
31
}
32
}
33
?>
index.phpファイルコード
1
<?
php
2
function
__autoload(
$className
){
3
require_once
$className
.
'
.php
'
;
4
}
5
6
$test
=
new
ClassTest();
7
//
overload with parameters
8
$test
->
fun(
1
);
9
$test
->
fun(
1
,
2
);
10
11
//
overload without parameters
12
$test
->
funWithoutParam(
1
);
13
$test
->
funWithoutParam(
1
,
2
);
14
?>
上記のコードから、主にfunc_のおかげであることがわかります.num_args()関数の使用.