OVH Cloud OVH Cloud

[debutant] 1 tableau dans 1 class

3 réponses
Avatar
io
Bj,

ça fait quelque jour que j'essaie de comprendre class/Object
(phpdebutant.org)

je n'arrive pas a appellé un tableau dans une class

voila merci d'avence

exemple de mon script:

<?php
class photo {
var $image = array("blabla" => "bla.jpg",
"fluflu" => "flu.jpg",
"riri" => "ri.jpg"
);

function choixImage($num){
$this->image[$num][0] = $title;
$this->image[$num][1] = $src;
}

function displayImage(){
echo "\n<img src=\"images/$this->src\" width=\"300\" height=\"224\"
title=\"$this->title\" />\n";
}
}

$foto = new photo();
$foto->choixImage(1);
$foto->displayImage();
?>

3 réponses

Avatar
Guillaume Bouchard


function choixImage($num){
$this->image[$num][0] = $title;
$this->image[$num][1] = $src;
}


Ce serait pas plutot

$this -> title = $this -> image[$num][0];
$this -> src = $this -> image[$num][1];

--
Guillaume.

Avatar
Bruno Desthuilliers
io wrote:
Bj,

ça fait quelque jour que j'essaie de comprendre class/Object
(phpdebutant.org)

je n'arrive pas a appellé un tableau dans une class

voila merci d'avence

exemple de mon script:

<?php
class photo {
var $image = array("blabla" => "bla.jpg",
"fluflu" => "flu.jpg",
"riri" => "ri.jpg"
);


A mon très humble avis, il est préférable d'initialiser les données
membres dans le constructeur...

function choixImage($num){
$this->image[$num][0] = $title;
$this->image[$num][1] = $src;
}


Tu ne crois pas que tu t'es un peu mélangé, là ? Tu n'aurais pas par
hasard inversé les termes de l'assignation ?-)

Par ailleurs, tu a utilisé un tableau associatif, donc $image[0] (ou
$image[1] etc) n'existent pas. Relis la doc...


function displayImage(){
echo "n<img src="images/$this->src" width="300" height="224"
title="$this->title" />n";
}
}


Là aussi tu a un problème : $this->src et $this->title n'existent pas...


Peut-être que ça fonctionnerais mieux comme ça (pas testé, mais bon):

class ImageDisplayer {
var $images;
var $title;
var $src;

//-------------------------------------------------
function ImageDisplayer() {
// attention, pour la suite du code,
// tu veux un tableau de tableaux, pas un
// tableau associatif...
$this->images = array(array("blabla","bla.jpg"),
array("fluflu","flu.jpg"),
array("riri","ri.jpg")
);

// choix par defaut, sinon tu
// aura un probleme si tu appelle displayImage()
// avant selectImage()...
this->selectImage(0);
}

//-------------------------------------------------
function selectImage($num){
// verifier qu'on ne deborde pas...
if ($num >= 0 && $num < count($this->images) {
$this->title = this->images[$num][0];
$this->src = $this->image[$num][1];
}
else {
// TODO : erreur
}
}

//-------------------------------------------------
function displayImage(){
echo "n<img src="images/{$this->src}" width="300"
height="224" title="{$this->title}" />n";

}
}

Quelques conseils (pas spécifiques à PHP d'ailleurs):
- soit cohérent dans la langue utilisée. Ne mélange pas français et anglais.
- donne des noms explicites. Ta classe ne modélise pas une photo.
- base de préférence les noms des fonctions et méthodes sur des verbes
d'action.

Autre chose, concernant la conception de ta classe : pourquoi le choix
et l'affichage sont-ils séparés ? Ceci t'oblige a appeler deux méthodes
l'une à la suite de l'autre :

id = new ImageDisplayer();
id->selectImage(1);
id->displayImage();

Ne serait-il pas plus simple d'avoir tout dans une seule méthode ?


function displayImage($num){
// verifier qu'on ne deborde pas...
if ($num >= 0 && $num < count($this->images) {
echo "n<img src="images/"
. $this->image[$num][1]
. "" width="300" height="224" title=""
. $this->image[$num][0]
. "" />n";
}
else {
// TODO : erreur
}
}

Maintenant, c'est plus simple à appeler :

id = new ImageDisplayer();
id->displayImage(1);

et tu n'a plus besoin d'appeler selectImage() avant displayImage() (ce
qui est une Bonne Chose(TM)).

Voili voila... Il ne te reste plus qu'à éviter de coder en dur la liste
d'images et les dimensions pour l'affichage.

HTH
Bruno

Avatar
Marc
class ImageDisplayer {
var $images;
var $title;
var $src;
...


Quelques conseils (pas spécifiques à PHP d'ailleurs):
- soit cohérent dans la langue utilisée. Ne mélange pas français et
anglais.
- donne des noms explicites. Ta classe ne modélise pas une photo.
- base de préférence les noms des fonctions et méthodes sur des verbes
d'action.



dans le meme genre, une classe avec un verbe c'est plus vraiment une
bonne classe. je suis pleinement d'accord avec toi sur ce que tu enonce.

il est possible de realiser des classes multiples avec des nom proches
mais qui joue des roles de gestionnaire ou de contenu.

Sinon, bravo pour ce petit topo, c'est un regal.

Pour exemple je me suis amusé a developper un ensemble de classes
pour les fonctions imap. Voici les classes que j'ai créé :

ImapManager :
- spécifique a mon appli.
- gestion de l'application, des mots de passes
- le main en quelque sorte.

ImapServer : gere la connexion,
- contient mot de passe
- et lien vers Mailbox

ImapMailbox :
- c'est une boite aux lettre
- a prioris un attribut de ImapServer

ImapMessage
- destiné a l'api sur les messages

ImapMessageObject
- les messages ont une structure un peu complexe
- ils sont donc decoupés en objets

ImapCore:
- racine de toutes ces classes

ImapDecode:
- operations de transcodage

ImapUtils:
- operations inclassables.

l'objetif est de lire une boite aux lettres via imap
et de filtrer des virus. Le tout sera placé sous une
crontab et sous linux ; c'est en bonne voie.

pour conclure ce decoupage en classe structure grandement l'API
un peu complexe et purement horizontal du protocole IMAP. Ca n'apporte
rien sur le plan de la programmation et de la technique pure.
C'est aussi un exercice de style interessant.

Je crois qu'on manque de problemes pratiques pour realiser
des modilisation objet, les simples cas d'ecoles sont souvent
les memes et n'apportent pas grand chose. Je me souviens
avoir realisé un monopoly en Java, et c'etait tres satisfaisant.

Il y a le newsgroup fr.comp.objet ou de temps a autre des themes
intéressants sont lancés.