PHP - 类忘记设置变量

时间:2012-11-02 12:51:57

标签: php class scope global

我尝试创建某种安装类,例如页面的全局值。

PHP代码

class globals
{
    public $page;

    public function __construct()
    {
    }

    public function set_page($value)
    {
        $this->page = $value; // Maybe from a database
    }
}

class get
{
    public function page()
    {
        $globals = new globals();
        return $globals->page;
    }
}

$globals = new globals();
$globals->set_page('My value');

echo get::page(); // Short function to be in a template

问题

  • 我的班级忘了我设定的价值。那是为什么?
  • 我是否必须使用全局变量?
  • 这是解决问题的正确方法吗?

7 个答案:

答案 0 :(得分:3)

变量是在对象上设置的,而不是在类上。

对于每个类,您可以实例化多个对象。每个都有自己的变量范围。

答案 1 :(得分:2)

编辑:
我忘了为你的问题提供最简单,最简单的解决方案。 AFAIK,您正在寻找一种方法来检查您所在的页面。常数将做到这一点:

defined('MY_CURRENT_PAGE') || define('MY_CURRENT_PAGE','My Value');
//use anywhere like so:
echo 'Currently on page: '.MY_CURRENT_PAGE;

  

我的班级忘了我设定的价值。那是为什么?

非常简单:您的page成员函数不是静态的,但您可以将其称为get::page()。即使你要解决这个问题,你也可以在page方法中创建一个新实例,但是你也没有在任何地方保留引用,所以每个page调用都会创建一个新的globals 1}}实例,没有任何设置。

  

我是否必须使用全局变量?

不,除非你真的绝望,否则永远不要使用全局

  

这是解决问题的正确方法吗?

不,如果它不起作用,那就不正确了(恕我直言)。

那么,你可能会问。有几种方法可以解决这个问题:

class globals
{
    public static $page = null;//make this static, meaning all instances will share this var

    public function set_page($value)
    {
        self::$page = $value; // Maybe from a database
    }
}

class get
{
    private $_globalsInstance = null;
    public function __construct(globals $instance = null)
    {
        $this->_globalsInstance = $instance;
    }

    private function _getGlobals()
    {
        if (!$this->_globalsInstance instanceof globals)
        {
            $this->_globalsInstance = new globals();
        }
        return $this->_globalsInstance;
    }

    public function page()
    {
        return $this->_getGlobals()::$page;
    }
}

然而,就个人而言,我不会这样工作,我只是将我的实例传递到我需要的地方(作为函数/方法的参数,或者只是在可访问的范围内实例化它们:

class globals
{
    public $page = null;//make this static, meaning all instances will share this var

    public function set_page($value)
    {
        $this->page = $value; // Maybe from a database
    }
}
$page = new globals();
$page->set_page('foobar');
someFunction($page);
$someObject->renderPage($page);
require_once('specificScript.php');
//inside required script:
echo $page->page;

答案 2 :(得分:1)

  

我是否必须使用全局变量?

不是,如果你可以使用PHP 5.3

  

这是解决问题的正确方法吗?

最好为此使用泛型类,或使用对象的静态属性

<?php

class globals
{
    public static $page;

    public function __construct()
    {
    }

    public function set_page($value)
    {
        self::$page = $value; // Maybe from a database
    }
}

class get
{
    public static function page()
    {
        return globals::$page;
    }
}

$globals = new globals();
$globals->set_page('My value');

echo get::page(); // Short function to be in a template

P.S。 但这不是一个好方法

答案 3 :(得分:1)

$globals

class get
{
    public function page()
    {
        $globals = new globals();
        return $globals->page;
    }
}

然后

$globals = new globals();
$globals->set_page('My value');

globals类的不同部分。

其中一个解决方案是$page var static

public static $page;

我希望这会有所帮助

<强> UPD:

您也可以将Singleton应用于全局类并请求其insnance而不是直接创建新的:

globals::getInstance()->setPage('Page');

return globals::getInstance()->getPage();

在这种情况下,$page不一定是静态的。

答案 4 :(得分:1)

我不确定其他答案是否清楚。你创建了2个类。因此,它们具有不同的范围。在写入时,您无法从get类访问原始变量$ page,因为它超出了范围。您的页面函数实际上创建了一个没有$ page设置的对象$ globals的新版本。通常,您可以将set和get函数放在初始对象/类中。虽然可以通过从第二个类调用第一个类并设置页面来使用两个类。为什么你会这样做我不确定。

如果我在写这个课,那就像这样。

class globals
{
    public $page;

    public function __construct()
    {
    }

    public function set_page($value)
    {
        $this->page = $value; // Maybe from a database
    }

    public function get_page()
    {
        return $this->page;
    }
}

实际上我可能会将页面设置为私有而非公开。作为公众我猜你不需要get函数。

答案 5 :(得分:0)

要使用没有对象的类的方法,必须使用 static 定义。但无论如何,你为一个类对象设置了值,并试图从另一个对象中获取它......

答案 6 :(得分:0)

也许这可以帮助你继续粗略:

     class globals
     {
        public static $page;

        public function set_page($value)
        {
           self::$page = $value; // Maybe from a database
        }
     }

    class get extends globals
   {
      public function page()
     {
        $globals = new globals();
        return parent::$page;
     }
   }

   $globals = new globals();
   $globals->set_page('My value');

   echo get::page();

&GT;