[php] samengestelde naam van een variabele

Pagina: 1
Acties:
  • 283 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 51964

Topicstarter
ik heb de volgende situatie:

PHP:
1
2
3
4
$eng_titel="engelse titel";
$dui_titel="duitse titel";

$taal="eng" of "dui"


nu wil ik aan de hand van de taal variabele 1 vd 2 titels printen, natuurlijk kan dit met een if loopje ofzo maar het moet toch ook gewoon kunnen door de naam van de variabele op de juiste manier te declareren, dit lukt mij echter niet
iemand een idee?

voorbeelden:
PHP:
1
2
echo $taal.'_titel';
echo $.'$taal'._titel;


zoiets moet het dus worden, maar dan werkend...

Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Ik zou het anders doen
PHP:
1
2
3
4
$titel["eng"]="engelse titel";
$titel["dui"]="duitste titel";

print ($titel["$taal"]);

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 08:59

Knutselsmurf

LED's make things better

Je zou eens naar arrays kunnen kijken.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 25-04 16:24

Zyppora

155/50 Warlock

Je kunt ook eens kijken naar variabele variabelen:

PHP:
1
2
3
4
5
6
7
8
9
<?
$eng_titel="engelse titel";
$dui_titel="duitse titel";

// $taal="eng" of "dui"

$titel = $taal . "_titel";
echo $$titel;
?>


De variabele $titel wordt 'eng_titel' of 'dui_titel', waarna de eerste $ voor deze string gezet wordt, dus: $eng_titel of $dui_titel.

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:05

Cyphax

Moderator LNX
Zyppora schreef op maandag 29 mei 2006 @ 13:53:
Je kunt ook eens kijken naar variabele variabelen:

PHP:
1
2
3
4
5
6
7
8
9
<?
$eng_titel="engelse titel";
$dui_titel="duitse titel";

// $taal="eng" of "dui"

$titel = $taal . "_titel";
echo $$titel;
?>


De variabele $titel wordt 'eng_titel' of 'dui_titel', waarna de eerste $ voor deze string gezet wordt, dus: $eng_titel of $dui_titel.
Dan is het toch verstandiger om te werken met arrays zoals The-Rookie voorstelt. Al was het maar omdat het variabele variabelen voor zoiets gewoonweg ranzig zijn. :)
Als het nou om meer gaat dan de titel alleen zou je er nog een dimensie aan kunnen plakken of wat meer OO gaan en er een klasse van maken ofzo.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 25-04 16:24

Zyppora

155/50 Warlock

Cyphax schreef op maandag 29 mei 2006 @ 13:55:
[...]

Dan is het toch verstandiger om te werken met arrays zoals The-Rookie voorstelt. Al was het maar omdat het variabele variabelen voor zoiets gewoonweg ranzig zijn. :)
Als het nou om meer gaat dan de titel alleen zou je er nog een dimensie aan kunnen plakken of wat meer OO gaan en er een klasse van maken ofzo.
Variabele variabelen -> ranzig. Weer wat geleerd :) Bedankt!

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Acties:
  • 0 Henk 'm!

  • smokalot
  • Registratie: Juni 2001
  • Laatst online: 25-05 17:57

smokalot

titel onder

Zyppora schreef op maandag 29 mei 2006 @ 14:11:
[...]


Variabele variabelen -> ranzig. Weer wat geleerd :) Bedankt!
en gevaarlijk

It sounds like it could be either bad hardware or software


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:05

Cyphax

Moderator LNX
Zyppora schreef op maandag 29 mei 2006 @ 14:11:
[...]


Variabele variabelen -> ranzig. Weer wat geleerd :) Bedankt!
En heel slecht te onderhouden (ik moet er niet aan denken om code te moeten debuggen met variabele variabelen). :)

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 25-04 16:24

Zyppora

155/50 Warlock

Cyphax schreef op maandag 29 mei 2006 @ 14:23:
[...]

