如何在另一个类中访问全局变量

时间:2013-05-24 15:06:15

标签: php scope

我遇到一个问题,我有一个类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函数查看文件夹“boxes”中的所有PHP文件,并查找左列的文件(bm_products_filters.php显示在其中)。

现在这里是我完全错误的地方,但我不知道该怎么办。

在bm_products_filters.php中我只是想做:

echo $test_me;
但是我一无所获。我认为声明它global可能有用,但是没有用。我想我需要用->

来调用它

我真的不太了解范围。

希望我在这里提供足够的信息?如果它需要更多,请告诉我。

更新:

这是我试图做的,但它不起作用:

//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中回显函数它就可以了。为什么不能从其他功能中看到它?

3 个答案:

答案 0 :(得分:1)

您需要在要访问它的任何函数/方法中添加global $test_me;

通过将global $test_me;添加到构造函数并将该值设置为属性,您可以在实例化时为整个类提供对该值的访问权。

当您将变量设置为属性时,可以通过在变量前添加&来通过引用传递它。

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

我实际上并不是100%确定传递参考部分。我将测试确认,但它应该工作。 已确认确实有效。

我不建议使用像这样的全局变量,因为它通常不是好的做法。有许多更好的方法可以实现更易于维护的类似功能。

答案 1 :(得分:0)

您应该尝试将其作为session variableparameter链接传入。如果您使用session variableclear session value在您的final page

中提交了该交易

答案 2 :(得分: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代码,只需要包含变量。