2013-05-24 2 views
1

У меня возникла проблема, когда у меня есть класс bm_products_filter, который я не могу получить, чтобы увидеть переменную из моего файла index.php.Как получить доступ к глобальной переменной в другом классе

У меня есть 2 файла: index.php и bm_products_filters.php

У меня есть запрос в index.php, который я хочу повторить в bm_products_filters.php

(есть некоторые функции базы данных здесь (они работают, как я правильно может повторить переменную в index.php)

$product_count .= "SELECT COUNT(p.products_id) as total 
       from 
        " . TABLE_PRODUCTS . " p 
       left join " . TABLE_SPECIALS . " s 
        on p.products_id = s.products_id 
       left join " . TABLE_MANUFACTURERS . " m 
        on p.manufacturers_id = m.manufacturers_id 
       join " . TABLE_PRODUCTS_DESCRIPTION . " pd 
        on p.products_id = pd.products_id 
       join " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c 
        on p.products_id = p2c.products_id     
       where 
        p.products_status = '1' 
        and pd.language_id = '" . (int) $languages_id . "' 
        and p2c.categories_id = '" . (int)$current_category_id . "'"; 

    $product_count_query = tep_db_query($product_count); 
    $product_count_tally = tep_db_fetch_array($product_count_query); 
    global $test_me; 
    $test_me = $product_count_tally['total']; 
?> 

переменная Я пытаюсь эхо $test_me.

Класс bm_products_filter называется (косвенно я предполагаю), из index.php, как это:

<?php echo $oscTemplate->getBlocks('boxes_column_left'); ?> 

getBlocks функция просматривает все PHP файлы в папке «коробки» и находит те, которые в левой колонке (который показывает bm_products_filters.php).

Теперь вот где я совершенно не прав, но я не знаю, как это сделать.

В bm_products_filters.php Я просто пытаюсь сделать:

echo $test_me; 

, но я не подвожу ничего. Я думал, что объявление global может работать, но это не сработало. Я думаю, мне нужно как-то назвать это ->

Я действительно не очень хорошо разбираюсь в области.

Надеюсь, я дал здесь достаточно информации? Дайте мне знать, если вам нужно больше.

UPDATE:

это то, что я пытался сделать, но это не работает:

//index.php 
    $product_count .= "SELECT COUNT(p.products_id) as total 
       from 
        " . TABLE_PRODUCTS . " p 
       left join " . TABLE_SPECIALS . " s 
        on p.products_id = s.products_id 
       left join " . TABLE_MANUFACTURERS . " m 
        on p.manufacturers_id = m.manufacturers_id 
       join " . TABLE_PRODUCTS_DESCRIPTION . " pd 
        on p.products_id = pd.products_id 
       join " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c 
        on p.products_id = p2c.products_id     
       where 
        p.products_status = '1' 
        and pd.language_id = '" . (int) $languages_id . "' 
        and p2c.categories_id = '" . (int)$current_category_id . "'"; 

     $product_count_query = tep_db_query($product_count); 
     $product_count_tally = tep_db_fetch_array($product_count_query); 

     $test_me = $product_count_tally['total']; 

    function product_filter_count() { 
     global $test_me; 
     return $test_me; 
    } 


//bm_products_filter.php 

    echo product_filter_count(); 

Я получаю вызов неопределенной ошибки функции. если я повторяю функцию в index.php, она работает. Почему это не видно из другой функции?

+0

Вы включаете index.php в bm_products_filter.php? вот что мне кажется. если вы поместите require_once index.php в начало вашего другого файла, он должен работать. –

ответ

1

Вам необходимо добавить global $test_me; в любую функцию/метод, к которым вы хотите иметь доступ.

Вы можете предоставить полный доступ к классу во время создания экземпляра, добавив global $test_me; к конструктору и установив это значение в свойство.

Вы можете передать его по ссылке, добавив & перед переменной, когда вы установите ее для свойства.

class testclass { 
    public gTestMe; 
    public function __construct() { 
     global $test_me; 
     $this->gTestMe = &$test_me; 
    } 
} 

Я на самом деле не уверен на 100% на странице с пересылкой. Я проверю, чтобы подтвердить, но он должен работать. Подтвержден Это действительно работает.

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

+0

+1 для знака &. подумал, что немного назад сам, пытаясь использовать переменные сеанса внутри функций –

0

вы должны попытаться передать его в качестве session variable или в ссылке, как parameter .if вы используете в качестве session variable только clearsession value когда вы совершили сделку в вашем final page.

0

в большом количестве языков, если вы объявляете переменную вне функции/метода, они автоматически глобальный масштаб, что позволяет им получить доступ к любым из способов, в пределах того же класса (Java, например)

PHP не предоставляет такую ​​глобальную область, поэтому у вас есть несколько вариантов.

вы можете использовать глобальное ключевое слово»

<?php 
    $test_me = "hello"; 
    function test() 
    { 
     global $test_me; 
    } 

    test(); 
?> 

или вы можете передать его в качестве параметра для функции

<?php 
    $test_me = "hello"; 
    function test($global_var) 
    { 
     $local_var = $global_var; 
    } 

    test($test_me) 
?> 

, если у вас есть переменные, которые вы хотите использовать в нескольких классов/файлов, я бы поместил их в отдельный файл и использовал оператор include или require, а затем в файлы, которые им нужны. Таким образом, вам не нужно включать кучу php-кода, который вам не нужен в новом файле, просто переменные.

+0

Спасибо за ответ. Я пытался реализовать это, но у меня проблемы. Посмотрите мои правки выше, если у вас есть шанс. Спасибо за вашу помощь. – Sackling

Смежные вопросы