我尝试创建某种安装类,例如页面的全局值。
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
问题
答案 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;