OVH Cloud OVH Cloud

Tableau d'objets ???

17 réponses
Avatar
Vaguener Frank
Voila, je programme et je voudrais faire une sorte de code Php qui
tourne un peu comme un serveur xchange.
J'ai donc une classe "MessageBox" qui contiendrait un tableau d'objet de
messages, que je parcourerais après.

Or ca bugg, au niveau de la ligne 21 de DAO.Php...

"Parse error: parse error, expecting `T_VARIABLE' or `'$'' in c:\program
files\easyphp1-8\www\msg\dao.php on line 21"

Je n'arrive pas à mettre la dent sur ce qui ne marche pas...
Est=ce la création du tableau d'objets, ou le foreach qui foire ?
Merci d'avance, ci dessous mes 3 codes.


Voici, j'ai 3 codes :




1.: index.php

<?php
include("dao.php");

$MesMessages = New MessageBox();

$Dao = New Dao();

echo ($Dao->GetMessage($MesMessages,"1"));
?>





2.: msg.php

<?php
class Message {
var $idMsg = 0;
var $idFrom = 0;
var $idTo = 0;
var $Subject="";
var $Content="";
}


class MessageBox {
var $Count = 0;
var $Messages;
}
?>





3.: Dao.Php

<?php
include("msg.php");
class Dao
{

function Login()
{
$HostId='localhost'; $Login='root'; $Password=''; $Db='poy';
mysql_connect($HostId,$Login,$Password);
mysql_select_db($Db);
}


function GetMessage($MessageBox, $Parameters) // recoit le
serveur et l'id
{ $this->Login();
$result = mysql_query("SELECT * FROM MESSAGES WHERE ID_TO =
'".$Parameters."' ORDER BY TIMESTAMP ASC;")
or die('Erreur Getting Messages !<br>'.$sql.'<br>'.mysql_error());

while($data = mysql_fetch_array($result)) // boucle
{ foreach ($MessageBox->Messages as new Message()){
$Mailbox->$Messages->idMsg=$data["id_Msg"];
$Mailbox->$Messages->idFrom=$data["Id_From"];
$Mailbox->$Messages->idTo=$data["id_To"];
$Mailbox->$Messages->Subject=$data["Subject"];
$Mailbox.$Messages->Content=$data["Content"];
=} // crée un objet message et le remplit
mysql_close();
return $Mailbox;
}
}


}
?>

7 réponses

1 2
Avatar
Vaguener Frank
[...]

Maintenant dans votre code je ne vois nulle part où vous créer votre
tableau de $MessageBox->Messages... Donc à mon avis l'algorithmique est
aussi à revoir.


Suite à ta remarque, je crois que j'ai compris ce que Frank voulait
faire. Le code suivant devrait fonctionner :

while ($data = mysql_fetch_array($result)) {
$Message = new Message();

$Message->idMsg = $data["id_Msg"];
$Message->idFrom = $data["Id_From"];
$Message->idTo = $data["id_To"];
$Message->Subject = $data["Subject"];
$Message->Content = $data["Content"];

$MessageBox->Messages[] = $Message;
}

Cela dit, Frank, tu devrais vraiment suivre le conseil de Bruno,
c'est-à-dire lire la doc au lieu d'écrire des trucs au hasard en
espérant que ça tombe en marche.



C'est effectivement ça...
Lu comme cela, ça a l'air assez simple

Pour ce qui est de foreach, ce qui m'a induit en erreur, c'est justement
ce "foreach(array_expression as "... en me disant peut être que ça
aurait pu induire un polymorphisme.


Je sais que le but principal de ce forum est d'aider les gens et que les
gens qui prennent du temps à regarder ces codes et à y répondre le font
bénévolement, et ça, je vous en remercie.
De là à être un peu antipathique...

Pour ce qui est de l'algorithmique et de la programmation, j'crois qu'on
code tous un peu au début "comme ça" en farfouillant dans la doc, c'est
du code "pondu" à x heures du matin, ça arrive à tout le monde de pondre
du brol...

Je recommence à coder après 2 ans de non codage, et je débute en php,
faut que certaines notions se dérouillent...
Merci néanmoins pour votre aide.

Bien à vous,
F.


Avatar
Olivier Miakinen

Pour ce qui est de foreach, ce qui m'a induit en erreur, c'est justement
ce "foreach(array_expression as "... en me disant peut être que ça
aurait pu induire un polymorphisme.


Ah. Bon, alors pour info sache que foreach est une instruction qui
concerne les tableaux et qui n'a *strictement* aucun rapport avec les
objets (polymophisme ou pas).

Je sais que le but principal de ce forum est d'aider les gens et que les
gens qui prennent du temps à regarder ces codes et à y répondre le font
bénévolement, [...]


La motivation principale des bénévoles est d'aider les gens qui s'aident
eux-mêmes, c'est-à-dire ceux qui font déjà l'effort de lire les docs, et
qui ne demandent de l'aide qu'en dernier recours.

Pour ce qui est de l'algorithmique et de la programmation, j'crois qu'on
code tous un peu au début "comme ça" en farfouillant dans la doc, c'est
du code "pondu" à x heures du matin, ça arrive à tout le monde de pondre
du brol...


Je ne partage pas du tout ton opinion. Il arrive à tout le monde ou
presque de pondre des bugs, mais habituellement les débutants recopient
plutôt un code pris ailleurs qu'ils essayent de modifier pour arriver à
leurs fins.

Je recommence à coder après 2 ans de non codage, et je débute en php,
faut que certaines notions se dérouillent...


Ne vois surtout aucune animosité de notre part, hein, dans les réponses
qui t'ont été données ! Je pense sincèrement que tu as intérêt, vu que
tu débutes, à lire posément la doc, et probablement à lire aussi du code
écrit par d'autres (attention, il peut y avoir aussi des horreurs dans
du code qui marche !)

