-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
他の言語では難しいのですが、PHPでは関数の戻り値を配列(array)で行い、 結果をlist関数で受けることにより複数の戻り値の様になります。
先ずは、list関数についてみてみます。 以下のソースを見て下さい。<?php $arr = array( "111", "222", "333"); list($d1, $d2, $d3) = $arr; echo $d1.",".$d2.",".$d3; ?>
結果は、変数 $d1, $d2, $d3 に配列のそれぞれの値が順番に入るので以下の表示になります。111,222,333
これを参考にして関数の戻り値を複数にしてみます。<?php //配列での戻り値のテスト関数 function getTest(){ $arr = array( "111", "222", "333"); return $arr; } //戻り値が配列の関数から値の取得 list($ret1, $ret2, $ret3) = getTest(); echo $ret1.','.$ret2.','.$ret3; ?>
関数の戻り値を list関数で受けることで、3個の変数にばらすことができます。
(この結果の表示は先ほどのものと同様です。)
そこで、関数を少し複雑にして、戻り値を1個の数値データと、配列データを戻してみます。<?php //配列での戻り値のテスト関数 function getTest(){ $arr = array( "111", "222", "333"); $cnt = count($arr); return array($cnt, $arr); } //戻り値が配列の関数から値の取得 list($retc, $retarr) = getTest(); echo "<pre>"; print_r($retc); echo "<br />"; print_r($retarr); echo "</pre>"; ?>
関数の中身は、配列データを入れ子にして戻り値にしています。配列の中身がさらに配列でも入れられるのでこの様なことができます。
データベースから一連のデータを取得する場合に、データ件数とそのレコードデータを返す場合に使えると思います。
上のソースの結果は以下の様になります。3 Array ( [0] => 111 [1] => 222 [2] => 333 )
PR -
PHP では引数を複数持つユーザー関数の定義は以下の様になります。
<?php // 一般的な引数が3個ある関数 function func1($P1, $P2, $P3) { // 引数を単に文字列化して連結 return "" . $P1 . $P2 . $P3; } echo "func1:" . func1("1", "22", "333"); // 表示結果 ⇒ func1:122333 ?>
関数自体は特に意味がある内容ではありませんが、引数を文字列として連結して返します。
ここでこの第2引数以降をデフォルト値を持つ様にします。 デフォルト設定は、引数の右側にイコール文字を置き、その後にデフォルト値を書きます。 (第2引数以降は全てデフォルト値を持つ必要があります。)
<?php // 2個の引数がデフォルト値がある関数 function func1($P1, $P2 = "AA", $P3 = "BBB") { // 引数を単に文字列化して連結 return "" . $P1 . $P2 . $P3; } echo "func1:" . func1("1"); // 表示結果 ⇒ func1:1AABBB ?>
結果表示をコメントで記していますが、デフォルト値が表示されるはずです。
もし、第2引数のみデフォルト値としたい場合に以下の様にしたのですが、PHPのエラーが発生しました。<?php // 2個の引数がデフォルト値がある関数 function func1($P1, $P2 = "AA", $P3 = "BBB") { // 引数を単に文字列化して連結 return "" . $P1 . $P2 . $P3; } echo "func1:" . func1("1", , "CCC"); ?>
"func1:1AACCC"の表示を期待したのですが、以下のエラーが発生しました。 第2引数を省略する場合は、第3引数も省略が必要な様です。Parse error: syntax error, unexpected ',' in ******/test-func.php on line 8
そこで第2、第3引数に NULL が指定された場合にはデフォルト値を設定する様にしてみました。 (これだと普通の関数になってしまいました)<?php // 2個の引数がデフォルト値がある関数 function func1($P1, $P2 = "AA", $P3 = "BBB") { if (empty($P2)) { $P2 = "AA"; } if (empty($P3)) { $P3 = "BBB"; } // 引数を単に文字列化して連結 return "" . $P1 . $P2 . $P3; } echo "func1:" . func1("1") . "<br />"; echo "func1:" . func1("1", NULL, "CCC") . "<br />"; echo "func1:" . func1("1", "222") . "<br />"; // 表示結果 // func1:1AABBB // func1:1AACCC // func1:1222BBB ?>
-
以前 stdClass の使い方を以下の記事に記しましたが、今回はそれを関数の引数に使おうと思います。
⇒【PHP】連想配列の様な「stdClass」の使い方について
stdClass を引数にする場合には、どの様なプロパティを設定するのかは、前もって関数の呼び出し側と、関数内の処理を決めておく必要があります。
但し、引数が非常に多くなる場合には stdClass で渡すことですっきりした関数呼び出しにはなると思います。
以下のソースは stdClass を生成し3個のプロパティへを設定し、その内容を表示する簡単な例です。
<?php //[stdClass]が引数の関数宣言 function funcStd(stdClass $cls) { echo "stdVal1=[$cls->stdVal1]<br />"; echo "stdVal2=[$cls->stdVal2]<br />"; echo "stdVal3=[$cls->stdVal3]<br />"; } //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; $stdObj->stdVal3 = "3333"; //関数の実行(データ表示) funcStd($stdObj); ?>
3個のプロパティ値が表示されることが確認できます。stdVal1=[1111] stdVal2=[2222] stdVal3=[3333]
さらにもう一つの関数を宣言します。 この関数は、同じ引数を持つのですが各プロパティを再設定する様にしています。
<?php //[stdClass]が引数の関数宣言 function funcStd(stdClass $cls) { echo "stdVal1=[$cls->stdVal1]<br />"; echo "stdVal2=[$cls->stdVal2]<br />"; echo "stdVal3=[$cls->stdVal3]<br />"; } //[stdClass]の内容を変更する関数宣言 function funcStdUpd(stdClass $cls) { $cls->stdVal1 *= 10; $cls->stdVal2 = $cls->stdVal2 . "AAA"; $cls->stdVal3 = $cls->stdVal3 . "BBB"; } //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; $stdObj->stdVal3 = "3333"; //関数の実行(データ表示) funcStd($stdObj); //[stdClass]の内容を変更 funcStdUpd($stdObj); //関数の実行(データ表示) funcStd($stdObj); ?>
これを実行すると以下の様な結果になります。stdVal1=[1111] stdVal2=[2222] stdVal3=[3333] stdVal1=[11110] stdVal2=[2222AAA] stdVal3=[3333BBB]
関数の引数としてクラスを渡すと、参照渡しで行われる様です。 参照渡しのため、クラスプロパティの値を書き換えることが出来ますので、注意が必要です。
また、 stdClass にプロパティが存在するかどうかをチェックし、処理を分けることも可能です。 上のソースに4番目のプロパティの存在有無で処理を分ける様にする処理を付加したものを以下に示します。<?php //[stdClass]が引数の関数宣言 function funcStd(stdClass $cls) { echo "stdVal1=[$cls->stdVal1]<br />"; echo "stdVal2=[$cls->stdVal2]<br />"; echo "stdVal3=[$cls->stdVal3]<br />"; if(isset($cls->stdVal4)) { echo "stdVal4=[$cls->stdVal4]<br />"; } } //[stdClass]の内容を変更する関数宣言 function funcStdUpd(stdClass $cls) { $cls->stdVal1 *= 10; $cls->stdVal2 = $cls->stdVal2 . "AAA"; $cls->stdVal3 = $cls->stdVal3 . "BBB"; if(isset($cls->stdVal4)) { $cls->stdVal4 = $cls->stdVal4 . "CCC"; } } //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; $stdObj->stdVal3 = "3333"; //関数の実行(データ表示) funcStd($stdObj); //[stdClass]の内容を変更 $stdObj->stdVal4 = "4444"; funcStdUpd($stdObj); //関数の実行(データ表示) funcStd($stdObj); ?>
これを実行すると以下の様な結果になります。stdVal1=[1111] stdVal2=[2222] stdVal3=[3333] stdVal1=[11110] stdVal2=[2222AAA] stdVal3=[3333BBB] stdVal4=[4444CCC]
-
以前 stdClass について以下の記事を書きましたが、 このクラスですが、連想配列的に使えるので当然 foreach の処理が行えます。
⇒【PHP】連想配列の様な「stdClass」の使い方について<?php // [stdClass]の生成 $stdObj = new stdClass; $stdObj->Val1 = 1111; $stdObj->Val2 = "2222"; $stdObj->Val3 = "CCC"; echo "<pre>"; var_dump($stdObj); // [stdClass]を[foreach]で順次取得 foreach ($stdObj as $key => $val) { echo "stdObj[$key] => ".$val."<br />"; } echo "</pre>"; ?>
これを動作させると以下の様な表示になります。object(stdClass)#1 (3) { ["Val1"]=> int(1111) ["Val2"]=> string(4) "2222" ["Val3"]=> string(3) "CCC" } stdObj[Val1] => 1111 stdObj[Val2] => 2222 stdObj[Val3] => CCC
連想配列の様にキーとその値が取得できています。
stdClass 使いようによってはいろいろできそうに思います。
-
最近他の人が作ったプログラムの改修作業が在ったのですが、その中で stdClass を使っていて 私は使ったことが無かったので少し調べてみたところ、連想配列の様な使い方ができることを知りました。
クラスを使う場合、普通は別のクラス宣言でクラス名を付けますが stdClass は無名クラスとして クラスオブジェクトを生成する様です。
以下のソースは stdClass を生成し2個のプロパティへの代入を行う簡単な例です。
stdClass で生成されたオブジェクトに対して、プロパティを指定する時点で、 内部的にそのプロパティが生成されるようです。<?php //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; //[stdClass]の参照 echo "stdVal1=[$stdObj->stdVal1]
"; echo "stdVal2=[$stdObj->stdVal2]
"; ?>
結果は以下の表示になります。stdVal1=[1111] stdVal2=[2222]
2個のプロパティに値が設定されていることが確認できます。
尚、このソースに stdVal3 というプロパティを参照する様にしてみます。<?php //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; //[stdClass]の参照 echo "stdVal1=[$stdObj->stdVal1]
"; echo "stdVal2=[$stdObj->stdVal2]
"; echo "stdVal3=[$stdObj->stdVal3]
"; ?>
この結果は以下の様に、Notice エラーが発生します。
代入設定されていないプロパティを参照することはできない様です。stdVal1=[1111] stdVal2=[2222] Notice: Undefined property: stdClass::$stdVal3 in C:\xampp\htdocs\__test\test-stdclass.php on line 9 stdVal3=[]
この stdClass ですが配列に変換することができます。 以下のソースでは stdClass オブジェクトを array オブジェクトに代入し変換しています。<?php //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; //[stdClass]から[array]への変換 $arrObj = (array)$stdObj; echo "stdVal1=[".$arrObj["stdVal1"]."]
"; echo "stdVal2=[".$arrObj["stdVal2"]."]
"; ?>
上のソースから stdClass は連想配列的であることが分かります。
尚、 stdVal1 とソース上固定の記述のみしか扱えないわけでは無く、 次の例では stdVal1 の参照を変数を用いて行う方法を示します。<?php //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; //[stdClass]の参照を変数で行う $key1 = "stdVal1"; $key2 = "stdVal2"; echo "stdVal1=[".$stdObj->$key1."]
"; echo "stdVal2=[".$stdObj->$key2."]
"; //中括弧で囲っても同じ echo "stdVal1=[".$stdObj->{$key1}."]
"; echo "stdVal2=[".$stdObj->{$key2}."]
"; ?>
オブジェクトのプロパティを変数で扱えると応用がいろいろ利くと思います。
PHP でシステムを組んでいると、データの中の区分値などを select タグを用いて入力します。 この区分値を入力不可にしようとして select タグの部分に disabled="disabled" とすることが多いです。
ただこの方法ですと、画面上は select ボックスは表示されるのですが POST 処理で値が渡ってきません。 以下のソースをブラウザで表示して OK を押下すると「select value = 」の所には何も表示されません。