PHP не может использовать переменные, определенные вне функций - PullRequest
0 голосов
/ 04 марта 2012

Я работаю над проектом (простой XML CMS) просто для изучения базового PHP.

Сначала я включаю файл config.php, который содержит информацию о CMS, а затем я включаю route.php для маршрутизации URL, а после этого я включаю файл functions.php, который очень похож на файл WordPress ( содержит все функции, например, для загрузки сообщений, тегов, категорий и т. д.).

Структура выглядит так:

<?php
    function latestProducts($amount = 6){
    }

    function products($search = FALSE, $query= '', $page = 1, $results = 5){
    }

    function getProductById($id){
    }

    function getProductTitleById($id){
    }

    function getProductByExcerpt($excerpt){
    }

    function getProductTitleByExcerpt($excerpt){
    }

    function getPost($id, $title, $description, $category, $excerpt = FALSE){
    }

    function getTitle(){
    }

    function breadcrumb($params, $first){
    }

    function pagination($page, $pages){
    }
?>

В файле config.php я также использую этот код:

$xml = simplexml_load_file("products.xml") or die("The product XML file couldn't be loaded.");

Но когда я пытаюсь получить доступ к $ xml из функций, которые я подготовил в functions.php, я получаю уведомление о неопределенной переменной. (Я также попытался поместить переменную $ xml в functions.php до определения функций, но я получил тот же результат.)

В чем моя ошибка? Я знаю, это просто; Я просто сейчас плохо вижу.

Ответы [ 3 ]

5 голосов
/ 04 марта 2012

У вас есть проблема с областью видимости.Переменные, объявленные в глобальной области видимости, не видны внутри ваших функций. В руководстве объясняется, что вы можете с этим сделать.Обзор:

  • Импортируйте переменную из глобальной области в локальную область вашей функции с помощью global $xml; в начале функции
  • Сохраните переменную как ключглобальные переменные superglobal, т.е. $GLOBALS['xml']
  • Сделать переменную статическим членом класса или создать одноэлементную конструкцию
  • Передать переменную в качестве аргумента каждой функции, которая в ней нуждается

Обратите внимание, что при использовании хорошей архитектуры в стиле ООП таких проблем часто можно избежать, например, $xml будет свойством экземпляров классов, которым необходим прямой доступ к объекту DOM.

3 голосов
/ 04 марта 2012

Функции или методы не имеют границ вне их.Для того, чтобы использовать переменную, объявленную снаружи.Использование ключевого слова global, чтобы указать серверу использовать переменную, определенную в более высоком контексте.

$varname = "value";
function yourfunctionname() {
    //In order to use the variable declare you want to use the globally declared 
    global $varname;
    //now $varname will have "value` as its value

   //continue with your logic
}
2 голосов
/ 04 марта 2012

$xml - глобальная переменная, вам нужно использовать ключевое слово global.

function products($search = FALSE, $query= '', $page = 1, $results = 5){
    global $xml;
    //...
}
...