En heel slecht te onderhouden (ik moet er niet aan denken om code te moeten debuggen met variabele variabelen). :)
Ik gebruik het verder ook alleen bij 'very local code', zodat ik geen if constructs hoef te gebruiken. Of het gevaarlijk is weet ik niet (is het ook gevaarlijk wanneer ik hiermee geen user input verwerk?).

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Acties:
  • 0 Henk 'm!

  • Rowdy.nl
  • Registratie: Juni 2003
  • Laatst online: 10-06 09:17

Rowdy.nl

Koekje d'r bij?

Cyphax schreef op maandag 29 mei 2006 @ 14:23:
[...]

En heel slecht te onderhouden (ik moet er niet aan denken om code te moeten debuggen met variabele variabelen). :)
Nog erger; laat iemand anders eens proberen die code aan te laten passen... ;)

Rowdy.nl - X++ by day. C# by night. I drink coffee in the morning and beer in the evening.


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:05

Cyphax

Moderator LNX
Zyppora schreef op maandag 29 mei 2006 @ 14:30:
[...]


Ik gebruik het verder ook alleen bij 'very local code', zodat ik geen if constructs hoef te gebruiken. Of het gevaarlijk is weet ik niet (is het ook gevaarlijk wanneer ik hiermee geen user input verwerk?).
Of het echt gevaarlijk is... mja ik weet het niet, dat zou goed kunnen. Maar het is gewoon geen goede gewoonte. Leer jezelf aan om consistent te zijn, daar heb je op den duur alleen maar profijt van. En zeker als een ander je code moet bijwerken spaar je die figuur een acute aanval van migraineaanval uit :+

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Netzoals bij eval zijn ze perfect te gebruiken; maar alleen als je er verstand van hebt; anders stimuleert het slechts ranzig programmeren :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 11:35

DexterDee

I doubt, therefore I might be

Ik heb redelijk wat ervaring met multi-language PHP websites. Ik zou het grofweg op de volgende manier oplossen:

index.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
/**
Hoofdscript gebruikmakend van taalafhankelijke variabelen
*/

// haal de language= parameter op uit de url, bestaat deze niet, dan standaard engels
$language = isset($_GET['language']) ? $_GET['language'] : 'english';

// haal de taalspecifieke php op met vertalingen
require("includes/language/{$language}/lang_main.php") or die('Gekozen taal bestaat niet!');

echo $lang['title'];
echo $lang['summary'];


includes/languages/dutch/lang_main.php
PHP:
1
2
3
4
5
/**
Nederlandse taal variabelen
**/
$lang['title']='Dit is mijn titel';
$lang['summary']='Samenvatting';


includes/languages/english/lang_main.php
PHP:
1
2
3
4
5
/**
Engelse taal variabelen
**/
$lang['title']='This is my title';
$lang['summary']='Summary';


includes/languages/german/lang_main.php
PHP:
1
2
3
4
5
/**
Duitse taal variabelen
**/
$lang['title']='Dieses ist meine Titel';
$lang['summary']='Zusammenfassung';


includes/languages/french/lang_main.php
PHP:
1
2
3
4
5
/**
Franse taal variabelen
**/
$lang['title']='C\'est mon titre';
$lang['summary']='Sommaire';


oproepen met:
index.php?language=dutch
index.php?language=english
index.php?language=german
index.php?language=french


of gewoon:
index.php

Lijst met talen kun je eventueel in een arraytje zetten. geselecteerde taal hoeft natuurlijk niet in de URL, maar kan ook via een cookie of elk ander vrij te kiezen mechanisme. Dit is slechts ter voorbeeld.

Een taal erbij is een peulenschil. Gewoon in je includes/languages/ folder een nieuwe taal folder maken, PHP bestand(en) kopieren van een bestaande taal folder en aanpassen (vertalen) naar de nieuwe taal.

