OO PHP Доступ к открытой переменной из другого класса
У меня есть класс вроде следующего:
class game {
public $db;
public $check;
public $lang;
public function __construct() {
$this->check = new check();
$this->lang = DEFAULT_LANG;
if (isset($_GET['lang']) && !$this->check->isEmpty($_GET['lang']))
$this->lang = $_GET['lang'];
}
}
Как вы можете видеть, у меня есть общедоступная переменная $lang
, которая также определяется с помощью конструктора.
Прогресс состоит в том, что я хочу получить доступ к результату этой переменной из других классов, которые не имеют прямого отношения к этому классу, так как я не хочу их повторно использовать для каждого другого класса.
Итак, например, как я могу вызвать результат этой переменной из другого класса, назовем ее class Check
?
Ответы
Ответ 1
если вы пометили public $lang;
как static:
public static $lang;
вы можете получить к нему доступ через game::$lang;
Если не статично, вам нужно сделать экземпляр игры и получить к нему доступ прямо:
$game = new game;
$game->lang;
статический вызов внутри (текущего) класса:
self::$lang;
поздняя статическая привязка (к унаследованной статической переменной):
static::$lang;
вызов из дочернего класса в родительский:
parent::$lang;
обычный вызов внутри экземпляра (например, когда вы используете new Obj();
):
$this->lang;
BTW:
переменные, определенные define('DEFAULT_LANG', 'en_EN');
, являются GLOBAL-областью, средние, могут иметь доступ везде!
<?php
define('TEST', 'xxx');
class game {
public function __construct() {
echo TEST;
}
}
//prints 'xxx'
new game;
Ответ 2
вы можете сделать его статической переменной, так что вы сможете называть его в любое время в любом месте, diff заключается в том, что вместо
$this->lang;
при редактировании (работает только внутри игры класса):
self::$lang;
и когда вы вызываете/редактируете его (работает повсюду) из другого класса, вы делаете:
game::$lang
идея статического класса заключается в том, что он существует только в одном экземпляре, поэтому в вашей программе существует только один $lang. но нет необходимости загружать весь класс, чтобы получить доступ к нему.
Ответ 3
Как я могу вызвать результат этой переменной из другого класса, можно вызвать класс Check?
У переменной нет результата. Если вы хотите получить состояние этой переменной в определенном объекте $obj
класса game
, то вы можете просто сделать:
$obj->lang
На стороне примечания, если $lang
открыто только для чтения, вы должны защитить его, указав его private
или protected
и вместо этого создайте метод getter.
Если вы имеете в виду, что хотите использовать одно и то же имя переменной в другом классе, я бы предложил вам рассмотреть наследование:
class Check extends game { /* now Check has $lang */ }
но переменная двух объектов будет отличаться.
Ответ 4
Поскольку свойство является общедоступным, вы можете получить доступ к нему извне класса в качестве $objInstance->property
. Не имеет значения, вызываете ли вы его из функции процедурный script в другом объекте. Пока у вас есть экземпляр, вы можете назвать его публичным. Пример:
function foo($c) {
echo $c->lang;
}
foo($check);
Кроме того, некоторые советы по работе с объектами и т.д.: он считает лучшим код, если вы не создаете экземпляры объектов в других объектах, а скорее передаете их каким-либо образом (либо метод сеттера, либо через конструктор). Это удерживает классы слабо связанными и приводит к коду, который является более многоразовым и более простым в тестировании. Итак:
class Game
{
...
public function __construct($check, $defaultLang, $get) {
$this->check = $check;
$this->lang = $defaultLang;
if (isset($get['lang']) && !$this->check->isEmpty($get['lang']))
$this->lang = $get['lang'];
}
...
$game = new Game(new Check(), DEFAULT_LANG, $_GET);
echo $game->check;
Первая половина эта статья является доступным объяснением того, что известно как Injection Dependency.