[RESOLU] Création d'une fonction

Eléphanteau du PHP | 20 Messages

25 juin 2019, 15:43

Bonjour à tous et toutes :wink:

Je suis en train d'apprendre le PHP et j'en suis aujourd'hui au niveau des Fonctions.

Ne trouvant pas d'exercices en fonction des différents cours que je suis, je me fais mes propres exercices.

Code : Tout sélectionner

<?php $p=["toto", "tutu", "titi", "tata", "tete"]; function toto($p) { //création de la fonction echo "Salut ".$p[$i]. " !<br>"; //Ce que fait la fonction } for ($i=0;$i<=4;$i++) { //Boucle FOR toto($p); //Appel de la fonction } ?>
J'ai créé ma fonction toto avec comme paramètre, une variable nommée $p.
Cette variable est un tableau avec plusieurs noms.

Je souhaite donc afficher avec la fonction boucle FOR, la totalité des noms du tableau.

Je ne comprends pas les erreurs obtenues en ligne 6.

Merci d'avance pour votre aide :D

Mammouth du PHP | 2703 Messages

25 juin 2019, 16:05

dans la fonction $i n'existe pas.
il serait plus logique que le paramètre passé à la fonction soit une chaine. et ce serait mieux de donner un nom explicite à la fonction, salut() par exemple.

Eléphanteau du PHP | 20 Messages

25 juin 2019, 16:11

Merci, mais si j'ai bien compris le cours (https://www.pierre-giraud.com/php-mysql ... ctions.php), lors de la création d'un fonction, le paramètre n'est pas encore connu.

"C’est seulement lorsqu’on appelle la fonction pour l’exécuter qu’il faut alors passer les valeurs effectives en arguments de notre fonction." (Pierre Giraud).

Il me semble que c'est ce que je fais, non ?

Je reprends alors...

Code : Tout sélectionner

<?php $prenom=["toto", "tutu", "titi", "tata", "tete"]; function fonct($prenom) { //création de la fonction echo "Salut ".$prenom[$i]. " !<br>"; //Ce que fait la fonction } for ($i=0;$i<=4;$i++) { //Boucle FOR fonct($prenom); //Appel de la fonction } ?>
Modifié en dernier par hars le 25 juin 2019, 16:16, modifié 1 fois.

Mammouth du PHP | 2703 Messages

25 juin 2019, 16:15

si $i existait, le code fonctionnerait, voir https://www.php.net/manual/fr/language. ... .scope.php
mais ne pas pouvoir faire :
toto("paul");
est dommage.

Eléphanteau du PHP | 20 Messages

25 juin 2019, 16:20

Merci pour les infos du lien qui ne sont pas négligeables :wink:

C'est pas que cela est ou pas pas dommage/possible, c'est simplement un exercice que je me fais pour bien comprendre le fonctionnement de la création de fonction.
"C’est seulement lorsqu’on appelle la fonction pour l’exécuter qu’il faut alors passer les valeurs effectives en arguments de notre fonction." (Pierre Giraud).
$i est bien créé via la boucle FOR, donc avant l'appel de la fonction, non ?

Mammouth du PHP | 2703 Messages

25 juin 2019, 16:26

la fonction sert à dire hello à un prénom. la logique veux donc que ce soit un prénom qui soit passé en paramètre. ainsi on peut faire :

for ($i=0;$i<=4;$i++) { //Boucle FOR
fonct(...); //Appel de la fonction
}
et
fonct("newbie");
et
$s = "pierre";
fonct($s);
et
fonct($_GET["prenom"]);
...

fonct n'est pas un nom explicite de fonction. quand il y aura une seconde fonction, la seconde fonction ne pourra pas s’appeler aussi fonct().

Avatar du membre
Mammouth du PHP | 1609 Messages

25 juin 2019, 16:33

Salut $i est bien renseigné via la boucle mais est inconnu dans la fonction.
C'est une question de portée des variables.
https://www.php.net/manual/fr/language. ... .scope.php
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 20 Messages

25 juin 2019, 16:37

Merci pour vos conseils.
J'ai modifié le code comme ceci, mais il y a toujours une erreur dans l'appel de la fonction, alors que le résultat est tout à fait celui attendu (effectivement, il y avait un pb de portée de variable) :
Pourquoi cette erreur si la fonction fonctionne ? :?

Code : Tout sélectionner

<?php function fonct($prenom) { global $prenom, $i; $prenom=["toto", "tutu", "titi", "tata", "tete"]; echo "Salut ".$prenom[$i]. " !<br>"; } for ($i=0;$i<=4;$i++) { fonct($prenom); } ?>
Voilà ce que j'obtiens :

( ! ) Notice: Undefined variable: prenom in C:\UwAmp\www\toto.php on line 11
Call Stack
# Time Memory Function Location
1 0.0156 355392 {main}( ) ...\toto.php:0
Salut toto !
Salut tutu !
Salut titi !
Salut tata !
Salut tete !

Mammouth du PHP | 1967 Messages

25 juin 2019, 16:48

Ce n'est pas du tout la bonne manière de procéder.

le mot clé global peut être très utile, mais dans de rare cas particulier.

il est possible de passer plusieurs arguments à une fonction, donc dans ta logique tu pourrais passer $prenom et $i à ta fonction qui pourra alors déterminer $prenom[$i] qui est la chaine de caractère que tu cherche à agrémenter d'un 'salut '

Je rejoins les autres posteurs sur la conception de ton code mais passons si c'est un exercice.
<?php
     $prenom=["toto", "tutu", "titi", "tata", "tete"];

function fonct($prenom, $i) {

     echo "Salut ".$prenom[$i]. " !<br>";
}

for ($i=0;$i<=4;$i++) {
     fonct($prenom, $i);
}

?>
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 20 Messages

25 juin 2019, 16:52

J'ai enfin trouvé grâce à votre aide !

Code : Tout sélectionner

<?php function fonct($prenom) { global $prenom, $i; $prenom=["toto", "tutu", "titi", "tata", "tete"]; echo "Salut ".$prenom[$i]. " !<br>"; } $prenom=["toto", "tutu", "titi", "tata", "tete"]; for ($i=0;$i<=4;$i++) { fonct($prenom); } ?>
J'ai dû déclarer 2 fois la variables prenom, une fois dans la fonction et une fois avant la boucle FOR.

Vous m'avez appris qu'une variable pouvait avoir une certaine portée et je vous en remercie. =D> :D

Mammouth du PHP | 2703 Messages

25 juin 2019, 16:55

code qui marche mais qui est horrible.
et j'insiste, ne pas pouvoir faire
fonct("newbie");
et
$s = "pierre";
fonct($s);
est très mauvais.

Avatar du membre
Mammouth du PHP | 1609 Messages

25 juin 2019, 16:56

Voilà plusieurs formes fonctionnelles de fonctions avec utilisation cohérente des boucles et du global :
function hello1($prenom) {
  echo "Salut $prenom !<br>";
}

function hello2($prenoms, $i) {
  echo 'Salut '.$prenoms[$i].' !<br>';
}

function hello3() {
  global $prenoms, $i;
  echo 'Salut '.$prenoms[$i].' !<br>';
}


$prenoms = ["toto", "tutu", "titi", "tata", "tete"];

foreach ($prenoms as $prenom)
  hello1($prenom);

for ($i = 0; $i < count($prenoms); $i++) {
  hello1($prenoms[$i]);
  hello2($prenoms, $i);
  hello3();
}

Le global sert à pointer des variables définies dans le contexte global depuis un contexte restreint (intérieur d'une fonction ou d'une méthode d'objet).
Développeur web depuis + de 20 ans

Mammouth du PHP | 2703 Messages

25 juin 2019, 17:06

voir même
function hello1($prenom) {
  echo "Salut $prenom !<br>";
}

function hello2($prenoms, $i) {
  hello1($prenoms[$i]);
}

function hello3() {
  global $prenoms, $i;
  hello1($prenoms[$i]);
}
pour ne pas avoir à changer le code à 3 endroits pour par exemple mettre le prénom entre <b> et </b>

Eléphanteau du PHP | 20 Messages

25 juin 2019, 17:09

Merci pour vos retours.
J'en prends note et j'appliquerai vos conseils à l'avenir :wink: