Intereting Posts
Symfony NelmioApiDocBundle swagger-ui PHP Аннотации объекта json с массивом свойств объектов, не показывающих Как я могу написать в PHP функцию, которая модифицирует массив? Найти массив ключей в массиве объектов с учетом значения атрибута Заполнение базы данных в файле миграции Laravel Функция PHP для циклических рабочих дней между двумя опубликованными датами динамически масштабировать изображения в php jpg / png / gif Восклицательный знак случайным образом в результате PHP-HTML-Email PHP: как вызвать функцию дочернего класса из родительского класса Несколько запросов / результатов (PDO / MySQL) PHPUnit: ожидание вызова метода с массивом в качестве аргумента разница между двумя массивами PHP: Как передать дочерние классы __construct () аргументам parent :: __ construct ()? Зачем проверять и isset () и! Empty () Codeigniter: проверьте и заставьте одну страницу https: // Как добавить атрибут к первому тегу P с использованием регулярного выражения PHP?

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 которая также определяется через 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; 

Первая половина этой статьи является доступным объяснением того, что известно как инъекция зависимостей.