0 votes

Différence entre les méthodes des classes d'accès

Jusqu'à hier, je pensais que ces deux méthodes d'accès à une classe étaient identiques. Google n'a rien trouvé (ou alors mes mots-clés étaient mauvais). Quelle est la différence entre accéder à une classe en définissant une nouvelle instance de la classe plutôt que d'appeler directement les méthodes de la classe.

J'ai du mal à comprendre ce que je viens de demander, car je n'ai pas la moindre idée de ce que je demande, mais permettez-moi de vous donner quelques exemples pour vous aider.

Depuis que j'utilise des classes en PHP, je définis une instance de la classe et j'accède aux méthodes à partir de cette variable. Voici un exemple :

<?php
class Myclass
{
   public function my_method() {
      return "This is my method"; 
   }
}
$myclass = new Myclass();

echo $myclass->my_method(); // output: This is my method
?>

Quelle est la différence entre cela et ceci ?

<?php
class Myclass
{
   public function my_method() {
      return "This is my method";
   }
}

echo Myclass::my_method(); // output: This is my method
?>

J'espère avoir été suffisamment clair. Si ce n'est pas le cas, un bref résumé serait le suivant : quelle est la différence entre la création d'une nouvelle instance d'une classe et l'appel d'une méthode de la classe avec "$class->mymethod() ;", ou simplement l'appel direct de la méthode comme suit : "$class->mymethod() ;", "$class->mymethod() ;": "Myclass::mymethod() ;"?

Merci d'avance.

3voto

Tatu Ulmanen Points 52098

La notation : : est utilisée pour appeler la fonction comme statique. Voir ces pages du manuel PHP pour plus d'informations :

En fait, les fonctions statiques sont comme des fonctions normales en dehors des classes. La fonction n'est pas dans le contexte de l'objet lorsqu'elle est appelée en tant que telle, de sorte que la pseudo-variable $this n'est pas disponible.

Notez que la fonction doit être déclarée comme static si vous avez l'intention de l'appeler ainsi :

class SomeClass {

    static public function StaticFunction() {
        ...
    }

}

2voto

Powerlord Points 43989

L'appel à Myclass::my_method() devrait générer un avertissement E_STRICT, car vous appelez une méthode non statique dans un fichier static contexte.

Les méthodes statiques sont des méthodes qui appartiennent à la classe plutôt qu'à l'instance. Ces méthodes ne peuvent accéder à aucune variable non statique, car elles n'ont pas de référence pour elles (les variables non statiques appartiennent à l'instance et non à la classe).

Après avoir utilisé Java et C#, je suis légèrement troublé que cela ne soit pas considéré comme un E_WARNING ou un E_ERROR, d'autant plus que E_STRICT n'est pas enregistré par défaut.

0voto

MrChrister Points 2276

http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php

Je ne pense pas que l'on puisse appeler des méthodes de cette manière. Je pensais que c'était ainsi que l'on appelait les membres statiques de la classe.

0voto

AntonioCS Points 3208

D'après ce que j'ai compris, lorsque vous créez une instance de la classe, vous créez un objet et vous appelez donc des méthodes/propétences à partir de cet objet.

Lorsque vous appelez une méthode/propriété via un appel statique, vous faites appel à la classe elle-même.

Donc, si vous avez quelque chose comme ceci :

class acs {
    public $var = 'bla';        
}

et ensuite vous le faites

$a = new acs();
$b = new acs();

echo $a->var . '<br>';
echo $b->var . '<br>';

$a->var = 'hey';
$b->var = 'Yooo';

echo $a->var . '<br>';
echo $b->var . '<br>';

Vous avez maintenant 2 instances de la classe acs qui ont commencé avec les mêmes valeurs mais qui ont maintenant des valeurs différentes.

Mais si vous avez ceci :

class acs {
    public static $var = 'bla';     
}

Et de le faire :

$a = new acs();
$b = new acs();

echo $a->var . '<br>';
echo $b->var . '<br>';

$a->var = 'hey';
$b->var = 'Yooo';

echo $a->var . '<br>';
echo $b->var . '<br>';

echo acs::$var;

Ce que vous faites, c'est.. :

  • Vous créez les instances comme précédemment.

  • Vous n'obtenez aucun écho, car la propriété publique var n'existe pas.

  • Vous créez la propriété publique var dans les deux instances

  • Vous faites écho à leurs valeurs (hey et Yoo)

  • Vous faites écho à la propriété statique var (qui est 'bla' et n'a pas changé)

J'espère que cela vous aidera !

0voto

yu_sha Points 2370

Tout d'abord, vous devez comprendre la différence entre une classe et un objet, ou une classe et une instance de classe.

Par exemple, lorsque la classe est "Cercle", une instance peut être "ce cercle particulier". La classe Cercle peut avoir les membres $center et $radius - chaque point les possède. Mais les valeurs de ces éléments sont différentes pour chaque point.

$class->mymethod() est un appel à une méthode d'instance, par exemple $circle->Length(). Vous dites quelque chose à une instance particulière d'un objet. Cette méthode aura accès aux membres de la classe - les variables qui appartiennent à l'instance. En PHP, vous pouvez accéder à ces variables d'instance en utilisant le mot-clé $this .

Par exemple $circle->Length() pourrait être mis en œuvre sous la forme return 2*Pi*$this->radius ;

Que se passe-t-il lorsque vous dites Circle::Length() ? Rien. C'est la syntaxe pour appeler méthodes statiques . Parce que vous n'avez pas précisé de quel cercle il s'agissait. Le cercle en tant que classe n'a pas de longueur.

Une méthode statique est déclarée avec le mot-clé static. Quoi qu'elle fasse, elle n'a accès à aucune instance de la classe. C'est quelque chose que fait la classe dans son ensemble.

Par exemple, si vous souhaitez calculer la longueur d'un cercle sans en créer un, il peut y avoir static function calculateLength($radius) dans le cercle de la classe. Et vous l'appelleriez Circle::calculateLength($myRadius)

À mon avis, vous ne devriez même pas penser aux méthodes statiques tant que vous n'avez pas compris les méthodes non statiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X