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.