2

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

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

问题

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

7 回答 7

3

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

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

于 2012-11-02T12:53:37.430 回答
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没有设置的新实例。

我必须使用全局变量吗?

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

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

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

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

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;
于 2012-11-02T13:01:43.903 回答
1

$globals那里

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

那里

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

是不同的globals类。

解决方案之一是使$pagevar 静态

public static $page;

我希望这有帮助

升级版:

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

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

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

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

于 2012-11-02T13:01:19.273 回答
1

我不确定其他答案是否非常清楚。您已经创建了 2 个类。因此,它们具有不同的范围。正如所写的那样,您无法从 get 类访问原始变量 $page ,因为它超出了范围。您的 page 函数实际上创建了对象 $globals 的新版本,而没有设置 $page 。通常,您会将 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 函数。

于 2012-11-02T13:07:45.960 回答
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

PS但这不是一个好方法

于 2012-11-02T13:00:08.040 回答
0

要使用没有对象的类的方法,您必须使用静态定义。但无论如何,你为一个类对象赋值并尝试从另一个类对象中获取它......

于 2012-11-02T12:56:56.420 回答
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();

?>

于 2012-11-02T13:16:13.213 回答