Als je site heel groot wordt, kun je naast lang_main.php nog specifiekere lang_* php's maken. Deze kun je dan selectief includen, zodat het allemaal snel en overzichtelijk blijft.

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Je kan ook gettext gebruiken; dat is er voor bedoelt (ook al werkt het niet verschrikkelijk prettig) ;)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

PHP:
1
echo ${$taal . '_titel'}

Dit is de manier om het te doen zonder hulpvariabelen. Maar zoals al opgemerkt is dit niet een situatie die geeigend is voor het gebruik van variabele variabelennamen.

Acties:
  • 0 Henk 'm!

  • cannibal
  • Registratie: Maart 2001
  • Laatst online: 12-06 14:08
Ik zou ook, zoals DexterDee al melde, voor een resources bestand gaan en op basis van uitgelezen taal dit bestand includen.
Of je een array daar in stopt of gewoon variabelen ($taal_titel) maakt dan verder niet zou uit. Maar het scheelt je om in alle code van die variabele variabelen te gebruiken, maar gewoon 1 variabele welke afhankelijk van de taal een andere waarde krijgt.

[ Voor 4% gewijzigd door cannibal op 29-05-2006 16:28 ]


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 11:35

DexterDee

I doubt, therefore I might be

cannibal74 schreef op maandag 29 mei 2006 @ 16:28:
Ik zou ook, zoals DexterDee al melde, voor een resources bestand gaan en op basis van uitgelezen taal dit bestand includen.
Of je een array daar in stopt of gewoon variabelen ($taal_titel) maakt dan verder niet zou uit. Maar het scheelt je om in alle code van die variabele variabelen te gebruiken, maar gewoon 1 variabele welke afhankelijk van de taal een andere waarde krijgt.
Het kan wel degelijk iets uitmaken om arrays te gebruiken als je bijvoorbeeld een templating systeem als Smarty gebruikt.

pak bijv. de volgende resource:
PHP:
1
2
3
4
$lang['buttons']['previous']='vorige';
$lang['buttons']['next']='volgende';
$lang['buttons']['continue']='verder';
$lang['buttons']['cancel']='annuleren';


In smarty moet je een variabele doorgeven:
PHP:
1
$smarty->assign('buttons', $lang['buttons']);


En in je template file kun je het dan als volgt gebruiken:
HTML:
1
2
3
4
<a href="test.php" class="button">{$button.previous}</a>
<a href="test.php" class="button">{$button.next}</a>
<a href="test.php" class="button">{$button.continue}</a>
<a href="test.php" class="button">{$button.cancel}</a>

Een array scheelt je de declaratie van elke individuele button in Smarty :Y)

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 10-06 18:45
DexterDee schreef op maandag 29 mei 2006 @ 14:58:
index.php
PHP:
1
2
3
4
5
// haal de language= parameter op uit de url, bestaat deze niet, dan standaard engels
$language = isset($_GET['language']) ? $_GET['language'] : 'english';

// haal de taalspecifieke php op met vertalingen
require("includes/language/{$language}/lang_main.php") or die('Gekozen taal bestaat niet!');
Rechtstreeks een externe var in je path, lekker veilig is dat. En nog bijna variablen in variablen, in dit geval variablen in strings ook. :'(

[ Voor 22% gewijzigd door djluc op 30-05-2006 00:18 ]


Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 12-06 08:14

Tjark

DON'T PANIC

Waarom in een array met "$lang['title']=" ?
Ik zou DEFINE's gebruiken, zeker als er veel taaldingen zijn. Een arraystructuur neemt meer ruimte in dan DEFINE constanten

(afaik, cmiir)

*insert signature here


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 10-06 18:45
Handig voor smarty om alles door te geven... Als je dat niet gebruikt zou ik altijd een functie maken die je aanroept. Die kan dan gerust uit zo'n array de data halen maar het maakt je flexibeler. Bijvoorbeeld: wat te doen als een vertaling niet bestaat, dan de engelse weergeven, misschien niets, of voor debuggen juist 100-uitroeptekens?

