Formulaire avec OOP

ViPHP
AB
ViPHP | 5818 Messages

16 avr. 2011, 17:11

Quand on fait $this->var = $var; c'est pour définir une variable "globale interne à la classe" (on y aura accès depuis n'importe qu'elle fonction de la classe en faisant $this->var). $var quant à elle est une variable classique, la plupart du temps issue d'un paramètre d'une fonction.
<?php
class Affiche_var
{

private $var = 10;

	public function modif_var($var)
	{
		$this->var = $var;
	}
	
	public function affiche()
	{
		echo $this->var;
	}
}

$init = new Affiche_var;
$init->	affiche();	
echo '<br />';
$init->	modif_var('20');
$init->	affiche();
?>
Evidemment c'est pareil que
<?php
class Affiche_var
{

private $var = 10;

	public function modif_var($toto)
	{
		$this->var = $toto;
	}
	
	public function affiche()
	{
		echo $this->var;
	}
}

$init = new Affiche_var;
$init->	affiche();	
echo '<br />';
$init->	modif_var('20');
$init->	affiche();
?>

rimie1
Invité n'ayant pas de compte PHPfrance

16 avr. 2011, 17:26

Est-ce qu'une fonction publique s'exécute automatiquement lors de l'instanciation de la classe ?
le probleme je n'ai pas encore compris le role de construct, alors que je vois qu'elle a le meme role qu'une fonction normale:
public function nomMethode()
{

}
==
public function __construct()
{

}

ViPHP
AB
ViPHP | 5818 Messages

16 avr. 2011, 18:00

Mais une fonction normale ne s'exécute pas automatiquement lors de l'intanciation de la classe !
Comment faut-il te le dire :?:

rimie1
Invité n'ayant pas de compte PHPfrance

17 avr. 2011, 03:14

Mais une fonction normale ne s'exécute pas automatiquement lors de l'intanciation de la classe !
Comment faut-il te le dire :?:
Ce que j'ai retenu c'est que les 2 fonctions ont le meme role!!!

seulement la facon d'afficher le resultat de chacune est different, par exemple dans mon code:
class formulaire {

public final function __construct($name, $method='', $action='', $enctype='') {
//code
}

public final function addInput($type, $name='', $value='', $size='', $maxlength='', $checked=''){
//code
}
}// fin de la class

$frm1 = new formulaire('monForm1', '', '', ''); // imprimer l'entête du formulaire (name, method, action)
$frm1->addInput('text', 'nomtext'); // champ text
pour construct on fait new nomClass et pour la function nomMethode on fait $var->nomMethode :(

ViPHP
AB
ViPHP | 5818 Messages

17 avr. 2011, 18:13

Si tu veux dire qu'elles ont le même rôle parce que ce sont toutes les deux des fonctions et que l'on peut leur faire faire ce que l'on veut, alors oui elles ont le même "rôle" : celui d'exécuter des instructions.

Mais la fonction constructeur sera déclenchée dès que l'on instancie la classe, alors qu'il faudra appeler les autres.

Tu n'es pas obligé d'avoir une fonction constructeur dans une classe, c'est une option. Cela sert quand il faut faire une action systématique, une routine avant de se servir de la classe (d'où le mot constructeur :wink: ) .

Par exemple si tu veux travailler sur un fichier texte, dans tous les cas il faudra ouvrir ce fichier texte et on peut donc mettre (si l'on veut faire ainsi) l'adresse du fichier en paramètre dans le constructeur.
class Fichier {

var fich_content;

public function __construct($fichier) 
{
if (is_file($fichier))
$this->fich_content = file_get_contents($fichier);
else
exit("ce fichier n'existe pas à l'adresse indiquée");
}

public function recherche($string) 
{
return strpos($this->fich_content,$string);
}

public function taille($encodage) 
{
return mb_strlen($this->fich_content,$encodage);
}

}

$fich = new Fichier('document/toto.txt');

$nb_caractres = $fich->taille('utf-8');

$motif = 'titi';
$position_motif = $fich->recherche($motif);

if ($position_motif !== false) echo 'le fichier comprend '.$nb_caractres.' caractères et le mot '.$motif.' a été trouvé en '.$position_motif.' position';

rimie1
Invité n'ayant pas de compte PHPfrance

18 avr. 2011, 00:53

en premier lieu j'ai mal compris sa fonction, je l'ai souvent vu comme premiere fonction de la class, alors j'ai cru qu'il faut toujours l'executer avant d'etablir d'autres fonctions, cela dit, d'apres votre explication, qu'on l'utilise pour des raisons routine, par exemple, un formulaire, il faut toujours commencer par <form...> et les autres champs (input, checkbox,..), le constructeur instancie la class, par defaut il faut lancer <form..> avant de construire les autres champs, aussi pour la connexion,.. ainsid e suite, j'espere que j'ai bien compris la difference, merci AB, je vais continuer mon travail sur le formulaire :) =D>

rimie1
Invité n'ayant pas de compte PHPfrance

18 avr. 2011, 05:24

rebonjour,

j'avance un petit peu comme une tortue, j'aimerais l'ameliorer au niveau de control des erreurs, par exemple ajouter le champs enctype au niveau de l'entete du formulaire:
public final function __construct($name, $method='', $action='', $enctype='') {
// l'entete du formulaire
// je verifie si enctype est la
		if($enctype)
		{
			$form = '<form name="'.$name.'" method="'.$method.'" action="'.$action.'" '.$enctype.'>';	
		}
		else // sinon pas la peine
		{
			$form = '<form name="'.$name.'" method="'.$method.'" action="'.$action.'">';
		}
		echo $form; // on affiche le formulaire

//code
}

public final function addInput($type, $name='', $value='', $size='', $maxlength='', $checked=''){
// ici je controle les champs:

switch($type)
	{
case 'password':
		echo '<input type="'.$type.'" name="'.$name.'" value="'.$value.'" size="'.$size.'" maxlength="'		.$maxlength.'" id="'.$id.'" class="'.$class.'" />';
		break;
case 'file':
		echo '<input type="'.$type.'" name="'.$name.'" />';
  		break;
}

// si vous remarquiez le champs 'file' il faut ajouter au form l'attribut enctype 'ENCTYPE="multipart/form-data"', alors je fais une verification:

if(empty($name))
		{
			$this->error[] = '<li>Input nom vide</li>';
			return false;
		}
	
		if($type == 'file')
		{
			$this->error[] = '<li>il existe un file</li>';
			return false;
		}

//code
}
Je voudrais pas afficher le message d'erreur 'il existe un file', mais de changer $form au constructeur vers celle qui comporte $enctype:
			$form = '<form name="'.$name.'" method="'.$method.'" action="'.$action.'" '.$enctype.'>';	
j'aurais le code ci-dessus automatique apres l'ajout d'un champs file:
<?php
$frm1 = new formulaire('monForm1', '', '', ''); // imprimer l'entête du formulaire (name, method, action)
$frm1->addInput('text', 'nomtext'); // champ text
$frm1->separation();
############## ici je l'ajoute donc il faut avoir un formulaire avec enctype
$frm1->addInput('file', 'nomFile', 'valeur'); // file upload
?>
merci

emporbappet
Invité n'ayant pas de compte PHPfrance

28 juil. 2011, 01:32

tres interessant, merci