la fonction f1() appel f2() comment acceder aux variables de f1() depuis f2()

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : la fonction f1() appel f2() comment acceder aux variables de f1() depuis f2()

par dimalta5 » 18 déc. 2007, 17:29

Ironiquement c'est justement dans des classes que j'ai ce problème:

En général quand je dois réaliser un site en plusieurs langues j'utilise quelque chose dans ce genre:
<?php
define('LANG','en');

//include 'Lang/'.LANG.'.php'; (ligne commentée ici pour simplifier l'exemple)

//Exemple de contenu de 'Lang/'.LANG.'.php'
$L['Exemple de texte']='Sample text';
$L['Exemple de texte 2']='Sample text 2';
$L['Exemple de texte 3']='Sample text 3';

function l($t){
	global $L;return $L[$t];
}
?>
<html>
<body>
	<strong><u><?=l('Exemple de texte 3')?></u></strong>
</body>
</html>
(Je sais que gettext est mieux mais jusqu'ici ma fonction qui m'est plus simple à mettre ne place à toujours fait l'affaire)

Jusqu'ici tout va à peu près bien même si parfois ça devient un peu chargé parce qu'il faut écrire ça l('...') à la place de chaque texte, de toute façon ça reste normal, si on veut plusieurs langue c'est forcement un peu plus complexe qu'une seule.

Je trouve que ça reste acceptable puisque comme avec gettext le nom de la fonction est très court _() ou l() dans mon cas.

Donc où est le problème et quel est le rapport avec ma question de depart:

Dernièrement je devais programmer une classe générique permettant ajouter un espace membre à un site. Cette classe devait donc gérer en plus des sessions aussi l'affichage de quelques formulaires (inscription, login, mot de passe oublié, ...) et ça en autant de langue qu'on veut pour être vraiment générique.

Voila donc à peu près comment j'ai fait au niveau des langues:
<?php 
class Exemple{

	var $L;
	function Exemple($lang){
		
		//include dirname(__FILE__).'/Lang/'.$lang.'.php';	(ligne commentée ici pour simplifier l'exemple)
		
		//Exemple de contenu de dirname(__FILE__).'/Lang/'.$lang.'.php'
		$this->L=array(
			'Exemple de texte'=>'Sample text',
			'Exemple de texte 2'=>'Sample text 2',
			'Exemple de texte 3'=>'Sample text 3'
		);

	}

	function test(){
		return '
			<strong><u>'.$this->L['Exemple de texte 3'].'</u></strong>
		';
	}
}

$Exmpl = new Exemple('en');
echo $Exmpl->test();
?>
C'est bon ça marche ok, mais la où déja l(...) c'était pas très joli à regarder mais encore acceptable quand une partie du code est chargée en texte à traduire, ça par contre $this->L['Exemple de texte 3'] ça devient vraiment beaucoup plus moche parce que $this->L['...'] c'est long, c'est gros à cause du $this->.

C'est la toute la raison de ma question si j'avais pu dans une fonction l(...) accèder aux propriétés d'une classe sans avoir les passer en paramétre:

Le code aurait été celui-ci:
<?php 

function l($t){
	parent $L;return $L[$t]; //j'utilise encore ici parent pour marquer quelquechose (ça n'existe pas je suis d'accord)
}

class Exemple{

	var $L;
	function Exemple($lang){
		
		//include dirname(__FILE__).'/Lang/'.$lang.'.php';	(ligne commentée ici pour simplifier l'exemple)
		
		//Exemple de contenu de dirname(__FILE__).'/Lang/'.$lang.'.php'
		$this->L=array(
			'Exemple de texte'=>'Sample text',
			'Exemple de texte 2'=>'Sample text 2',
			'Exemple de texte 3'=>'Sample text 3'
		);

	}

	function test(){
		return '
			<strong><u>'.l('Exemple de texte 3').'</u></strong>
		';
	}
}

$Exmpl = new Exemple('en');
echo $Exmpl->test();
?>
ça resterait donc exactement aussi peut chargé que je le souhaite et que tout le monde pourrait le souhaiter je suppose dans ce genre de cas

J'ai pas mal recherché à l'époque si ça existait, sans résultat, je me suis dis que tout simplement ça n'existe pas et puis hier ça m'ai revenu à l'esprit donc je me suis dis que je pourrais quand même poser la question histoire d'être sûr.

Donc voila vous savez tout :)

(Une autre façon de faire pour y arriver est totalement la bienvenue)

Merci Beaucoup pour vos réponses

par Victor BRITO » 18 déc. 2007, 13:14

