人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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なのかわかりません。


●質問者: 雨の日
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● a-kuma3

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


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

2 ● 井戸端さん
ベストアンサー

変数のスコープの問題よ。古い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);

雨の日さんのコメント
いつもご教授ありがとうございます。 多様なサンプル助かります。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