Voici deux liens en français à peu près incontournables :
<http://www.php.net/manual/fr/> et <http://faqfclphp.free.fr/>.
Note que si tu poses des questions dont la réponse se trouve directement
dans l'un des deux, ces questions seront refusées par la modération.
De plus, comme tu as une adresse vraisemblablement invalide (mais non
terminée par .INVALID, ce qui est mal ©), tu n'auras jamais la raison
du refus.

Merci néanmoins pour votre aide.


Voici un autre truc à lire pour t'éviter des refus de publication (pour
ton dernier article, avec plus de 20 lignes de citation, c'était limite
à mon avis) :
<http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html>.

Et pour l'histoire du .INVALID :
<http://www.usenet-fr.net/fur/usenet/abus/adresses-antispam.html>.

Cordialement,
--
Olivier Miakinen

Avatar
Pozzo
Bruno Desthuilliers wrote:
<pédant>
en fait si, mais ils n'auront a priori aucun lien avec le contenu du
tableau parcouru...

foreach($MessageBox->Messages as $existing_message) {
$new_message = new Message();
// ....
}

Mais bon, ça ne nous avance à rien !-)
</pédant>


Je me suis visiblement mal exprimé. Bien sur qu'on peut créer un new
Message() à l'intérieur du foreach (entre les { } ), mais on ne peut pas
parcourir un tableau qui n'existe pas encore.

Ce qui reste parfaitement inutile AMHA:
1/ en PHP 4, les éléments renvoyés sont en fait des copies, pas des
références sur les originaux. Donc, on peut leur faire ce qu'on veut
comme modification, c'est perdu dès le tour suivant... (je ne sais pas
ce qu'il en est pour PHP 5)


+1 point !

<?php
class Toto {
var $name = 'no name';
}

$ar = Array(new Toto, new Toto, new Toto);

foreach($ar as $id => $toto) {
$toto->name = "toto $id";
}

foreach($ar as $id => $toto) {
echo $toto->name . "<br>";
}
?>

=> affiche:
no name
no name
no name



On peut facilement contourner le pb, par exemple comme cela...

foreach($ar as $key => $obj) {
$ar[$key]->name = "toto ".$id++;
}

et on obtiendra bien :

toto 0
toto 1
toto 2


2/ de toutes façons, même si cette modif était effective, affecter le
même id de message à tous les messages ne me semble pas une idée
lumineuse.... Enfin bon, pour ce que j'en dis, hien...


J'ai bien écrit que l'algo était aussi à revoir... J'essaie de lui
expliquer la bonne syntaxe pour le foreach, pour le reste il faut aussi
qu'il cherche un peu, non ?

AMHA, et sans vouloir être désagréable, il y plus que ça à revoir...


En dehors de la syntaxe et de l'algo je ne vois pas trop ce qu'on peut
ajouter pour définir un code bancal ?

On ne peut pas faire de foreach sur un tableau non
existant... Et pour le créer je vous suggere de regarder du coté de la
fonction array(). Ceci dit je n'ai jamais testé la création d'un array
d'objets. J'imagine que c'est possible.


Pourquoi ça ne serait pas possible ?


