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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top