web-dev-qa-db-fra.com

OO PHP Accéder à une variable publique d'une autre classe

J'ai un cours comme celui-ci:

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'];
    }

}

Comme vous pouvez le constater, j'ai une variable publique $lang qui est également définie via le constructeur.

Le problème, c'est que je souhaite accéder au résultat de cette variable à partir d'autres classes qui ne sont pas directement liées à cette classe, car je ne souhaite pas le redéclarer pour chaque classe différente.

Ainsi, par exemple, comment puis-je appeler le résultat de cette variable depuis une autre classe, appelons-le class Check?

13
user2426701

si vous marquez le public $lang; comme statique:

public static $lang;

vous pouvez y accéder via game::$lang;

sinon statique, vous devez créer une instance de jeu et y accéder directement:

$game = new game;
$game->lang;

appel statique à l'intérieur de la classe (actuelle):

self::$lang;

lié tardivement call (à la variable statique héritée):

static::$lang;

appel de la classe enfant au parent:

parent::$lang;

appel normal à l'intérieur d'une instance (c'est lorsque vous utilisez new Obj();):

$this->lang;

BTW: Les variables définies par define('DEFAULT_LANG', 'en_EN'); ont une portée GLOBALE, ce qui signifie qu’elles peuvent accéder partout!

<?php
define('TEST', 'xxx');

class game {
    public function __construct() {
        echo TEST;
    }
}

//prints 'xxx'
new game;
30
DanFromGermany

vous pouvez en faire une variable statique, de sorte que vous pourrez l'appeler n'importe quand, n'importe où, le diff est qu'au lieu de 

$this->lang;

lorsque vous le modifiez (fonctionne uniquement dans le jeu de classe):

self::$lang;

et lorsque vous appelez/modifiez-le (Fonctionne partout) depuis une autre classe, vous le faites:

game::$lang

l'idée d'une classe statique est qu'elle n'existe que dans un cas, il ne reste donc qu'un seul $ lang dans votre programme. mais il n’est pas nécessaire de charger toute la classe pour l’acquérir.

5
roy

Comment puis-je appeler le résultat de cette variable depuis une autre classe, appelons-la classe Check?

Une variable n'a pas de résultat . Si vous voulez récupérer l'état de cette variable sur un objet spécifique $obj de la classe game, vous pouvez simplement faire:

$obj->lang

Sur une note complémentaire, si $lang est publiquement seulement en lecture seule, vous devez le protéger en le définissant private ou protected et créer une méthode getter à la place.

Si vous voulez dire que vous voulez utiliser le même nom de variable dans une autre classe, je vous suggérerais de considérer héritage :

class Check extends game { /* now Check has $lang */ }

mais la variable des deux objets sera différente.

1
Shoe

Comme la propriété est publique, vous pouvez y accéder de l'extérieur de la classe en tant que $objInstance->property. Peu importe si vous l'appelez depuis une fonction, un script de procédure, dans un autre objet. Tant que vous avez l'instance, vous pouvez appeler sa propriété publique. Ex:

function foo($c) {
    echo $c->lang;
}
foo($check);

Quelques conseils pour travailler avec des objets, par exemple: Il est considéré comme un meilleur code si vous ne créez pas d’occurrences d’objets dans les autres objets, mais que vous les transmettez plutôt (méthode de définition ou via le constructeur). Cela maintient les classes faiblement couplées et donne un code plus réutilisable et plus facile à tester. Alors:

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;

La première moitié de cet article est une explication accessible de ce que l’on appelle l’injection de dépendance.

0
Timothy