Parce que je suis prudent et que je me méfie des réponses évidentes...
et que j'avais pas envie de vérifier dans la doc pour un problème qui
n'est pas le mien. Parce que bon, hein, si on veut continuer dans le
chipotage et le désagréable, la réponse RTFM aurait été assez adapté si
on ne considère que la problème de syntaxe (que le parser PHP lui signal
gentiment avec le numéro de ligne...)

Mais j'ai pourtant écrit "j'imagine que c'est possible"...

Un tableau peut contenir n'importe
quel type de données PHP.

Quitte à sérialiser l'objet au
besoin


Pas besoin.


Vous avez oublié le tag pédant là ? ;-)

--
Pozzo - Tout mais pas ça


Avatar
Pozzo
Olivier Miakinen wrote:
Suite à ta remarque, je crois que j'ai compris ce que Frank voulait
faire. Le code suivant devrait fonctionner :


Bon, et bien il y en a au moins un qui trouve que ma contribution n'est
pas inutile ni "obscure", merci ;-)

--
Pozzo - Réconforté

Avatar
Bruno Desthuilliers
(snip)
Pour ce qui est de foreach, ce qui m'a induit en erreur, c'est justement
ce "foreach(array_expression as "... en me disant peut être que ça
aurait pu induire un polymorphisme.


J'ai du mal à voir le rapport avec le polymorphisme.

Je sais que le but principal de ce forum est d'aider les gens et que les
gens qui prennent du temps à regarder ces codes et à y répondre le font
bénévolement, et ça, je vous en remercie.
De là à être un peu antipathique...


Un bon conseil n'est pas moins bon parce que formulé abruptement. Et
réciproquement.

En tout état de cause, il n'y a pas de plus mauvaise approche que la
programmation accidentelle. Si tu ne *sais* pas pourquoi ton code semble
fonctionner, tu a un gros problème en prévision...

Avatar
Bruno Desthuilliers
Bruno Desthuilliers wrote:

<pédant>
en fait si, mais ils n'auront a priori aucun lien avec le contenu du
tableau parcouru...

(snip)


</pédant>


Je me suis visiblement mal exprimé.


C'était juste une précision sur un point certainement aussi évident pour
toi que pour moi, mais pas forcément évident pour un débutant.

(snip)

On peut facilement contourner le pb, par exemple comme cela...

foreach($ar as $key => $obj) {
$ar[$key]->name = "toto ".$id++;
}



ou simplement:
for ($i = 0; $i < count($ar); $i++) {
$ar[$i]->name = "toto ".$i++;
}

qui sera plus efficace.

Ceci étant, le problème semble avoir été résolu en PHP5.

(snip)

Ceci dit je n'ai jamais testé la création d'un array
d'objets. J'imagine que c'est possible.


Pourquoi ça ne serait pas possible ?


Parce que je suis prudent et que je me méfie des réponses évidentes...


Ce en quoi tu a tout à fait raison - et pour ma part, j'ai eu le tort
d'oublier le smiley. Mon but n'était pas d'être désagréable ('pour une
fois' diront certains...), mais de répondre à ton interrogation quand à
cette possibilité.


Un tableau peut contenir n'importe
quel type de données PHP.


Quitte à sérialiser l'objet au
besoin


Pas besoin.



Vous avez oublié le tag pédant là ? ;-)


Non - mais si tu insiste, je peux faire bien pire en matière de
pédanterie !-)



Avatar
Pozzo
Bruno Desthuilliers wrote:
C'était juste une précision sur un point certainement aussi évident pour
toi que pour moi, mais pas forcément évident pour un débutant.


Dont acte...

ou simplement:
for ($i = 0; $i < count($ar); $i++) {
$ar[$i]->name = "toto ".$i++;
}

qui sera plus efficace.


On est d'accord.

Ceci étant, le problème semble avoir été résolu en PHP5.
(snip)


Effectivement. Reste que PHP5 n'est pas encore si répandu que cela chez
nos amis hébergeurs (je sais... on peut changer d'hébergeur ;-).

Ce en quoi tu a tout à fait raison - et pour ma part, j'ai eu le tort
d'oublier le smiley. Mon but n'était pas d'être désagréable ('pour une
fois' diront certains...), mais de répondre à ton interrogation quand à
cette possibilité.


Et moi j'ai eu le tort d'etre un peu soupe-au-lait et de répondre un peu
vite avant d'analyser ta réponse qui, après tout, n'avait rien d'agressive.

Non - mais si tu insiste, je peux faire bien pire en matière de
pédanterie !-)


On peut surement faire pire tous les 2...

--
Pozzo - Il n'est pas de pire sourd qu'un aveugle en colère

1 2