问题:我想在类中永久设置私有变量,然后从类外部使用getter函数访问它们。 问题是每次我实例化一个新的类并创建一个对象时,它都会破坏以前设置的变量。 在提供的示例中,我不想通过调用函数"getAgain"传递对象。 我想简单地访问 globalVars 类而不破坏任何设置变量。 我知道,通过创建一个"新对象"本质上会破坏当前而不是静态变量。 所以:
- 如何在类中永久设置私有变量?
- 或
- 如何在不重新实例化类的情况下调用函数(getter/setter)(以免破坏当前设置的变量)。
担心我没有以正确的方式处理这个问题,或者我的方法有缺陷。
<?php
class globalVars{
private $final = "Default Foo </br>";
public function setter($param){
$this->final = $param;
}
public function getter(){
return $this->final;
}
}
class driver{
function __construct($param){
$globalVars = new globalVars();
$globalVars->setter($param);
$val = $globalVars->getter();
echo $val;
$this->getAgain();
}
function getAgain(){
$globalVars = new globalVars();
$val = $globalVars->getter();
echo $val;
}
}
$input = "Change to Bar </br>";
$driver = new driver($input);
?>
首先,当您重新实例化类时,您设置的变量不会被破坏。这就是所谓的封装,这意味着类的每个实例都有自己的一组属性,这对 OOP 至关重要。这更像是在每个实例化时从基类定义中复制值,这意味着您可以获得默认值。如果您希望变量在类的所有实例中可用,这就是静态变量的用途。
<?php
class globalVars{
private static $final = "Default Foo </br>";
private $instance = "Some default value";
public function setStatic($param){
self::$final = $param;
}
public function setInstance($param){
$this->instance = $param;
}
public function getStatic(){
return self::$final;
}
public function getInstance(){
return $this->instance;
}
}
$test = new globalVars();
$test->setStatic("Foo");
$test->setInstance("Bar");
$test2 = new globalVars();
$final = $test2->getStatic();
$instance = $test2->getInstance();
echo $final;
//outputs "Foo"
echo $instance;
//outputs the default value for the instance property because in this
//instance the value was never changed.
echo $test->getInstance();
//outputs "Bar" because the instance property was changed in this instance.
编辑:我稍微更改了类以显示静态属性和实例属性之间的区别。
您可以简单地为此使用static
变量。
或者,如果你想全局访问一个类,你可以使用 singleton pattern
,为此添加一个静态变量,例如 $_obj
和一个静态 getter。现在,每次您需要该类时,只需调用globalVars::getObj()
即可。
<?php
class globalVars{
private static $_obj;
public static getObj()
{
if(!isset(self::$_obj)) self::$_obj = new globalVars();
return self::$_obj;
}
private $final = "Default Foo </br>";
public function setter($param){
$this->final = $param;
}
public function getter(){
return $this->final;
}
}
class driver{
function __construct($param){
$globalVars = globalVars::getObj();
$globalVars->setter($param);
$val = $globalVars->getter();
echo $val;
$this->getAgain();
}
function getAgain(){
$globalVars = globalVars::getObj();
$val = $globalVars->getter();
echo $val;
}
}
$input = "Change to Bar </br>";
$driver = new driver($input);