web-dev-qa-db-fra.com

Méthodes statiques dans PHP

Pourquoi dans PHP vous pouvez accéder à une méthode statique via l’instance d’une classe mais pas uniquement via le nom du type?

UPDATE: Je suis développeur .net mais je travaille également avec des développeurs PHP. Récemment, j'ai trouvé ce moment à propos de méthodes statiques appelées à partir d'instance et je ne comprends pas pourquoi cela peut être utile.

EXEMPLE:

class Foo
{
    public static Bar()
    {
    }
}

Nous pouvons accepter une méthode comme celle-ci: 

var $foo = new Foo();
$foo.Bar(); // ??????
20
donRumatta
Class Do {
  static public function test() {
      return 0;
  }
}

utiliser comme ceci: 

echo Do::test();
12
Said Afkir

Pourquoi dans PHP vous pouvez accéder à une méthode statique via l’instance d’une classe mais pas uniquement via le nom du type?

Contrairement à ce à quoi vous êtes probablement habitué avec .NET, PHP a des types dynamiques. Considérer:

class Foo
{
  static public function staticMethod() { }
}

class Bar
{
  static public function staticMethod() { }
}

function doSomething($obj)
{
  // What type is $obj? We don't care.
  $obj->staticMethod();
}

doSomething(new Foo());
doSomething(new Bar());

Ainsi, en permettant l'accès aux méthodes statiques via l'instance d'objet, vous pouvez appeler plus facilement une fonction statique du même nom pour différents types.

Maintenant, je ne sais pas s'il y a une bonne raison pour laquelle l'accès à la méthode statique via -> est autorisé. PHP (5.3?) Supporte également:

$obj::staticMethod();

ce qui est peut-être moins déroutant. Lorsque vous utilisez ::, il doit s'agir d'une fonction statique pour éviter les avertissements (contrairement à -> qui permet l'une ou l'autre).

5
Matthew

Dans PHP 7, il vous semble absolument nécessaire de pouvoir exécuter $this->staticFunction(). Parce que, si ce code est écrit dans une classe abstraite et que staticFunction() est également abstrait dans votre classe abstraite, $this-> et self:: donnent des résultats différents!

Lorsque vous exécutez $this->staticFunction() à partir d'un enfant (non abstrait) de la classe abstraite, vous vous retrouvez dans child::staticFunction(). Tout est bien.

Cependant, en exécutant self::staticFunction() à partir d'un enfant (non abstrait) de la classe abstraite, vous vous retrouvez dans parent::staticFunction(), qui est abstrait et lève ainsi une exception.

Je suppose que ceci est juste un autre exemple de PHP mal conçu ..__ Ou moi-même ayant besoin de plus de café ...

1
ryh

Parfois, il est utile de pouvoir accéder à des méthodes et à des propriétés dans le contexte d’une classe plutôt que d’un objet. Pour ce faire, vous pouvez utiliser un mot clé statique. Ainsi, nous pouvons accéder à la méthode statique en utilisant le nom de la classe avec la résolution de la portée.

class User

{ public static $ name = 'john';

public static function display()
 {
return self::$name;
 }

}

echo User :: display ();

Regardez ici nous avons déclaré une méthode statique dans notre classe User. Donc, si nous déclarons une méthode statique, nous pouvons y accéder en utilisant simplement le nom de la classe. Pas besoin de créer un objet pour y accéder. J'espère que vous comprendrez toute la procédure.

Remarque: C’est en fait la principale différence avec une méthode normale: $ ceci n’est pas disponible dans de telles méthodes.

lire l'article complet à partir d'ici Comment utiliser les propriétés statiques dans PHP?

0
Mahedi Hasan Durjoy

En PHP, bien que vous soyez autorisé à accéder à la méthode statique en référençant une instance de la classe, vous n'avez pas nécessairement besoin de le faire . Par exemple, voici une classe avec une fonction statique:

class MyClass{
    public static function  MyFunction($param){
        $mynumber=param*2;
        return $mynumber;
}

Vous pouvez accéder à la méthode statique simplement par le nom du type, mais dans ce cas, vous devez utiliser le double-signe deux-points (: :), au lieu de "->". 

$result= MyClass::MyFunction(2);

(Veuillez noter que vous pouvez également accéder à la méthode statique via une instance de la classe à l'aide de "->"). Pour plus d'informations: http://php.net/manual/fr/language.oop5.static.php

0
Web Dev guy