3

私は PHP が初めてで、Amazon と ebay で Web マッシュアップを作成しようとしています。私の問題は、$keyword という変数を設定する「printCategoryItems()」という関数があることです。この変数をコードの別の場所で使用したいのですが、うまくいきません。例えば、


<?php
function printCategoryItems(){
    if(isset($_GET['keyword'])){
        $keyword = $_GET['keyword'];
        ...
    }
}
...

$query = $keyword;

...

これは私がやろうとしているようなことですが、キーワードの未定義変数エラーが発生します。私がやろうとしていることをする方法はありますか?

事前にご協力いただきありがとうございます。

(Javaプログラミング経験者のみ)

4

4 に答える 4

8

global関数内でキーワードを使用できるため$keywords、関数内は関数$keywords外を参照します。

function printCategoryItems() {
    global $keyword;
    if(isset($_GET['keyword'])){
        $keyword = $_GET['keyword'];
    }
}

printCategoryItems();
var_dump($keyword);

これは、関数内の変数が関数のローカル スコープに属し、グローバル スコープに属していないためです(私は長い間 Java を実行していませんが、Java でも同じだと思います: 関数内で宣言された変数その関数の外からは見えません)


しかし、グローバル変数を使用することは一般的に良い考えではありませんreturn...より良い解決策は、関数にデータを持たせることです。例えば ​​:

function printCategoryItems() {
    if(isset($_GET['keyword'])){
        return $_GET['keyword'];
    }
}

$keyword = printCategoryItems();
var_dump($keyword);


セミサイドノートとして:まだグローバル変数を使用している別の解決策(これも良い考えではありません)は、$GLOBALSスーパーグローバル配列を使用することです:

function printCategoryItems() {
    if(isset($_GET['keyword'])){
        $GLOBALS['keywords'] = $_GET['keyword'];
    }
}

printCategoryItems();
var_dump($GLOBALS['keywords']);

ここでは、globalキーワードはもう必要ありません。


最後に、PHP のドキュメント (特にFunctions に関する部分) を読む必要があります。

于 2010-02-19T12:22:15.967 に答える
2

関数から変数を返す

return $keyword;

関数を呼び出すときに割り当てます

$query = printCategoryItems();

さらに、$query空の文字列として宣言し、参照によって関数に渡すことができますprintCategoryItems(&$query)。または、コードをクラスにラップして$queryインスタンス変数を作成し、 で設定できるようにすることもできます$this->query = $keyword

ただし、という名前の関数から、printCategoryItems()何かを設定するのではなく、画面に何かを出力すると思います。関数の責任を考慮する必要があるかもしれません。

于 2010-02-19T12:21:03.863 に答える
1

反対派に全面的に賛成global。避けることができるところはどこでもglobal避けてください。考えないで、避けてください。そしてPHPでは、回避できなかったシナリオは考えられませんglobal

于 2010-02-19T13:05:45.177 に答える
-1

他の場所で定義されている変数にアクセスしたいが、 function の内側と外側にアクセスしたい場合は、前にglobalキーワードを付けます。

function printCategoryItems(){
    if(isset($_GET['keyword'])){

        global $keyword = $_GET['keyword'];
        ...
    }
}
于 2010-02-19T12:21:14.397 に答える