代码之家  ›  专栏  ›  技术社区  ›  raveren

PHP为$this赋值

  •  3
  • raveren  · 技术社区  · 14 年前

    基本上,我试图实现的是使对象引用同一类的另一个对象-从方法内部。如果以下方法能奏效,那就太完美了:

    $this = new self;
    

    但不能重新分配 $this

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

    我该怎么做 $这个 复制同一类的另一个对象?

    或者更具体地说,

    我希望对象还原到以前保存的特定状态。


    :一些可能有用的示例。

    假设您有一个Url对象,它接受控制器、操作和许多其他东西。您将让它获取许多具有相同链接的链接,例如控制器和操作,但其他属性将有所不同。我用公共参数实例化这个对象,为它调用一个方法来保存它在输出一个链接后恢复到的状态(IOW after\u toString method)。

    $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
    

        $column->field = 'layouts_id';
        $column->value = $layoutId;
        $dbInput->addColumn($column);
    
        $column->field = 'pages_id';
        $column->value = $pagesId;
        $dbInput->addColumn($column);
    

    在这两种情况下,我都节省了很多代码和混乱,你不觉得吗?

    5 回复  |  直到 14 年前
        1
  •  3
  •   Dan Soap    14 年前

    我看到你的意图有一个很大的问题:

    如果你找到了重新分配的方法 $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;
        }
    
    }
    
        2
  •  2
  •   Alan Geleynse buhbang    14 年前

    $this 在PHP中。它将始终包含当前对象,并且不能更改。

    听起来你在试图将对当前类的所有引用更改为指向其他类。没有办法做到这一点。

    $copy 类中的成员变量。你可以检查一下 $副本 不为空,而是将所有方法传递给该对象。但是,这仍然会将原始对象留在内存中。

        3
  •  2
  •   Spudley Pat    14 年前

    如果你假设的例子 $this = new self; 如果成功了,可能是为了有效地将对象重置为干净状态。

    你不能按你所要求的方式做到这一点,但是你可以通过写一个 reset() 方法,该方法将所有属性设置为其初始状态,然后调用 __constructor() 方法。

        4
  •  1
  •   Darin Dimitrov    14 年前

    你的要求在OOP中没有意义。这个 this 变量(或您选择的OOP语言中的任何等价变量)应始终指向当前实例,并且不应更改。这就是它的设计初衷。

        5
  •  1
  •   ircmaxell    14 年前

    Flyweight Design Pattern . 你不需要重新映射 $this ,但是创建对象的方式可以重用,而无需不断构造和破坏它们。。。

    把它和 Object Pool