Victor, faute d'inattention je pense...

Il ne sert a rien de déclarer des propriétés dans la classe si ensuite, tu utilises des variables locales dans les méthodes... Je te laisse corriger ta classe en ajoutant les $this-> devant les variables.
C'est corrigé. :wink:

par Calimero » 18 déc. 2007, 10:42

Victor a cependant parfaitement raison de signaler que lorsqu'on a besoin d'une variable dans plusieurs fonctions, le choix de la POO se fait presque tout seul ;-) Un objet répondra parfaitement au besoin (Comme Hubert l'a souligné)

par titerm » 18 déc. 2007, 09:54

Victor, faute d'inattention je pense...

Il ne sert a rien de déclarer des propriétés dans la classe si ensuite, tu utilises des variables locales dans les méthodes... Je te laisse corriger ta classe en ajoutant les $this-> devant les variables.

Re: la fonction f1() appel f2() comment acceder aux variable

par Victor BRITO » 18 déc. 2007, 01:13

Essaie cette classe.
<?php
class Test
{
  public $var;
  public $parent;
  public function test ()
  {
    $this -> var = 'blabla';
    return $this -> var;
  }
  public function test2 ()
  {
    $this -> parent = test ();
    return $this -> parent;
  }
}
$test = new Test ();
echo $test -> test2 (); // Affiche blabla, en principe
?>

par dimalta5 » 18 déc. 2007, 00:52

Salut Sékiltoyai,

Ma question était juste de savoir si un mot clef de la sorte existe pour faire ça. Si il existait, il ne serait pas magique du tout, ce serait juste une expression utilisable du langage.

Je pense pas que ma question soit débile, ça pourrait exister, et le but du post n'était que de savoir si, effectivement, ça existe.

par naholyr » 18 déc. 2007, 00:02

ben non c pas "impossible" puisqu'avec global ça ce fait!

donc il pourrait exister un autre mot comme global mais qui se référé à l'environnement qui appel la fonction et pas à l'environnement global
Non, ce mot-clé n'existe pas.

Tu peux suivre les pistes indiquées par Hubert. A priori ce que tu cherches à faire ça s'appelle un paramètre, et donc ça doit être déclaré en tant que tel :)

par Sékiltoyai » 17 déc. 2007, 22:32

On te dit que c'est impossible, alors tu peux dire que ce n'est pas sympa, mais tu ne peux pas dire que c'est faux. Après tu peux atteindre un résultat équivalent en le programmant de manière plus explicite, mais il n'y a aucun mot clé magique qui te fera exactement ce que tu veux, sinon il faudrait prévoir ceci pour tout…

par dimalta5 » 17 déc. 2007, 21:58

ben non c pas "impossible" puisqu'avec global ça ce fait!

donc il pourrait exister un autre mot comme global mais qui se référé à l'environnement qui appel la fonction et pas à l'environnement global

par Hubert Roksor » 17 déc. 2007, 21:01

Ce que tu recherches est impossible, il est impossible pour une fonction d'accéder aux variables existant en dehors de son bloc.

Regarde peut-être du côté de la programmation objet, sinon passe ta variable à la fonction sous la forme d'un argument, tout simplement.

par dimalta5 » 17 déc. 2007, 20:09

oui effectivement ça ça marche mais hélas ce n'est pas ce que je cherche

enfait dans ce que tu me proposes c'est toujours à une variable globale qu'on accède moi je voudrais pouvoir accèder aux variables de la fonction (voir de la classe) qui appel ma fonction test2()

par jojolapine » 17 déc. 2007, 19:58

essaye ceci:
<?php
$var=null;
function test2(){
        global $var;
        echo $var;
}
function test(){
      $global $var;
      $var='balbla';
      test2();
}
test();
?> 
je pense que ça devrait marcher ;)

la fonction f1() appel f2() comment acceder aux variables de

par dimalta5 » 17 déc. 2007, 19:24

Bonjour,

Je suis à la recherche d'une façon de faire comme dans cet exemple:
<?php
$var='blabla';
function test(){
      global $var;
      echo $var;
}
test();
?>
qui affiche "blabla"

Mais pour accèder aux variables définies dans une fonction qui en appel une autre par exemple comme ça
(cet exemple ne marche pas c'est bien le problème et je marque "parent" juste pour écrire un mot un peu parlant) :
<?
function test2(){
        parent $var;
        echo $var;
}
function test(){
      $var='balbla';
      test2();
}
test();
?>
J'aimerai que cela affiche "blabla" aussi