PHP将值赋给$this

基本上我想要实现的是使对象引用同一类的另一个对象 – 从方法内部.如果以下方法可行,那将是完美的:

$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;
    }

}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...