Как получить переменную из другой функции - PullRequest
3 голосов
/ 19 февраля 2010

Я новичок в PHP и пытаюсь создать веб-гибрид с Amazon и Ebay. Моя проблема в том, что у меня есть функция с именем printCategoryItems (), которая устанавливает переменную с именем $ keyword. Я хочу использовать эту переменную в другом месте кода, но не могу заставить ее работать. Например,


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

$query = $keyword;

...

Это то, что я пытаюсь сделать, но я получаю неопределенную ошибку переменной для ключевого слова. Есть ли способ для меня сделать то, что я пытаюсь сделать?

Заранее спасибо за помощь.

(только опыт программирования на Java)

Ответы [ 4 ]

6 голосов
/ 19 февраля 2010

Вы можете использовать ключевое слово 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 - особенно часть о функциях .

2 голосов
/ 19 февраля 2010

Вернуть переменную из функции

return $keyword;

и назначьте его при вызове функции

$query = printCategoryItems();

Кроме того, вы можете объявить $query пустой строкой и передать ее функции по ссылке, например, printCategoryItems(&$query). Или вы можете заключить код в класс и сделать $query переменной экземпляра, чтобы вы могли установить ее с помощью $this->query = $keyword.

Однако от функции с именем printCategoryItems() я бы не ожидал, что она что-то установит, кроме как что-то напечатать на экране. Возможно, вы захотите рассмотреть ответственность функции.

1 голос
/ 19 февраля 2010

Полностью согласен с оппозицией global.Везде, где вы можете избежать global, просто избегайте этого.Не думай, но избегай.А в PHP я не могу придумать ни одного сценария, в котором нельзя было бы избежать global.

0 голосов
/ 19 февраля 2010

Если вы хотите получить доступ к переменной, которая определена где-то еще, но вы хотите получить к ней доступ внутри и снаружи функции , добавьте к ней ключевое слово global:

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

        global $keyword = $_GET['keyword'];
        ...
    }
}
...