[PHP] Vraag over variabelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Kon geen beknopte beschrijving verzinnen, vandaar de vage topictitel.

code:
1
2
3
4
5
6
7
8
9
<?

$firstname = 'John';
$fullname = $firstname.' '.$lastname;
$lastname = 'Doe';

echo $fullname;

?>


Is het mogelijk om de volledige naam correct te echo'en terwijl de huidige volgorde van definieren van variabelen ongewijzigd blijft?

Ben namelijk bezig een pagina vertaalbaar te maken d.m.v. een extern bestand waarin alle tekst opgeslagen is in variabelen. In de ene taal is de woordvolgorde anders dan in de andere, en wanneer ik om die reden een variabele die in de pagina zelf pas gedefinieerd wordt meekopieer naar het externe bestand stuit ik op problemen.

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Nee, PHP kan immers niet ruiken dat jij later pas een waarde aan de variabele gaat geven. :) Je krijgt trouwens een warning op deze code, want je probeert een niet geïnitialiseerde variabele te gebruiken.

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Bitage
  • Registratie: April 2006
  • Laatst online: 19-05-2024
Nee, op het moment dat $lastname aangeroepen wordt, bestaat deze nog niet en er wordt dus niets (NULL) in $fullname ingevoegd.

Wat je wel zou kunnen doen, is pas $fullname maken, wanneer je hem echoed, dus
PHP:
1
2
3
4
$firstname = 'John';
$lastname = 'Doe';

echo $firstname." ".$lastname;

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
In de ene taal is de woordvolgorde anders dan in de andere, en wanneer ik om die reden een variabele die in de pagina zelf pas gedefinieerd wordt meekopieer naar het externe bestand stuit ik op problemen.
Hrm, in zo'n geval zou je met specifieke taal-strings moeten werken waarin je op een bepaald punt aangeeft van 'hier moet woord X', ipv een vaste variabele.

Zo gebruik ik een systeem wat gebruik maakt van getallen tussen haakjes om woorden aan te geven:

code:
1
errors.emailInUse=The email {0} is already in use.


code:
1
errors.emailInUse=Het e-mail adres {0} is al in gebruik


Door zo'n methode haal je de woordvolgorde geheel uit je programmacode weg. Het is in PHP niet zo moeilijk om zelf zo'n systeem te implementeren, en ik ben er vrij zeker van dat er al pakketten zijn die dit probleem voor je oplossen.

(om nog even uit te wijden op het voorbeeld: als je een {0} en een {1} heb kun je ze gewoon omdraaien qua volgorde: de 0 wordt vervangen door het 0-e argument bij de aanroep naar het taalbestand, de 1 met het 1-e)

[ Voor 10% gewijzigd door YopY op 23-11-2007 16:23 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bitage schreef op vrijdag 23 november 2007 @ 16:18:
Nee, op het moment dat $lastname aangeroepen wordt, bestaat deze nog niet en er wordt dus niets (NULL) in $fullname ingevoegd.

Wat je wel zou kunnen doen, is pas $fullname maken, wanneer je hem echoed, dus
PHP:
1
2
3
4
$firstname = 'John';
$lastname = 'Doe';

echo $firstname." ".$lastname;
Zo zou het inderdaad werken, maar het is helaas geen optie.

Dit is namelijk een simpele weergave van het probleem dat ik heb. Het probleem is dat $fullname helemaal aan het begin gedefinieerd wordt wanneer ik mijn taal bestand met variabelen include. Die optie gaat dus niet werken.

[ Voor 43% gewijzigd door Verwijderd op 23-11-2007 16:23 ]


Acties:
  • 0 Henk 'm!

  • Bitage
  • Registratie: April 2006
  • Laatst online: 19-05-2024
Verwijderd schreef op vrijdag 23 november 2007 @ 16:23:
[...]


Zo zou het inderdaad werken, maar het is helaas geen optie.

Dit is namelijk een simpele weergave van het probleem dat ik heb. Het probleem is dat $fullname helemaal aan het begin gedefinieerd wordt wanneer ik mijn taal bestand met variabelen include. Die optie gaat dus niet werken.
Errm, dan gewoon $fullname uit die include slopen en pas defineren als je hem daardwerkelijk nodig hebt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bitage schreef op vrijdag 23 november 2007 @ 16:26:
[...]

Errm, dan gewoon $fullname uit die include slopen en pas defineren als je hem daardwerkelijk nodig hebt?
En dan is het hele idee van een gemakkelijk vertaalbaar extern bestand met alle tekst verdwenen :)
YopY schreef op vrijdag 23 november 2007 @ 16:22:
[...]


