電子書籍の厳選無料作品が豊富!

phpを勉強しています。可変関数というものがあることを知り、試しに動かしてみました。
そのときに疑問になったことがあります。
可変関数は使わずに、関数内で変数に値を格納し直してreturnで値を戻せば同じことができるのでは?と思いやってみましたが変数に格納されている値が変わりませんでした。
この原因が分かれば教えて頂きたいです。
また、値渡ししたものは関数内で値を変えても影響がない、ということだけ知っていて、
その原因について詳しく知っていなくても問題はでないでしょうか。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>可変関数</title>
</head>
<body>
<?php
/*可変関数を使わない場合*/
function kahen_off_1($kf1) {
$kf1 = "A<br>";
}

function kahen_off_2($kf2) {
$kf2 = "B<br>";
}

$kahen_off = "default<br>";
echo $kahen_off; //default

kahen_off_1($kahen_off);
echo $kahen_off; //default

kahen_off_2($kahen_off);
echo $kahen_off; //default


echo "<br>";


/*可変関数を使う場合*/
function kahen_on_1($kn1) {
$kn1 = "A<br>";
}

function kahen_on_2($kn2) {
$kn2 = "B<br>";
}

$kahen_on = "default<br>";
echo $kahen_on; //default

kahen_on_1(&$kahen_on);
echo $kahen_on; //A

kahen_on_2(&$kahen_on);
echo $kahen_on; //B


echo "<br>";


/*returnでやる場合*/
function kahen_return_1($kr1) {
$kr1 = "A<br>";
return $kr1;
}

function kahen_return_2($kr2) {
$kr2 = "B<br>";
return $kr2;
}

$kahen_return = "default<br>";
echo $kahen_return; //default

echo kahen_return_1($kahen_return); //default

echo kahen_on_2($kahen_return); //default
?>
</body>
</html>

A 回答 (2件)

ANo.1です。

失礼。可変変数でなく可変関数ですね(汗

それでも、どう読んでも「変数名が可変」であることを意識したソースには読めません。可変関数として使うなら

/* function内でecho */
function kahen_on_1() {
echo "A<br />";
}
function kahen_on_2() {
echo "B<br />";
}

$kahen_on = "kahen_on_1";
$kahen_on();
$kahen_on = "kahen_on_2";
$kahen_on();

print "<hr />";

/* returnでやる場合 */
function kahen_return_1() {
return "A<br />";
}
function kahen_return_2() {
return "B<br />";
}

$kahen_return = "kahen_return_1";
echo $kahen_return();
$kahen_return = "kahen_return_2";
echo $kahen_return();

ですよね(変数名のあとに括弧が付くことによって変数の値を関数名として使う)。
    • good
    • 0

>関数内で変数に値を格納し直してreturnで値を戻せば同じことができるのでは?


>と思いやってみましたが変数に格納されている値が変わりませんでした。

デフォルトは「値渡し」です。関数内で変更した値を戻したければ「参照渡し」にしてください。

RTFM.
http://www.php.net/manual/ja/functions.arguments …


というか、提示されたソースは「値渡しと参照渡しのテストスクリプト」にしか読めません。どこにも「可変変数」が出てきていません。「可変変数」は以下のようなものを指すのですが、それは理解されていますよね?

<?php
$var1 = 'aaa';
$var2 = 'bbb';

$var = 'var1';
print $$var . '<br />';
$var = 'var2';
print $$var . '<br />';

http://www.php.net/manual/ja/language.variables. …



可変変数は「そういうものがある」程度に覚えておけば、使う機会に遭遇したときに使えばいいと思います。でも関数の引数の扱いについてはよく理解しておいてください。標準関数でも処理結果を戻り値で戻すものと渡した変数を書き替えて戻す(戻り値は真偽値だけだったり処理件数だったり)ものとありますよが、しばしば混同される方がいらっしゃいますので。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!