问题:我想在类中永久设置私有变量,然后使用类外部的getter函数访问它们。问题是每次我实例化一个新的类并创建一个对象时它会破坏以前设置的变量。在提供的示例中,我不想通过调用函数" getAgain"传递对象。我想简单地访问globalVars类而不破坏任何设置变量。我理解通过创建一个新对象'本质上是破坏当前不是静态的变量。 SO:
我担心我不会以正确的方式接近这一点,或者我的方法可能存在缺陷。
<?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);
?>
答案 0 :(得分:6)
首先,在重新实例化类时,您设置的变量不会被破坏。这就是封装,意味着类的每个实例都有自己的一组属性,这对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.
编辑:我稍微更改了一下类,以显示静态和实例属性之间的区别。
答案 1 :(得分:2)
您可以简单地使用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);