Проблема: я хотел бы либо навсегда установить частные переменные в классе, а затем получить к ним доступ с помощью функции-получателя извне класса. Проблема в том, что каждый раз, когда я создаю новый класс и создаю объект, он уничтожает ранее установленные переменные. В приведенном примере я не хочу передавать объект через вызывающую функцию «getAgain». Я хотел бы просто получить доступ к классу globalVars, не разрушая ни одну из установленных переменных. Я понимаю, что создание «нового объекта» по сути уничтожает текущие нестатические переменные. ТАК:
Боюсь, я не подхожу к этому правильно, или, возможно, моя методология ошибочна.
<?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);
?>
Во-первых, переменные, которые вы устанавливаете, не уничтожаются при повторном создании класса. Это то, что называется инкапсуляцией, что означает, что каждый экземпляр класса имеет свой собственный набор свойств, который имеет решающее значение для ООП. Это больше похоже на то, что значения копируются из определения базового класса в каждом экземпляре, что означает, что вы получаете значения по умолчанию. Если вы хотите, чтобы переменная была доступна во всех экземплярах класса, для этого предназначена статическая переменная.
<?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
и статический геттер. Теперь каждый раз, когда вам нужен этот класс, просто позвоните 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);