У меня есть класс вроде следующего:
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
которая также определяется через contructor.
Пробег заключается в том, что я хочу получить доступ к результатам этой переменной из других классов, которые напрямую не связаны с этим классом, так как я не хочу обновлять их для каждого другого класса.
Так, например, как я могу вызвать результат этой переменной из другого класса, можно назвать class Check
?
если вы отметите public $lang;
как статические:
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');
ГЛОБАЛЬНАЯ область, средняя, может получить доступ везде!
<?php define('TEST', 'xxx'); class game { public function __construct() { echo TEST; } } //prints 'xxx' new game;
вы можете сделать это статической переменной, так что вы сможете называть ее в любое время в любом месте, diff заключается в том, что вместо
$this->lang;
при редактировании (работает только внутри игры класса) вы делаете:
self::$lang;
и когда вы вызываете / редактируете его (работает повсюду) из другого класса, вы делаете:
game::$lang
идея статического класса заключается в том, что он существует только в одном экземпляре, поэтому в вашей программе существует только один $ lang. но нет необходимости загружать весь класс, чтобы получить доступ к нему.
Как я могу вызвать результат этой переменной из другого класса, можно назвать класс Check?
У переменной нет результата . Если вы хотите получить состояние этой переменной на определенном объекте $obj
в game
класса, вы можете просто сделать:
$obj->lang
На стороне примечание, если $lang
открыто только для чтения, вы должны защитить его, указав его как private
и protected
и вместо этого создайте метод getter .
Если вы имеете в виду, что хотите использовать одно и то же имя переменной в другом классе, я бы предложил вам рассмотреть наследование :
class Check extends game { /* now Check has $lang */ }
но переменная двух объектов будет отличаться.
Поскольку свойство является общедоступным, вы можете получить доступ к нему извне класса в качестве $objInstance->property
. Неважно, если вы вызываете его из функции, процедурного скрипта, в другой объект. Пока у вас есть экземпляр, вы можете назвать его общедоступной. Пример:
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;
Первая половина этой статьи является доступным объяснением того, что известно как инъекция зависимостей.