Php 通过方法重置类实例变量

Php 通过方法重置类实例变量,php,Php,有人知道如何通过类方法重置实例变量吗。大概是这样的: class someClass { var $var1 = ''; var $var2 = TRUE; function someMethod() { [...] // this method will alter the class variables } function reset() { // is it possible

有人知道如何通过类方法重置实例变量吗。大概是这样的:

class someClass 
{
    var $var1 = '';
    var $var2 = TRUE;

    function someMethod() 
    { 
        [...]
        // this method will alter the class variables
    }

    function reset()
    {
        // is it possible to reset all class variables from here?
    }
}

$test = new someClass();
$test->someMethod();
echo $test->var1;

$test->reset();
$test->someMethod();
我知道我可以简单地执行$test2=newsomeclass(),但我特别想寻找一种通过方法重置实例(及其变量)的方法


这可能吗?

当然,方法本身可以为属性指定显式值

public function reset()
{
  $this->someString  = "original";
  $this->someInteger = 0;
}
$this->SetInitialState()来自构造函数 正如另一个想法,您可以有一个方法来设置默认值本身,并从构造函数中调用。你以后也可以随时调用它

<?php

  class MyClass {
    private $var;
    function __construct()     { $this->setInitialState(); }
    function setInitialState() { $this->var = "Hello World"; }
    function changeVar($val)   { $this->var = $val; }
    function showVar()         { print $this->var; }
  }

  $myObj = new MyClass();
  $myObj->showVar(); // Show default value
  $myObj->changeVar("New Value"); // Changes value
  $myObj->showVar(); // Shows new value
  $myObj->setInitialState(); // Restores default value
  $myObj->showVar(); // Shows restored value

?>

是的,您可以编写reset()如下:


您需要小心,因为调用new someClass()会得到与原始类完全无关的类的全新实例。

这很容易做到

public function reset()
{
    unset($this);
}

您可以使用反射来实现这一点,例如使用
get\u class\u vars

foreach (get_class_vars(get_class($this)) as $name => $default) 
  $this -> $name = $default;

这并不完全可靠,它会破坏非公共变量(get_class_vars不读取),并且不会触及基类变量。

欢迎使用StackOverflow!第一个问题很好。这就是我现在正在做的。但是由于类中有很多属性,我认为可能有一个更简单的解决方案…Frank,从构造函数调用
reset()
来设置初始状态怎么样?不会有什么区别吧?当然会。
\uu construct()
方法将调用
$this->setInitialState()
,将对象属性设置为默认状态。你可以用
$this->someMethod()
修改它们,用
$this->setInitialState()
还原它们。弗兰克,你必须把它们都写在某个地方。我的建议是将该任务移动到
setInitialState()
方法中,而不是直接在类中。请参见上文。这就是我现在正在做的。但由于有20多个属性,这样做似乎是多余的。我想可能有一个php函数或者其他一些技巧可以实现这一点……我试过了,但它没有重置对象的任何属性。然后你应该尝试unset(get_class_methods($this));实际上,php会重置所有对象属性。如果不再需要该对象,请尝试_destruct(),将所有清理内容放在那里,因为我想将它们重置为初始状态unset将不起作用(除非初始状态将由某个方法通过构造函数调用),这正是我所寻找的。谢谢你能解释一下“不接触基类变量”是什么意思吗?Victor Nicolet是指父类中定义的变量。您可以将类声明为
类B扩展了{}
A
将是基类或父类。好的。这意味着$test=newa()$测试->重置();将起作用,而$test=new B()$测试->重置();不会的。对,对。如果您担心发生这种情况,可以将
get\u class($this)
替换为常量
'a'
。实际上,这不适用于我的代码。但是很高兴知道!:)
foreach (get_class_vars(get_class($this)) as $name => $default) 
  $this -> $name = $default;