PHPの関数に関する質問です。


初歩的な質問かもしれませんが、下記がエラーになる原因はなんでしょうか?
<?php
function test() {
ksort($params);
echo $params;
}
$params = array();
$params['id'] = '0000';
$params['sort'] = 'a';
test();
?>

エラーは
ksort() expects parameter 1 to be array, null given in 〜
と表示されますので配列が入るはずなのにnullですよと言っているのはわかるのですが、なぜnullなのかわかりません。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/07/14 22:39:06
  • 終了:2014/07/14 23:55:06

ベストアンサー

id:watercooler No.2

井戸端さん回答回数289ベストアンサー獲得回数512014/07/14 22:57:57

変数のスコープの問題よ。古いphpはOKだったけど今はちがうの。パラメータで渡す必要があるわ。

<?php
function test(&$p) {
    ksort($p);
}
$params = array();
$params['sort'] = 'a';
$params['id'] = '0000';
echo "ソート前";
var_dump($params);
test($params);
echo "ソート後";
var_dump($params);

&を忘れるとローカル扱いになるから違いに注意よ。下のと比較してみるとわかるはずよ。

<?php
function test($p) {
    ksort($p);
}
$params = array();
$params['sort'] = 'a';
$params['id'] = '0000';
echo "ソート前";
var_dump($params);
test($params);
echo "ソート後";
var_dump($params);


globalも使えるわ。でもglobalに頼ると変数のスコープがぐちゃぐちゃになって管理に苦しむことになるから非推奨よ。

<?php
function test() {
    global $params;
    ksort($params);
}
$params = array();
$params['sort'] = 'a';
$params['id'] = '0000';
echo "ソート前";
var_dump($params);
test();
echo "ソート後";
var_dump($params);
id:finnapple

いつもご教授ありがとうございます。
多様なサンプル助かります。

2014/07/14 23:54:55

その他の回答(1件)

id:a-kuma3 No.1

a-kuma3回答回数4558ベストアンサー獲得回数19032014/07/14 22:52:19

php の変数には、「スコープ」というしばりがあります。
どこからでも見えているわけでは無くて、見える範囲が決まってます。
関数 test の中では、その外側で値を設定されている $params という変数が見えません。
引数で渡してあげることで、関数 test の中でも変数が見えるようになります。

<?php
function test($params) {    // 引数を追加
    ksort($params);
    var_dump($params);
}

$params = array();
$params['id'] = '0000';
$params['sort'] = 'a';
test($params);          // test に引数として、変数 $params を渡してあげる
?>


マニュアルだと、ここ。
 PHP: 変数のスコープ - Manual

id:finnapple

早速の回答ありがとうございます。
スコープですね、勉強になりました。

2014/07/14 23:10:54
id:watercooler No.2

井戸端さん回答回数289ベストアンサー獲得回数512014/07/14 22:57:57ここでベストアンサー

変数のスコープの問題よ。古いphpはOKだったけど今はちがうの。パラメータで渡す必要があるわ。

<?php
function test(&$p) {
    ksort($p);
}
$params = array();
$params['sort'] = 'a';
$params['id'] = '0000';
echo "ソート前";
var_dump($params);
test($params);
echo "ソート後";
var_dump($params);

&を忘れるとローカル扱いになるから違いに注意よ。下のと比較してみるとわかるはずよ。

<?php
function test($p) {
    ksort($p);
}
$params = array();
$params['sort'] = 'a';
$params['id'] = '0000';
echo "ソート前";
var_dump($params);
test($params);
echo "ソート後";
var_dump($params);


globalも使えるわ。でもglobalに頼ると変数のスコープがぐちゃぐちゃになって管理に苦しむことになるから非推奨よ。

<?php
function test() {
    global $params;
    ksort($params);
}
$params = array();
$params['sort'] = 'a';
$params['id'] = '0000';
echo "ソート前";
var_dump($params);
test();
echo "ソート後";
var_dump($params);
id:finnapple

いつもご教授ありがとうございます。
多様なサンプル助かります。

2014/07/14 23:54:55

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません