gpt4 book ai didi

PHP 为 $this 赋值

转载 作者:可可西里 更新时间:2023-11-01 00:11:27 24 4
gpt4 key购买 nike

基本上,我要实现的目标是使对象从方法内部引用同一类的另一个对象。如果以下方法可行,那就太完美了:

$this = new self;

但是不能在 php 中重新分配 $this

我当然知道,我可以从方法返回另一个对象并使用它,所以请不要建议。问题是:

如何使 $this 成为同一类的另一个对象的克隆?

或者更具体地说,

我想要一个对象恢复到之前保存的特定状态。


编辑:一些可能有用的示例。

假设您有一个 Url 对象,它接受 Controller 、操作和更多东西。您将使用相同的 Controller 和操作获取大量链接,但其他属性会有所不同。我使用公共(public)参数实例化对象,为它调用一个方法来保存它在输出链接后恢复到的状态(在 __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 表,我必须将每一列配置为传递给主表对象的对象。通过该列后,我在该列上启动了一个重置​​方法,因此我可以使用如下代码:

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

}

关于PHP 为 $this 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4035355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com