基本上我想要实现的是使对象引用同一类的另一个对象 – 从方法内部.如果以下方法可行,那将是完美的:
$this = new self;
但是人们无法在PHP中重新分配$this.
我当然知道,我可以从方法中返回另一个对象并使用它,所以请不要这样做.问题是:
如何使$this成为同一类的另一个对象的克隆?
或者更具体地说,
我希望一个对象恢复到之前保存的特定状态.
编辑:这可能有用的一些例子.
假设您有一个接受控制器,操作和更多内容的Url对象.您将使用相同的控制器和操作来获取大量链接,但其他属性会有所不同.我使用公共参数实例化对象,调用一个方法来保存它在输出链接后恢复的状态(在__toString方法之后的IOW).
$defaultPath = Url::factory('controller','action1')->extraParams('status',0)->save();
echo $defaultPath->action('action2'); // this has action2 as action and a status 0 as extra params
echo $defaultPath->extraParams('status',2); // this has action1 as action and 2 as status
另一个用途是我有一个CRUD表,我必须将每个列配置为传递给主表对象的对象.传递列后,我在列上启动了一个reset方法,所以我可以得到如下代码:
$column->field = 'layouts_id';
$column->value = $layoutId;
$dbInput->addColumn($column);
$column->field = 'pages_id';
$column->value = $pagesId;
$dbInput->addColumn($column);
解决方法:
我发现你想要的是一个很大的问题:
如果你找到了重新分配$this的方法,你怎么确定使用你的班级的任何人知道它的行为?虽然我承认,这样做很有意思
$column->field = 'layouts_id';
$column->value = $layoutId;
$dbInput->addColumn($column);
$column->field = 'pages_id';
$column->value = $pagesId;
$dbInput->addColumn($column);
如果我需要$column两次会发生什么?
$column->field = 'layouts_id';
$column->value = $layoutId;
$dbInput->addColumn($column);
// log my value
$logger->log($column); // oops, it's empty
...
你会破坏预期的行为,并且很难掌握你的代码.
但是要提出一些关于如何仍然实现上述行为的想法:
// clone when passing on
$column->field = 'value_id';
$column->value = $value;
$dbInput->addColumn(clone $column);
// manually (re-)create a new object based on an older
$column->field = 'value_id';
$column->value = $value;
$dbInput->addColumn(new Column($column));
否则reset()方法听起来也是可行的:
class Column() {
public function reset() {
$this->field = 'standard field id';
$this->value = 'standard field value';
}
public function __construct() {
$this->reset();
}
}
这样你可以像这样使用它:
// manually (re-)create a new object based on an older
$column->field = 'value_id';
$column->value = $value;
$dbInput->addColumn($column);
$column->reset();
要克服两次指定默认值(未经测试)的问题:
class Column() {
public $field = 'standard field id';
public $value = 'standard field value';
// keep a static object for resetting
private static $__blueprint = null;
public function reset() {
foreach (self :: $__blueprint as $k => $v)
$this->$k = $v;
}
public function __construct() {
if (!isset(self :: $__blueprint))
self :: $__blueprint = clone $this;
}
}