関数スキルを購入
次に、可変数のパラメーターを使用する方法、関数が受信変数を変更できるようにする方法、関数が使用されるデータになる方法など、関数のより魔法のプロパティのいくつかを見てみましょう。
このセクションの内容は、この章の中で最も挑戦的なセクションであり、冒険心があり、好奇心旺盛で、経験豊富なプログラマーのみに適しています。
変数パラメータの数
状況に応じて受信関数を呼び出すときに、実際のパラメータの数を知っておくと非常に役立ちます。PHP でそれを処理するには 3 つの方法が考えられますが、そのうちの 1 つは PHP4 でのみ使用できます。 :
1. デフォルトのパラメータを使用して関数を定義します。関数が呼び出しでパラメータを省略すると、代わりにデフォルト値が使用され、警告メッセージは表示されません。
2. これらの値を格納するには配列パラメータを使用します。呼び出し元のプログラム コードはこの配列をラップする役割を果たし、関数本体はデータを適切に分離する必要があります。
3. PHP4 の可変引数関数 (func_num_args()、func_get_arg()、および func_get_args()) を使用します。
デフォルトパラメータ
プリセットパラメータを使用して関数を定義するには、仮パラメータを指定された式に変更するだけです。実際の呼び出しのパラメータが定義の仮パラメータよりも小さい場合、PHP は仮パラメータを実際のパラメータと比較して照合し、使い果たされた後、プリセットの仕様を使用して残りのパラメータを埋めます。
たとえば、次の関数の変数はすべてデフォルト値で定義されています:
function Tour_guide($city = “Gotham City”,
$desc = “vast metropolis”,
$how_many = “ Dozens”,
$of_what = "衣装を着た悪役")
{
print("$city は $of_what の
$how_many で満たされた $desc です。< BR >");
}
Tour_guide() ;
tour_guide("シカゴ");
tour_guide("素晴らしい街");
tour_guide(" Chicago"、"素晴らしい都市"、
"何百万人もの人が溢れている"、
"
金と苦労の物語を心に持つ不機嫌な人々");
ブラウザは次のような結果を出力します。改行文中の は、使用されているブラウザーによって決まります:
Gotham City is a great metropolis full with dozens of clothesd Villas.
Chicago is a great metropolisfilled with dozens of paradise Villas.
Chicago is a Beautiful cityfilled with数十の衣装を着た悪役たち。
シカゴは、衣装を着た何百万人もの悪役で満たされた素晴らしい都市です。
シカゴは、金と不運の物語を語る無愛想な人々が何百万人も溢れている素晴らしい都市です。
デフォルトパラメータ メイン制限は、実パラメータと仮パラメータの一致が、先着順で 2 つのパラメータを順次比較することによって決定されることです。したがって、デフォルトのパラメータ設定をいじって、気づかないうちに多くの問題が発生することはありません。
配列を使用して複数のパラメータを置き換えます
複数のパラメータの柔軟性に満足できない場合は、通信手段として配列を使用すると、パラメータのカウントの問題全体を回避できます。
次の例では、この戦略が使用されており、また、三項演算子 (第 7 章で紹介) や連想配列 (第 6 章で不定期に言及されていますが、第 11 章で詳しく説明されています) などのいくつかのトリックも使用されています。
関数 Tour_brochure($info_array)
{
$city =
IsSet ($info_array[?city?])?
$info_array[?city?]: "ゴッサムシティ ";
IsSet ($info_array[?city?])?
$info_array[?desc?]: "素晴らしい大都市";
$how_many =
IsSet ($info_array[?how_many? ])?
$info_array[ ?how_many?]:"数十人";
$of_what
IsSet ($info_array[?of_what?])?
$info_array[?of_what?]:"衣装を着た悪役";
print(“$city は$desc filled with
$how_many of $of_what.< BR >”);
}
この関数は、3 項を使用して、受信した配列パラメータを特定の文字列から区切る 4 つの文字をチェックします。条件演算子「?」の場合、ローカル変数が (配列に格納されている場合) 渡された値として指定され、それ以外の場合はデフォルト値として指定されます。ここで、2 つの異なる配列を使用してこの関数を呼び出してみます。
tur_brochure(array()); //空の配列
$tour_info =
aray(?city?=>?Cozumel?,
? desc? =>?destination getaway?,
'of_what'= >'砂浜');
tur_brochure($tour_info);
この例では、最初に空の配列 (パラメーターがないことに対応) を使用します。 Tour_brochure を呼び出します。 、次に、関連付けられる可能性のある 4 つの値のうち 3 つを格納する配列を使用してそれを呼び出します。ブラウザの出力は次のようになります:
ゴッサムシティは、衣装を着た悪役がたくさんいる大都市です。
コスメルは、数十の砂浜がいっぱいの休暇先です。
どちらの場合も、どちらの配列も「how_many」関連セクションに何も格納されていないため、「dozens」という数がデフォルトになります。
PHP4 での複数のパラメーターの使用
最後に、PHP4 には、関数本体内のパラメーターの数と値を取得できるいくつかの関数が用意されています。これらの関数は次のとおりです。
fnc_num_args() はパラメーターを受け取らず、渡されたパラメーターの数を返します。この関数を呼び出します。
fnc_get_arg() は整数パラメータ n を受け取り、関数呼び出しの n 番目のパラメータを返します。パラメータのカウントは0から始まります。
fnc_get_args() はパラメータをとらず、関数呼び出しのすべてのパラメータを含む配列を返します。配列のインデックスは 0 から始まります。
これら 3 つの関数は、関数本体の外で呼び出された場合、すべて警告メッセージをスローします。呼び出し時に使用されるインデックスが、渡された最後のパラメーターのインデックスよりも大きい場合、 func_get_arg() も警告をスローします。
ユーザーの関数がパラメータをデコードするためにこれらの関数を使用する場合、実際のパラメータが定義内の仮パラメータの数を超えているという事実によって PHP は影響を受けません。 。 不平をいう。ユーザーはパラメーターなしで関数を定義し、この関数を使用して実際に渡される関数を比較および照合できます。
たとえば、渡された引数の配列をそれぞれ返す次の 2 つの関数インスタンスについて考えてみましょう。 local_array = array();
wile($counter < $arg_count)
{
$local_array[$counter] =
fnc_get_arg($ary_counter);
$counter = $Countr + 1;
RTURN ($ Local_array);
}
Fnction ARGS_AS_ARAY_2 () {
RTUN (FUNC_GET_ARGS ()); を使用して各引数を取得し、func_num_args() の結果を使用してループをバインドします。実際に渡された引数以上の引数は取得されません。各パラメータは配列に格納され、その配列が返されます。このような引数のラップは実際には func_get_arps() によって行われるため、この関数の 2 番目のバージョンは非常に短くなります。
ここでは、複数のパラメータ関数を使用してデフォルトのパラメータを置き換える、前の Tour_guide() 関数を書き直します。 $num_args > 0 ?
fnc_get_arg(0):"ゴッサム シティ";
$desc = $num_args >1 ?
$desc = $num_args > 1 ?
fnc_get_arg(1): "大都市";
$how_many = $num_args > 2 ?
fnc_get_arg(2): "数十人";
$of_what = $num_args > 3 ?
fnc_get_arg(3): "衣装を着た" 悪役";
pint("$city is a $descfilled with
$how_many of $of_what. < BR >");
}
tur_guide2();
上記のプログラムコードとデフォルトのパラメトリックプログラムコードは同じです機能や効果も異なり、同様の制限が適用されます。パラメータは位置的に渡されるため、「衣装を着た悪役」を他のものに置き換える方法はなく、「ゴッサム シティ」のみがデフォルト値として使用されます。
値による呼び出しと参照による呼び出し
PHP のユーザー定義関数のデフォルトのアクションは「値による呼び出し (値呼び出し)」です。これは、変数が関数に渡されるときを意味します。呼び出し時に、PHP は変数値のコピーを作成し、それを関数に渡します。したがって、関数が何を実行しても、関数呼び出しに表示される実際の変数を変更することはできません。この動作には利点もありますが、欠点もあります。これは、関数の戻り値を利用したいだけの場合には確かに良いアプローチですが、渡された変数を変更することが実際の目的である場合には邪魔になる可能性があります。
以下は、値による呼び出しを実装するかなり非効率な減算の例の実装を示します。負の数は虚数です");
$return_result = 0;
wile($numml >$num2)
{
$numml = $numml - 1;
$return_result = $return_result + 1;
} rturn($ return_result); $ first_op = 493; ; BR >”);
$result2 = my_subtract($first_op,$second_op);
Print(“result2 is $result2< BR >”);
すごいですね、同じ 2 つの減算が見られました。結果は同じになります:
rsult1 は 138
rsult2 は 138
たとえ my_subtract が仮パラメータ $numml の値を変更したとしても、$numml 変数は実際のパラメータ $ にのみ格納されます。 first_op 値の単なるコピーであるため、$first_op は影響を受けません。
参照による呼び出し
PHP には、関数の定義内または関数呼び出し (参照渡しとも呼ばれる) 内のパラメーターをより変更できるようにする 2 つの異なる方法が用意されています。
入力変数を直接操作する関数を定義したい場合は、以下に示すように、定義内の仮パラメータの前に「&」記号を追加できます。
fnction my_subtract_ref(&$numml,&$ num2)
{
i($numl-<$num2)
de("負の数は虚数です");
$return_result = 0;
wile($num1 >$num2)
{
$num1 – 1;
$return_result + 1;
}
$first_op = 355;
$result1 = my _subtract_ref($first_op, $second_op);
pint(“result1 は $result1< BR >”);
$result2 = my_subtract_ref($first_op,$second_op);
pint(“result2 は $result1< BR >”) $result2< ; BR >");
ここで、前と同じ減算呼び出しを実行すると、次の出力が得られます:
rsult1 is 138
rsult1 is 0
これは、仮パラメータ $numl と実際のパラメータ $first_op は同じ内容を参照しており、一方を変更することは他方を変更することと同等です。実際のパラメータの前に「&」記号を追加することで、関数にパラメータを強制的に渡すこともできます (これは段階的に廃止される機能であり、将来の PHP バージョンでは削除される可能性があります)。つまり、次のように、元の値による呼び出し関数を使用して、参照によってアクションを取得できます。 $second_op);
Print(“result1 は $result1< BR >”);
$result2= my_subtract(&$first_op,&$second_op);
Print(“result2 は $result2< BR >” );
今回は次の結果が得られました:
rsult1 is 138
rsult1 is 0
PHP4 では、関数呼び出しの外でも変数パラメーターを使用できます。一般に、変数参照 (&$varname) を変数に割り当てると、2 つの変数は同じ値を持つ 2 つの異なる変数ではなく、お互いのエイリアス、
(つまり、ドッペルゲンガー) になります。例:
$name_1 = "マンフレッド・フォン・リヒトーフェン";
$name_2 = "パーシー・ブレイクニー"; // 変数は同じ値を持ちます
$alias_2=&$name_2 / /変数は同じです
$alias_1 = "The Red Baron"; //実際の名前は変更されていません
$alias_2 = "The Scarlet Pimpernel" //それが何であるかはもう問題ではありません
Prnt ("$alias_1 is $name_1< BR> ; ”);
Prnt(“$alias_2 is $name_2< BR >”);
上記のプログラムコードは次のようなブラウザ出力を取得します:
レッドバロンはマンフレッドですvon Richtofen
The Scarlet Pimpernel は The Scarlet Pimpernel です
変数関数名
PHP の非常に柔軟なテクニックは、ユーザーが関数を定義する場所を変数を使用して置き換えることです。つまり、プログラム コードにリテラルの関数名を入力する代わりに、「&」記号で始まる変数を入力できます。実行中に呼び出される実際の関数は、変数に割り当てられた文字列によって異なります。ある意味、これにより関数をデータとして使用できるようになります。このテクニックは C プログラマーには馴染みのあるものかもしれませんが、Scheme や Common Lisp などのあらゆる種類の Lisp 言語の初心者にも馴染みます。
たとえば、次の 2 つの関数呼び出しはまったく同じです:
function Customized_greeting()
{
print(“カスタマイズされた方法で挨拶されています !< BR >”);
$my_greeting();
$my_greeting();
上記のコードは、カスタマイズされた方法で挨拶されています!
関数名は文字列であり、関数のパラメータとして使用したり、関数の結果として返すこともできます。
拡張例+
関数名を関数パラメータとして使用するなど、関数のより高度な機能の 1 つを使用するときにどのような問題が発生する可能性があるかを見てみましょう。
例 8-1 この関数は、表示される情報を別の文字に置き換える、最も原始的なパスワード システムの拡張例を示しています。
次のプログラム コードは、本書でこれまでに説明したどのプログラム コードよりも長く、より高度です。詳細を知りたくない人は、このコードをスキップしてください。
例 8-1 暗号動物学的置換
/*パート 1: 暗号計算と効用関数*/
function add 1 ($num)
{
return(($num+ 1)%26);
}
function sub_1($num)
{
return(($num+ 25)% 26);
}
関数スワップ 2 ($num)
{
if($num % 2 = = 0 )
return($num+ 1);
else
return($num - 1);
}
関数スワップ 26($num)
{
return(25 - $num);
}
関数小文字($char string)
{
return(ord($char string) >=ord('a'))&&
(ord(&char string)< =ord('z') ));
}
関数大文字($char文字列)
{
return((ord($char文字列) >=ord('A'))&&
(ord($char文字列) < =ord('z')));
}
/*第二部份:文字暗号関数式 */
関数文字暗号($char string, $code func)
{
if !(大文字($char文字列)||
下文字($char文字列)))
return($char文字列);
if(大文字($char文字列))
$base num = ord ('A');
else
$base num = ord($char string) –
$base num);
return(chr($base num +
($code func ($char num )
% 26)));
}
/*第三部份:主要string cipher関数式 */
function string cipher($message,$cipher func)
{
$coded message = ” ”;
$message length = strlen($message);
for($index= 0;
$index
$index++)
$coded message .=
文字暗号( $message[$index],$cipher func);
return($coded message);
}
例8-1 3 つの部分が共有されています。関数 add_1 は、「26」を模数としてその数値を 1 加算します (単に 26 と 26 を超える数値を意味します)。 「0」から始まり、0 が 1 に、1 が 2 に、…、25 が 0 に「戻る」可能性があります。 Swap_2 は、数字の位置 (0 から 1 、1 から 0 、2 から 3) を対になるように配置します。 、3 から 2…など)、swap_26 は、より高い数字とより低い数字の置換を実行します(25 から 0 、0 から 25 、24 から 1 、1 から 24 など)。すべての関数計算は、この簡単な暗号化プログラムの基礎です。最後に、文字が大書きであるか小書きであるかを検査するために使用される 2 つの公開プログラム関数もあります。この関数は、最初の部分の 1 つの計算関数を取得し、その後、それを使用して単一の文字母をコード化します。 Ord() の機能は、数値を数値に変換し、数値が 0 から 25 までに収まるように適切な数値 (a または A) を表すことです。内部では、その名前を文字列形式で送信する暗号関数式で使用でき、さらに数値変換されて文字母になり、最後にそれが返されます。 1 つの文字列情報と 1 つの暗号化関数があり、これらは、関数を通過して暗号化される内容である新しい文字列として転送されます。文字列接続算子「.=」が含まれます(第 10 章で提示)、この関数式はメッセージ文字列の文字母から順に処理され、新しい文字列が作成され、新文字母は旧字母の数字です。 $cipher_func を使用して得られた結果を示し、ここまででこれらの十分な結果が得られています。元のメッセージは :$orgin");
$coding_array = array('add_1',
'sub_1,
'swap_2',
'swap_26');
For($count = 0;
$count
$coded_message =
String_cipher($original,$code);
Print(“$code エンコーディングは :$coded_message< BR >”);
}
これらの测试程序事前に設定された 4 つの文字コード関数を使用して、それらを 1 つの列内で巡回し、その列を巡回して $original 情報を暗号化し、表示後のバージョンを出力します。元のメッセージは次のとおりです。 私の秘密のメッセージは ABCDEFG
add_1 エンコードは :Nz tfdsfu nfttbhf jt BCDEFGH
sub_1 エンコードは :Lx rdbqfs nfttbhf jt BADCFRH
swap_2 エンコードは :Nz tfdqfs nfttbhf jt BADCFEH
swap_26 エンコードは: Nb hvxivg nvhhztv rh ZYXWVUT
では、この関数をリソースとして扱う方法をさらに深めて、シーケンス内のメッセージを複数の暗号の関数比で記述することもできます。この関数は、PHP4 の可変パラメータ型関数も使用しています。
Functionchained_code ($message)
{
/* 先に取得して確定情報を反映し、その後コード関数名を任意の数に置き換えます。各エンコード関数を前の結果に適用し、その結果を返します。 */
$argc = func_num_args();
$coded = $message;
For ($count = 1 ; $count
{
$function_name = func_get_arg($count) ;
$coded =
String_cipher($coded,
$function_name);
}
Return($coded);
}
Chained_code() 最初のパラメータはメッセージ文字列である必要があり、その後に次のパラメータが続きます。暗号化関数に対応する任意の数の名前。エンコードされたメッセージは、最初のエンコード関数をメッセージに適用し、次にその結果に 2 番目のエンコード関数を適用するなどの結果です。これは、事前定義されたアルファベットのエンコード関数のさまざまな組み合わせを使用してテストできます。
$tricky =
Chained_code($original,
'add_1''swap_26',
'add_1''swap_2');
Print("Tricky エンコードされたバージョンは $tricky< BR >");
$easy =
Chained_code($original,
'add_1','swap_26',
'swap_','sub_1',
'add_1', 'swap_2,'
'swap_26,''sub_1, ');
Print("簡単にエンコードされたバージョンは $easy< BR >");
結果は次のとおりです:
トリッキーエンコードされたバージョンはMa guwjh muggysu qg YXWXUVS
簡単にエンコードされたバージョンは私の秘密のメッセージはABCDEFGです
ご覧のとおり、「トリッキーな」メッセージ コードは前のコードを組み合わせたものですが、単一のコーディング関数に正確に対応しているわけではありません。 「簡単な」エンコードは、これらの関数をより複雑に組み合わせたもので、その結果は、変更のない元のメッセージになります。 (これはキーコードが無効だからではなく、この一連の編集機能がなぜ元の開始メッセージに再び戻ることができるのかを読者に理解してもらいたいだけです。)
この小さなパスワード スクリプトに示されている範囲の目的パスワード プログラムは少し複雑ですが、PHP は関数パラメータとして関数名の使用をサポートしているため、非常に単純になることを理解してください。
概要
PHP のほとんどの機能は、PHP のオープンソース開発チームによって提供される多数の組み込み関数として存在します。 http://www.php.net のオンライン マニュアルに各関数の説明 (一部は簡単なものもあります) が記載されている必要があります。
独自の関数を作成することもでき、組み込み関数と同じ方法でアクセスできます。関数は、次のような単純な C スタイルの構文で記述されます。 }
ユーザー定義関数は、PHP タイプのパラメーターの任意の組み合わせを使用でき、任意のタイプの値を返すこともできます。パラメータと戻り値の型を宣言する必要はありません。
PHP4では、呼び出される関数が定義されていれば、関数の定義数と関数呼び出しの数に違いはありません。個別の関数宣言やプロトタイピングは必要ありません。関数内で指定された変数は、グローバル宣言が使用されない限り、関数領域に制限されます。ローカル変数は静的に宣言できます。これは、関数呼び出し間で値を保持することを意味します。
ユーザー定義関数のデフォルトのアクション動作は「call_by_reference」です。これは、関数が操作中にパラメーターのコピーを使用するため、関数呼び出しで元の変数を変更できないことを意味します。パラメーターの前に「&」を追加すると、「参照による呼び出し」を強制できます。これは、定義側または呼び出し側のどちらでも使用できます。 PHP では、関数変数が受け取るパラメーターの数を作成するさまざまな方法が提供されています。最後に、ユーザー定義関数の名前を文字列変数に置き換えることによって、呼び出される関数を実行時に決定できます。これにより、関数をデータとして扱い、他の関数間でやり取りできるようになります。
上記は PHP 学習ガイド - 第 8 章 (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。