[英]PHP: Set reference to a class as a constant…?
我有一组已定义的常数,对于某些人,我正在序列化一个类的新实例并将其设置为常数(我知道这可能不是最好的主意……),问题是当信息在实例中发生更改时该类,它不会更新在常量中声明的引用内存...我知道常量不能更改,但它不是仅指向内存块以及何时更改该内存信息,所以应该返回常数吗? 在将任何人与我所说的相混淆之前,我只告诉你我做了什么:
<?php
class Collection {
var $items = array();
public function __construct() { }
public function add($val) {
array_push($this->items, $val);
}
public function dump() {
var_dump($this->items);
}
}
$collection = new Collection();
define('COLLECTION', serialize(&$collection));
unserialize(COLLECTION)->add('test item 1');
unserialize(COLLECTION)->add('test item 2');
unserialize(COLLECTION)->dump();
/* It will end up dumping this:
array(0) { }
*/
?>
现在我这样做的原因是因为我将在许多函数中使用许多(30+)个不同的php文件中的这些常量,我知道这可以通过简单地使用变量和使用global $variable;
在每个函数中,但由于大多数服务器都关闭了全局设置,因此我试图避免这种情况。 请告诉我是否还有更好的方法来解决它。
- 谢谢!
纳德姆
更好的选择是实现Singleton模式或类似的方法,以避免序列化:
class Collection {
var $items = array();
public function __construct() { }
public function add($val) {
array_push($this->items, $val);
}
public function dump() {
var_dump($this->items);
}
public function push($v) {
$this->items[]= $v;
}
static protected $_instance = null;
static public function get() {
if (empty(self::$_instance)) self::$_instance= new Collection();
return self::$_instance;
}
}
Collection::get()->push('test item 1');
Collection::get()->push('test item 2');
Collection::get()->dump();
为什么不仅仅定义一个函数呢?
function push_item($item) {
global $collection;
$collection->push($item);
}
这比定义序列化类的常量要干净得多(抱歉,这几乎是WTF领域)。
您的常数存储一个字符串。 当您反序列化它时,常量的值不会改变,无论您对从其创建的类执行什么操作(线索的名称确实是……)。 在对您的问题的评论中采纳Brad的建议,并使用注册表。
...由于大多数服务器都关闭了全局设置。
这个问题有几个混淆点,这就是其中之一。 大多数服务器都关闭了register_globals
选项。 这不会阻止您在应用程序中使用全局变量。 该选项所做的全部就是从脚本的开头将$_GET
和$_POST
(以及更多)中的值作为全局变量导入。
******解决了****
通过创建一个简单的混合列表来解决此问题,该列表包含一个静态的已收集定义数组。 感谢所有答复,您的建议帮助我将其归纳为:
class MixedList {
protected static $list = array();
public static function set($key, $val) {
self::$list[$key] = &$val;
if (!defined($key)) eval("define('{$key}', '{$key}');");
}
public static function &get($key) {
return self::$list[$key];
}
}
// Usage:
MixedList::set('COLLECTION', new Collection());
MixedList::get(COLLECTION)->add('test item 1');
MixedList::get(COLLECTION)->add('test item 2');
MixedList::get(COLLECTION)->dump();
// You could also do wrap the arguments as a string, would do the same trick
- 谢谢!
纳德姆
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.