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;