μForum problème fopen()
class SaveObj{function saveObj() {}}}
Réponses apportées à cette discussion
Salut Arlibus,
la POO implique certains éléments à commencer par une compréhension minimum de son fonctionnement.
Prenons dont ton exemple de classe :
<?php class SaveObj { function saveObj() { { // Ici c'est la ligne 22 } } }
Première chjose, c'est du PHP et non du PHP5. Si tu te demandes à quoi je vois ça, c'est que tu es au début de ton apprentissage de la POO en PHP. À priori, je vais partir sur cette base donc.
Ici, le nom de la méthode (en POO on ne parle plus de fonctions mais de méthodes) est d'abord mal écrite : il s'agit du constructeur de la classe : en PHP 4, il doit avoir le même nom que la classe elle même : ça veut dire qu'il faut également respecter la casse et on devrait donc écrire « SaveObj » et non « saveObj ».
Le constructeur, c'est la méthode qui est appelée lorsque tu crée une instance d'une classe. Donc ici, si tu fais
$monobjet = new SaveObj();
C'est cette méthode qui sera exécutée en premier. Si elle attend des paramètres, il faudra bien entendu les fournir dans l'appel.
Ton problème maintenant : si on observe le code de la méthode, on voit qu'il doit y avoir l'ouverture d'un fichier dont le nom est dans une des propriétés de l'instance : $this->name : là, soit le code que tu montres est incomplet, soit cette propriété n'est initialisée nulle part. Donc, c'est comme si tu écrivais $fp = fopen('', "w"); Et il manque donc une valeur pour le premier paramètre.
Je te laisse réfléchir un moment sur ce problème, si tu es un peu logique, tu devrais rapidement trouver la réponse tout seul ;)
Ben on va être logique alors ^^ .
C'est pas moi qui est fait le script, celui-ci fait prêt de 64ko, j'ai pas vraiment le temps de lire un livre en PHP alors je fait ça:
Comme ça paff ! Plus de warning !
De toute façon, le warning ça n'altère pas le fonctionnement du script il me semble ?
Ben j'ai pas de compliments à te faire sur ce point : c'est la pire manière de travailler.Ce n'est pas parce que tu masque un message d'erreur que ça fonctionne mieux.
J'ajoute que si tu fais ça systématiquement, je ne t'aiderai plus : je ne vais pas perdre mon temps si tu privilégies la quantité à la qualité et qu'au final tu fais déboguer ton code par les autres sans te préoccuper réellement de savoir si c'est du code valable ou pas.
Et puis un code de 64Ko, c'est quand même pas la mort d'en faire le tour, faut pas charrier.
Oui, mais ça fait depuis 2 jours que je cherche et j'ai rien trouvé .. Donc que faire ?
J'essais de trouver des solutions, mais je ne les trouve pas, alors je demande. Et de plus, en quoi c'est du travail mal fait ? Le warning signifie qu'il y a un avertissement. Mais j'ai lu que ce n'était pas grave et qu'on pouvait faire error_reporting(0); .
Alors je le fait . Désolé, je savais pas que c'était du travail baclé .
Ok, j'ai compris pourquoi c'était pas bon de faire comme j'ai fait. Je veux bien trouver la solution. Donc "name" c'est le nom du fichier à éditer ou alors un "element" du code ? (ou alors autre chose ..)
Un principe de base en programmation, tous langages confondus : on ne masque pas les erreurs, on les corrige. Mettre le reporting sur OFF, c'est simplement masquer l'affichage des erreurs de fonctionnement, ça ne corrige rien du tout. On configure de cette manière les serveurs de production pour ne pas affoler les internautes lambdas qui fuiraient à la course en voyant ces trucs qu'ils ne comprendraient pas. Par contre en mode développement, on doit tout afficher, erreurs, notices et warnings et on doit les corriger.Pour corriger ça, il faut aussi savoir que l'erreur existe. Si tu ouvres un fichier inexistant en masquant les erreurs, tu ne comprendras pas aussi facilement la source de l'erreur si rien n'est affiché mais que ton fichier n'est pas modifié.
Là, tu as un message qui t'indique qu'il manque un paramètre : est-ce que tu ne crois pas que c'est quand même plus simple de corriger ça ?
Autre principe de base à conserver : une question bien posée, c'est un problème bien compris, ça représente les 3/4 de la réponse. Si tu masques les erreurs, tu risques fort de ne jamais comprendre convenablement la nature réelle du problème, tu ne pourras donc jamais poser la bonne question, même avec la meilleure volonté du monde. Tu n'obtiendras donc jamais la bonne réponse bien entendu.
Reprenons ta classe : quelque part, il devrait y avoir :
$this->name = 'une valeur quelconque';
Mais il faut que cette valeur soit initialisée soit lors de la création de la propriété soit dans le constructeur. Est-ce que tu as quelque chose comme ça dans ce code ?
O-K : ça efface aussi les messages d'erreur plus important. Mais de toute façon j'ai un fichier texte qui m'affiche dans le dossier du script tous les messages d'erreur . Donc je peux très bien les masquer, et en cas de gros problème je consulte .
(je sais pas, mais je demande, je ne cherche qu'à savoir si c'est une possibilité) .
Mes fichiers texte sont des fichiers "error_log" . Ils présentent les erreurs comme ça:
[26-Jun-2010 06:09:49] PHP Parse error: syntax error, unexpected '<' in /home/xxxxx/public_html/load.php on line 162
[26-Jun-2010 06:09:50] PHP Parse error: syntax error, unexpected '<' in /home/xxxxx/public_html/load.php on line 162
Fais donc voir le code complet de ta classe si tu veux une piste, j'aurai du mal à te répondre en tentant de deviner quoi que ce soit.
Et au passage, il y a ici un tutoriel que tu devrais lire en détails : http://www.apprendre-php.com/tutoriels/tutoriel-29-les-classes-et-objets.html
Mais le code complet de la classe SaveObj, je te l'ai déja donné en entier en amont . Autrement, si tu parle du code complet (le code en entier), je peux pas le mettre, il est trop lourd. Mais tu peux le télécharger ici: http://scripts.toocharger.com/fiches/scripts/uforum/3371.htm .
C'est un seul fichier PHP .
Ok, alors effectivement, ça se comrpend mieux, mais là, si tu n,as aucune notion en POO, ça va être long à expliquer et je n,ai pas trop le temps. Mais sommairement, cette classe n,est jamais utilisée directement, elle est étendue et la propriété « name » est définie dans les classes étendues.
Si tu fais ça pour apprendre à programmer en PHP, tu vas patauger pas mal usqu'à en être écoeuré et finir par lâcher définitivement la programmation : je ne saurais trop te recommander de construire toi-même ton propre système, c'est beaucoup plus long bien entendu que d'utiliser un script tout fait, mais c'est mille fois plus formateur. Analyse ton besoin et conçois ton propre code, ce sera beaucoup plus rapide de t'aider quand tu as des choix difficiles à faire que de plonger dans du code tout prêt mais plus ou moins bien fait.
Là, je ne pourrai pas t'aider sur le µforum, il me faudrait quelques heures d'analyse pour trouver éventuellement le bobo.
d'accord, merci quand même pour ton investissement