Acties:
  • 0 Henk 'm!

  • plakbandrol
  • Registratie: Juni 2002
  • Laatst online: 10:21
DexterDee schreef op maandag 29 mei 2006 @ 14:58:
Ik heb redelijk wat ervaring met multi-language PHP websites. Ik zou het grofweg op de volgende manier oplossen:

index.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
/**
Hoofdscript gebruikmakend van taalafhankelijke variabelen
*/

// haal de language= parameter op uit de url, bestaat deze niet, dan standaard engels
$language = isset($_GET['language']) ? $_GET['language'] : 'english';

// haal de taalspecifieke php op met vertalingen
require("includes/language/{$language}/lang_main.php") or die('Gekozen taal bestaat niet!');

echo $lang['title'];
echo $lang['summary'];
[..]
waarvoor zijn die brackets in je require? voegen die nog iets toe?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

DexterDee schreef op maandag 29 mei 2006 @ 14:58:
PHP:
1
2
// haal de taalspecifieke php op met vertalingen
require("includes/language/{$language}/lang_main.php") or die('Gekozen taal bestaat niet!');
Hee, leuk. Ik roep de pagina wel aan met als language "../../../etc/shadow?". :P
plakbandrol schreef op dinsdag 30 mei 2006 @ 00:45:
waarvoor zijn die brackets in je require? voegen die nog iets toe?
Duidelijkheid, voor zover dat mogelijk is bij dit soort notaties.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Die voegen niets toe. Het ziet er alleen wat netter uit omdat je verder ook nauwelijks keywords gebruikt in php. Nu lijkt het gewoon een normale functie :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

eamelink schreef op dinsdag 30 mei 2006 @ 00:51:
Die voegen niets toe. Het ziet er alleen wat netter uit omdat je verder ook nauwelijks keywords gebruikt in php. Nu lijkt het gewoon een normale functie :)
Ik denk dat plakbandrol doelt op {$language}. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • plakbandrol
  • Registratie: Juni 2002
  • Laatst online: 10:21
eamelink schreef op dinsdag 30 mei 2006 @ 00:51:
Die voegen niets toe. Het ziet er alleen wat netter uit omdat je verder ook nauwelijks keywords gebruikt in php. Nu lijkt het gewoon een normale functie :)
ah leuk om te weten.. want als ik een variabele wil gebruiken om bijvoorbeeld "test_1" te schrijven deed ik altijd

$var = "test";
echo "$var"."_1";

maar dat kan mooier door

$var = "test";
echo "{$var}_1";

[ Voor 9% gewijzigd door plakbandrol op 30-05-2006 00:58 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Dan nog blijft bij mij de vraag bestaan waarom je je tekst in alle talen zou willen definiëren? Weet je wat dat doet met de geheugenruimte van je server als de pagina 100 keer per seconde wordt opgevraagd, en je misschien wel 10 KB aan declaraties hebt voor ieder van je 4 talen?

Het lijkt peanuts, maar dat is het niet.

Ik zou gewoon voor iedere taal een apart bestand creëren, en dan definiëren zoals hier reeds geopperd wordt. En dan middels sessie- of GET-variabelen bepalen welk taalbestand geladen wordt.

Ook snap ik nu niet waarom je in je variabelenaam zou willen weten in welke taal de inhoud van die variabele is, codeertechnisch gezien heb je daar vrij weinig aan aangezien de eerdergenoemde 'variabele variabelenamen'-techniek vrij ranzig is.
Cyphax schreef op dinsdag 30 mei 2006 @ 01:02:
Of nog mooier gewoon echo $var . "_1";
:? Dan krijg je bij ($var == "hoi") de uitvoer "hoi_1" te zien...

[ Voor 30% gewijzigd door CodeCaster op 30-05-2006 01:03 ]

https://oneerlijkewoz.nl
Het ergste moet nog komen / Het leven is een straf / Een uitgestrekte kwelling van de wieg tot aan het graf


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:05

Cyphax

Moderator LNX
Of nog mooier gewoon echo $var . "_1";

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

CodeCaster schreef op dinsdag 30 mei 2006 @ 01:01:
:? Dan krijg je bij ($var == "hoi") de uitvoer "hoi_1" te zien...
Bij dit niet dan?
PHP:
1
2
$var = "hoi";
echo "{$var}_1";

* NMe met Cyphax.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 11:35

DexterDee

I doubt, therefore I might be

-NMe- schreef op dinsdag 30 mei 2006 @ 00:49:
[...]

Hee, leuk. Ik roep de pagina wel aan met als language "../../../etc/shadow?". :P
Dan wordt het bestand "includes/language/../../../etc/shadow?/lang_main.php" included. En dat gaat dus fout, want dat vraagteken werkt alleen in de querystring, niet in een include om een filepath af te breken ;)

