Utilité des :: et classes "imbriquées" [Résolu]

Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
- - Dernière réponse : neigedhiver
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
- 8 mai 2007 à 17:37
Bonjour à vous tous.
Hier soir j'ai un peu tripoté les "::" en php pour savoir à quoi ils servent.
J'en ai conclut, d'après mes tentatives, que cela sert à utiliser une classe sans l'instancier.
Par exemple, si j'ai
class essai {
    function lol {
       echo "salut !";
    }
}

et qu'ensuite dans mon code php, je fait essai::lol();  j'aurai "salut !" d'affiché.
Est-ce bien l'utilité de ces :: ? Quel est alors la différence entre ces :: et instancier une classe ? quel est le mieux ?
Connaissez-vous une url ou je pourrai en apprendre d'avantage sur ces spécificités ?

Par ailleur, j'aimerai savoir s'il est possible d'imbriquer des functions je m'explique.
j'ai la classe comme avant
mais dans la fonction lol, j'ai d'autres fonctions :
class essai {

    function lol {

       function salut() {

       }

       function bonjour () {

       }

    }

}

je sais que ca marche pas (ou alors j'ai loupé quelque chose), mais j'aimerai avoir une classe ou je puisse bien séparer les éléments, pour faire
$essai = new essai();
$essai->lol()->salut();

Dans l'idée, ce serait pour avec par exemple une classe "message", puis avoir une fonction "affirmation", "question", ..., et dans chaques fonctions, de nouvelles fonctions type : (dans "affirmation"), "certain", "sûr", etc de facon à faire
message->affirmation()->certain();

J'espere avoir été assez clair :/

Merci de votre aide !
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
11
3
Merci
Salut,

:: s'appelle opérateur de résolution de portée, ou encore Paamayim Nekudotayim (ce qui signifie "Double deux points" en hébreu).
Son utilité est effectivement d'utiliser une méthode d'une classe sans instancier la classe.
Pourquoi faire comme ça ?
Parce que parfois, on peut avoir une méthode d'une classe utile pour ceci ou cela, et uniquement pour ceci ou cela, pas autre chose. Alors, on peut utiliser l'opérateur de résolution de portée (j'utiliserai :: maintenant, c'est quand même plus court).

Par ailleurs, :: est aussi utilisé dans certains cas en POO que je ne saurais pas bien détailler.
Il sert par exemple à instancier un singleton.
L'intérêt diu singleton réside dans le fait qu'il n'est pas instanciable par lui-même (sinon, ce ne serait plus un singleton, puisqu'on pourrait créer autant d'objets de la classe en question). Il faut, pour instancier un singleton, une classe qui va contrôler si le singleton a déjà été instancié ou non. Si ce n'est pas le cas, elle va instancier un nouvel objet et le retourner.
Si le singleton a déjà été instancié, elle retourne l'objet déjà instancié.

Un petit exemple qui m'avait permis de comprendre... http://qwix.media-box.net/index.php/2004/09/29/24-LeSingletonEnPhp5

Sinon, d'une manière générale, si tu as besoin de tout ce qu'offre un objet php5, que l'objet "vit" en quelque sorte alors instancie l'objet.
Si tu n'as besoin occasionnellement que d'une fonction, alors utilise ::
Il faut bien comprendre quand même que si la méthode en question ne doit être appelée que via :: ... Elle n'a pas lieu d'être définie en tant que méthode de l'objet, puisqu'elle ne peut pas utiliser les propriétés (variables) de la classe.

Pour ce qui est de l'imbrication de fonctions, c'est possible.
Comme il ne sert à rien d'inventer un nouvel exemple, autant reprendre celui de la doc de php :
<?php
function foo()
{
function bar()
{
echo "Je n'existe pas tant que foo() n'est pas appelé.\n";
}
}

/* Impossible d'appeler bar() ici
car il n'existe pas. */

foo();

/* Maintenant, nous pouvons appeler bar(),
car l'utilisation de foo() l'a rendu
accessible. */

bar();

?>
Source : http://ch2.php.net/manual/fr/language.functions.php (exemple 17.3)

Par contre, si tu dis que ça ne marche pas, c'est que tu as du n'essayer qu'avec une classe.
Ce que tu veux faire ce fait ainsi :

class essai
{
public $lol;
__construct()
{
$this -> lol = new lol;
}
}

class lol
{
function mdr()
{
echo 'mdr';
}
}

$essai -> lol -> mdr();

Affichera :
mdr

Ce que tu veux, c'est assigner un objet à une variable, en l'occurrence, une propriété d'un autre objet.

est-ce que c'est assez clair ?

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de neigedhiver
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
11
0
Merci
Mince, on peut pas éditer...
Correction... dans la fonction __construct de la classe essai, la syntaxe correcte est
$this -> lol = new lol();
Commenter la réponse de neigedhiver
Messages postés
10918
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Hello,

la classe lol n'ayant pas de constructeur,
$this -> lol = new lol;
est correct :-)
Commenter la réponse de malalam
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
11
0
Merci
Hello,

Ah ben merci de la précision. M'enfin, ça perturbe mes noeils, même le dimanche matin au lever du lit.
Commenter la réponse de neigedhiver
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
0
Merci
merci beaucoup pour ces réponses très bien détaillé !
ca fait plaisir de savoir qu'il y a des gens comme toi qui prennent autant de temps à répondre, avec autant de détails, précisions et exemples ! :)

merci beaucoup !! :)
Commenter la réponse de codefalse
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
11
0
Merci
Salut,

Quand les questions sont pertinentes et détaillées, et montrent que la personne a cherché, essayé et que malgré cela elle a encore quelques doutes/questions ou manque de précisions sur certains détails, c'est un réel plaisir que de répondre avec moult détails (comment j'me la pète avec ma phrase de 3km...)
Commenter la réponse de neigedhiver