Comment accéder à un membre privé à l'intérieur d'une fonction statique en PHP
Question
J'ai la classe suivante dans PHP
class MyClass
{
// How to declare MyMember here? It needs to be private
public static function MyFunction()
{
// How to access MyMember here?
}
}
Je suis tout à fait confus au sujet dont la syntaxe à utiliser
$MyMember = 0;
et echo $MyMember
ou
private $MyMember = 0;
et echo $MyMember
ou
$this->MyMember = 0;
et echo $this->MyMember
Quelqu'un peut-il me dire comment faire?
Je suis un peu pas fort dans OOPS.
Pouvez-vous faire en premier lieu?
Dans le cas contraire, comment dois-je le déclarer pour que je puisse accéder à l'intérieur des fonctions statiques?
La solution
class MyClass
{
private static $MyMember = 99;
public static function MyFunction()
{
echo self::$MyMember;
}
}
MyClass::MyFunction();
voir Visibilité et Opérateur de contexte (:. :) dans le chapitre oop5 du manuel php
Autres conseils
Ceci est une réponse super tard, mais il peut aider quelqu'un ..
class MyClass
{
private $MyMember;
public static function MyFunction($class)
{
$class->MyMember = 0;
}
}
Cela fonctionne. Vous pouvez accéder au député de cette façon, mais si vous aviez $ la classe, vous devez simplement faire MyFunction une méthode de la classe, comme vous suffit d'appeler $ class-> MyFunction (). Cependant, vous pourriez avoir un tableau statique que chaque instance est ajouté dans le constructeur de la classe qui cette fonction statique peut accéder et itérer, la mise à jour toutes les instances. à-dire ..
class MyClass
{
private $MyMember;
private static $MyClasses;
public function __construct()
{
MyClass::$MyClasses[] = $this;
}
public static function MyFunction()
{
foreach(MyClass::$MyClasses as $class)
{
$class->MyMember = 0;
}
}
}
Dans les méthodes statiques, vous ne pouvez pas appeler variable à l'aide $this
parce que les méthodes statiques sont appelés en dehors d'un « contexte d'instance ».
Il est clairement indiqué dans le PHP doc .
<?php
class MyClass
{
// A)
// private $MyMember = 0;
// B)
private static $MyMember = 0;
public static function MyFunction()
{
// using A) // Fatal error: Access to undeclared static property:
// MyClass::$MyMember
// echo MyClass::$MyMember;
// using A) // Fatal error: Using $this when not in object context
// echo $this->MyMember;
// using A) or B)
// echo $MyMember; // local scope
// correct, B)
echo MyClass::$MyMember;
}
}
$m = new MyClass;
echo $m->MyFunction();
// or better ...
MyClass::MyFunction();
?>
statique ou non statique?
Avez-vous déjà posé cette question?
Vous ne pouvez pas accéder à des paramètres non statiques / méthodes de l'intérieur méthode statique (du moins pas sans utiliser l'injection de dépendance)
Vous pouvez accéder cependant méthodes et propriétés statiques à partir avec la méthode non statique (avec
self::
)
Propriétés
Est-ce que la valeur de la propriété particulière est à attribuer modèle de classe ou plutôt elle instance (objet créé à partir d'une classe)? Si la valeur est serré à l'instance de classe (objet de classe) vous pouvez le déclarer comme propriétés statiques .
private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance
Méthodes
Au moment de décider de vous faire une méthode statique ou non statique besoin de poser une simple question. Est-ce que cette méthode doit utiliser $this
? Si elle le fait, puis il ne devrait pas être déclarée comme statique .
Et juste parce que vous n'avez pas besoin $ ce mot-clé ne fonctionne pas dire automatiquement que vous devriez faire quelque chose de statique (bien que la contraire est vrai. si vous avez besoin $ cela, le rendre non-statique)
Vous appelez cette méthode sur un objet individuel ou de la classe en général? Si vous n'êtes pas sûr que l'on à utiliser, car les deux sont appropriés pour le cas d'utilisation particulière, puis utilisez toujours non statique. Il vous donnera plus de flexibilité à l'avenir.
Une bonne pratique est de toujours commencer à concevoir votre classe comme non-statique et la force statique si cas particulier nous devenir très clair.
Vous pouvez essayer de déclarer vos paramètres comme statique ... juste afin que vous puissiez y accéder à partir méthode statique mais qui est généralement pas ce que vous voulez faire.
Donc, si vous avez vraiment besoin d'accéder $this
de méthode statique, cela signifie que vous avez besoin de repenser / remodeler l'architecture de votre classe parce que vous avez don mal.