...Maar point made, het is natuurlijk niet zo netjes om meteen een variabele uit de querystring in een include te gebruiken. Had ik ffies niet bij nagedacht toen ik snel een voorbeeldje uit mijn hoofd had ingetikt :P

Ik gebruik het meestal met een dropdown combo op de site die dan een cookie zet. De alias values van de dropdown combo zet ik dan in de PHP code om naar de padnaam. Injectie van een custom string in het include pad is dan onmogelijk :)

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

-NMe- schreef op dinsdag 30 mei 2006 @ 00:58:
[...]

Ik denk dat plakbandrol doelt op {$language}. :P
Owhhhja, die. Die hebben wel degelijk een functie; namelijk om aan te geven wat er nog variabele is.

PHP:
1
2
3
4
5
6
7
<?php
$a = 'x';
$aa = 'y';
echo "$aa";     // y
echo "${aa}";   // y
echo "${a}a";   // xa
?>

PHP matchet de langst mogelijke variabelenaam. Maar in het voorbeeld dat gegeven was maakt het inderdaad niet uit omdat er toch geen slashes in een variabelenaam mogen zitten :)

De brackets zal je bij strings normaliter niet gebruiken; als je object membervariabelen in een string wil stoppen zijn ze wel handig. Al moet ik zeggen dat ik het zeer zelden gebruik, en vrijwel altijd gewoon aan het concatenaten sla.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

-NMe- schreef op dinsdag 30 mei 2006 @ 01:06:
[...]

Bij dit niet dan?
PHP:
1
2
$var = "hoi";
echo "{$var}_1";

* CodeCaster met Cyphax.
Oh, Cyphax reageerde op plakbandrol 8)7

https://oneerlijkewoz.nl
Het ergste moet nog komen / Het leven is een straf / Een uitgestrekte kwelling van de wieg tot aan het graf


Acties:
  • 0 Henk 'm!

Anoniem: 51964

Topicstarter
ik moet zeggen dat het maar ging om een paar woorden, maar met oog op de toekomst heb ik besloten om voor een variant op de manier van dexterdee te kiezen!

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 09:05

Cyphax

Moderator LNX
CodeCaster schreef op dinsdag 30 mei 2006 @ 01:16:
[...]

Oh, Cyphax reageerde op plakbandrol 8)7
Ja jij kroop er net voor. :+
Anoniem: 51964 schreef op dinsdag 30 mei 2006 @ 09:43:
ik moet zeggen dat het maar ging om een paar woorden, maar met oog op de toekomst heb ik besloten om voor een variant op de manier van dexterdee te kiezen!
Dat is natuurlijk het verstandigst, vooruit denken. :)
Hoe heb je het nu gedaan dan?

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

Anoniem: 51964

Topicstarter
zelfde manier grofweg, maar alleen aparte bestanden per taal, niet ook nog een dir etc, zo groot wordt de applicatie niet dat dat nodig is :)
Pagina: 1