Explication du mot-clé static
Bonjour (non optionel)
J'aimerais savoir à quoi sert concrétement la directive static, moi avec les explications sur le net je serais tenter de mettre tout en static.
Plus besoin d'instancié une class.
Peut-on m'eclairer !
Réponses apportées à cette discussion
En ne faisant plus aucune instanciation de classe, autant faire directement tout en procédural, la POO devient alors sans intérêt etdonc écrire des collections de fonctions sous forme de classes n'a plus de sens.
Et c'est bien ce que tu as compris : la directive static permet de s'affranchir de l'instanciation pour accéder à une propriété ou une méthode de classe. Mais peut-être qu'en élaborant un peu autour de ton idée générale on pourrait t'apporter une réponse plus appropriée...
Bonjour Ivarez,
Le mot-clé static te permet d'appeler des attributs ou des méthodes qui n'appartiennent pas à l'instance (objet). Dans le cadre des méthodes, on utilise le mot-clé static pour écrire une méthode qui ne sera pas appelée sur l'objet lui même mais qui sera appelée en dehors du contexte d'instance pour réaliser une tâche. Une méthode statique est en réalité une simple fonction utilisateur. Par exemple, les deux codes ci-dessous font exactement la même chose :
<?php
function sayHello($name)
{
return 'Hello '. $name;
}
class SayHelloTools
{
public static function($name)
{
return 'Hello '. $name;
}
}
// Appels
echo sayHello('Hugo'); // Renvoie "Hello Hugo"
echo SayHelloTools::sayHello('Hugo'); // Renvoie "Hello Hugo"
On utilise les méthodes statiques dans certains patrons de conception comme le singleton ou bien la factory pour des appels qui ne concerne pas le contexte d'instance.
Quant aux attributs statiques d'une classe, ils servent à partager une information dans tous les objets issus de cette même classe. On appelle les attributs statiques des variables de classe car elles dépendent de la classe et non de l'objet.
Prenons un exemple simple avec la classe suivante qui contient un membre statique et un membre non statique. Le membre statique dépendra de l'instance.
<?php
class MonObjet
{
public static $monAttributStatique = 5;
public $monAttributInstance = 10;
public function __construct() { }
public function getAttributStatic() { return self::$monAttributStatique; }
}
Créeons deux objets et voyons ce qu'il se passe :
<?php
$obj1 = new MonObjet();
$obj2 = new MonObjet();
Nous avons là deux objets distincts. Nous allons fixer les deux propriétés pour chaque objet.
<?php
echo MonObjet::$monAttributStatique; // Affiche 5
echo $obj1->getAttributStatic(); // Affiche 5
echo $obj2->getAttributStatic(); // Affiche 5
// Fixation des valeurs $obj1
echo $obj1->monAttributStatique = 12;
echo $obj1->monAttributStatique; // Affiche 12
// Fixation des valeurs $obj2
echo $obj2->monAttributStatique = 25;
echo $obj2->monAttributStatique; // Affiche 25
// Fixation attribut statique
MonObjet::$monAttributStatique = 78;
echo MonObjet::$monAttributStatique; // Affiche 78
echo $obj1->getAttributStatic(); // Affiche 78
echo $obj2->getAttributStatic(); // Affiche 78
Ainsi tu vois bien que l'attribut statique ne dépend pas de l'objet mais bien de la classe. Si on le modifie, il est modifié pour chaque objet car il appartient bien à la classe elle même et non à l'instance (objet).
++
Bonjour à tous,
Merci pour ces bonnes explications, je vois plus clair maintenant, j'aimerais vous soummettre un code cependant ca ne marche pas, faut il faire une manipulation spéciale ?
Salut Ivarez,
dans la barre d'outils du formulaire de saisie du message, tu as une petite icône ("****", à droite) qui va ouvrir une boite de dialogue pour coller ton code dedans. Utilise le bouton de pré-visualisation en bas du formulaire pour vérifier ce que ça donne avant de poster ;)
Exemple :
<?php
function maFonction()
{
return true;
}
?>
mais justement ca ne fonctionne pas ca ne colle aucun code dans la page !!!!
Salut,
Merci Emacs, j'ai lu à plusieur reprise le manuel et j'ai rien compris. Là tout est devenue beaucoup plus claire.
Une autre question sur les méthodes statiques, à quoi elles servent, dans l'exemple suivant qu'une methode qu'elle soit statique ou non, le resultat retourné est toujours le même :
<?phpclass MaClass { public function fonctionNormal() {echo "Fonction Normal\n";} public static function fonctionStatic() {echo "Fonction Static\n";} } MaClass::fonctionNormal(); // retourn 'Fonction Normal'MaClass::fonctionStatic(); // retourn 'Fonction Static' $Test = new MaClass;$Test->fonctionNormal(); // retourn 'Fonction Normal'$Test->fonctionStatic(); // retourn 'Fonction Static'?>