Hrm, in zo'n geval zou je met specifieke taal-strings moeten werken waarin je op een bepaald punt aangeeft van 'hier moet woord X', ipv een vaste variabele.

Zo gebruik ik een systeem wat gebruik maakt van getallen tussen haakjes om woorden aan te geven:

code:
1
errors.emailInUse=The email {0} is already in use.


code:
1
errors.emailInUse=Het e-mail adres {0} is al in gebruik


Door zo'n methode haal je de woordvolgorde geheel uit je programmacode weg. Het is in PHP niet zo moeilijk om zelf zo'n systeem te implementeren, en ik ben er vrij zeker van dat er al pakketten zijn die dit probleem voor je oplossen.

(om nog even uit te wijden op het voorbeeld: als je een {0} en een {1} heb kun je ze gewoon omdraaien qua volgorde: de 0 wordt vervangen door het 0-e argument bij de aanroep naar het taalbestand, de 1 met het 1-e)
Hmm, een soortgelijk systeem zou ik wel kunnen implementeren. Thanks, hier kan ik wel wat mee.

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
YopY schreef op vrijdag 23 november 2007 @ 16:22:
Het is in PHP niet zo moeilijk om zelf zo'n systeem te implementeren, en ik ben er vrij zeker van dat er al pakketten zijn die dit probleem voor je oplossen.
Gewoon sprintf?

[ Voor 52% gewijzigd door robbert op 23-11-2007 16:33 ]


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Verwijderd schreef op vrijdag 23 november 2007 @ 16:30:
Hmm, een soortgelijk systeem zou ik wel kunnen implementeren. Thanks, hier kan ik wel wat mee.
Ik weet niet of je sprintf kent, maar dat kan ook nog:
PHP:
1
2
3
$message = 'Het e-mail adres %s is al in gebruik';

$message = sprintf($message, $email);

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
JanDM schreef op vrijdag 23 november 2007 @ 16:34:
[...]

Ik weet niet of je sprintf kent, maar dat kan ook nog:
PHP:
1
2
3
$message = 'Het e-mail adres %s is al in gebruik';

$message = sprintf($message, $email);
Pak dan een leuker voorbeeldje, zoals volgende van de php website:
PHP:
1
2
3
4
5
<?php
$format = 'The %2$s contains %1$d monkeys.
           That\'s a nice %2$s full of %1$d monkeys.';
printf($format, $num, $location);
?> 

Dan zie je tenminste hoe je een specifiek element kan pakken :)

Acties:
  • 0 Henk 'm!

  • Cruz
  • Registratie: November 1999
  • Laatst online: 03-09 16:35
code:
1
2
3
4
5
6
7
8
9
10
<?php

$firstname = 'John';
$fullname = "\$firstname \$lastname";
$lastname = 'Doe';

eval("\$fullname = \"$fullname\";");
echo $fullname;

?>


Kan ook. Fugly, maar werkt.

Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Cruz schreef op vrijdag 23 november 2007 @ 16:38:
code:
1
2
3
4
5
6
7
8
9
10
<?php

$firstname = 'John';
$fullname = "\$firstname \$lastname";
$lastname = 'Doe';

eval("\$fullname = \"$fullname\";");
echo $fullname;

?>


Kan ook. Fugly, maar werkt.
Gebruik dan een functionele taal :P
Clean:
1
2
3
4
5
firstname = "John"
fullname = firstname ++ " " ++ lastname
lastname = "Doe"

start = fullname


Of maak er allemaal functies van in php:
PHP:
1
2
3
4
function firstname() { return "John"; }
function fullname()  { return firstname()." ".lastname(); }
function lastname()  { return "Doe"; }
echo fullname();

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Cruz schreef op vrijdag 23 november 2007 @ 16:38:
code:
1
2
3
4
5
6
7
8
9
10
<?php

$firstname = 'John';
$fullname = "\$firstname \$lastname";
$lastname = 'Doe';

eval("\$fullname = \"$fullname\";");
echo $fullname;

?>


Kan ook. Fugly, maar werkt.
Ja vooral als ik in $fullname nu zoiets heb als $fullname = "'carebear'; system('rm -rf ...')"; door $firstname of $lastname zorgvuldig te kiezen...

[ Voor 7% gewijzigd door prototype op 23-11-2007 16:43 ]


Acties:
  • 0 Henk 'm!

  • Cruz
  • Registratie: November 1999
  • Laatst online: 03-09 16:35
Told you it was fugly :P

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Aight, sprintf() was precies wat ik zocht. Was net van plan om zelf zo'n functie te schrijven maar hey, als ie al bestaat... Thanks!

[ Voor 3% gewijzigd door Verwijderd op 23-11-2007 17:37 ]

Pagina: 1