ポリモーフィズムとは、クラスが使用されるコンテキストに応じてクラスの性質や動作を再定義または変更するオブジェクト指向の機能を指します。
PHP はポリモーフィズムを達成するためのオーバーロードをサポートしていませんが、PHP はさまざまな方向でポリモーフィック効果を達成できます。以下の通り:
<span style="color: #0000ff;">class</span><span style="color: #000000;"> a{ </span><span style="color: #0000ff;">function</span> test(<span style="color: #800080;">$i</span>){ <span style="color: #008000;">//</span><span style="color: #008000;"> $i可以是任何类型的变量</span> <span style="color: #008080;">print_r</span> <span style="color: #800080;">$i</span><span style="color: #000000;">; } }</span>
上記の例では、PHP は弱い型指定の言語であるため、$i は任意の型の変数になり得ることがわかります。このように、関数はパラメーターの型を変更することによって、多態的な形式のオーバーロード メソッドを実装できます。 Java などの厳密に型指定された言語。
この形式は、JAVA のパラメーター型のオーバーロードよりも便利で効率的ですが、次のような問題もあります。
<span style="color: #000000;">php </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 教师类有一个drawPolygon()方法需要一个Polygon类,用来画多边形,此方法内部调用多边形的draw()方法,但由于弱类型,我们可以传入Circle类,就会调用Circle类的draw方法,这就事与愿违了。甚至可以传入阿猫、阿狗类,如果这些类没有draw()方法还会报错。 </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Teacher{ </span><span style="color: #0000ff;">function</span> drawPolygon(<span style="color: #800080;">$polygon</span><span style="color: #000000;">){ </span><span style="color: #800080;">$polygon</span>-><span style="color: #000000;">draw(); } } </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Polygon{ </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> draw(){ </span><span style="color: #0000ff;">echo</span> "draw a polygon"<span style="color: #000000;">; } } </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Circle{ </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> draw(){ </span><span style="color: #0000ff;">echo</span> "draw a circle"<span style="color: #000000;">; } } </span>?>
このような柔軟なポリモーフィズムには、次のようにいくつかの制御が必要であることがわかります。PHP5.3 以降では、パラメーターに型制限を設定できます。
<span style="color: #008000;">//</span><span style="color: #008000;"> 仿java,在变量参数前加一个限制类名</span> <span style="color: #0000ff;">function</span> drawPolygon(Polygon <span style="color: #800080;">$polygon</span><span style="color: #000000;">){ </span><span style="color: #800080;">$polygon</span>-><span style="color: #000000;">draw(); }</span>
パラメータの数を変更するオーバーロードもあります。これは、PHP がメソッドのオーバーロードをサポートしていないためです。そのため、次のような代替メソッドが実装する必要があります。
<span style="color: #000000;">php </span><span style="color: #008000;">//</span><span style="color: #008000;"> 通过可变参数来达到改变参数数量重载的目的 // 不是必须传入的参数,必须在函数定义时赋初始值</span> <span style="color: #0000ff;">function</span> open_database(<span style="color: #800080;">$DB</span>, <span style="color: #800080;">$cache_size_or_values</span>=<span style="color: #0000ff;">null</span>, <span style="color: #800080;">$cache_size</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">switch</span> (function_num_args()) <span style="color: #008000;">//</span><span style="color: #008000;"> 通过function_num_args()函数计算传入参数的个数,根据个数来判断接下来的操作</span> <span style="color: #000000;"> { </span><span style="color: #0000ff;">case</span> 1: <span style="color: #800080;">$r</span> = select_db(<span style="color: #800080;">$DB</span><span style="color: #000000;">); </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #0000ff;">case</span> 2: <span style="color: #800080;">$r</span> = select_db(<span style="color: #800080;">$DB</span>, <span style="color: #800080;">$cache_size_or_values</span><span style="color: #000000;">); </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #0000ff;">case</span> 3: <span style="color: #800080;">$r</span> = select_db(<span style="color: #800080;">$DB</span>, <span style="color: #800080;">$cache_size_or_values</span>, <span style="color: #800080;">$cache_size</span><span style="color: #000000;">); </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">is_resource</span>(<span style="color: #800080;">$r</span><span style="color: #000000;">); } </span>?>