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
?
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;
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.
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.
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.