Autor Zpráva
kuba123
Profil *
Jde dynamicky deklarovat proměnnou uvnitř funkce?

Můj (nefunkční) pokus:
function TableRow($arr){
  foreach ($arr as $const_name):
    global $$const_name, $$const_name.("_VALUE");
    die("***". $$const_name);
    if ( $$const_name )
    echo
        '<Tr align=' . C_ALIGN . ' bgcolor="' . COLOR1 . ' ">
      <th>' . $$const_name . '<td>' . $$const_name("_VALUE");
  endforeach;
}
TableRow(array("BIRTHDAY"));
Tori
Profil
kuba123:
A co vlastně chcete udělat??
edit: ↓ to není podle věku, vykám automaticky všem, které neznám osobně.
kuba123
Profil *
Deklarovat
global BIRTHDAY, BIRTHDAY_VALUE;
uvnitř funkce dynamicky


V šabloně je mnoho proměnných jako
USERNAME, USERNAME_SHOW, USERNAME_VALUE,
FIRST_NAME_SHOW, FIRST_NAME, FIRST_NAME_VALUE,
SECOND_NAME_SHOW, SECOND_NAME, SECOND_NAME_VALUE,
BIRTHDAY, BIRTHDAY_SHOW, BIRTHDAY_VALUE
atd. A chtěl bych udělat funkci na vytvoření řádku tabulky (popřípadě bez tabulky by to byla funkce která jen vypíše řádek textu).


A vykat si nemusíte, není mi 60
juriad
Profil
kuba123:
Globalním proměnným se vyhni, znepřehledňují kód a zanáší stěží viditelné závislosti. Takový kód se mnohem obtížněji spravuje.
Proměnné proměnné patři do stejné kategorie prasáren a vždy je lze nahradit nějakým elegantnějším způsobem.

Zkus popsat, čeho se snažíš dosáhnout a ne, jak toho chceš dosáhnout. Pravděpodobně něčeho jako:
function tableRows($radky, $i18N) {
  foreach($radky as $name => $value) {
    echo "<tr><th>" . $i18N.get($name) . "</th>";
    echo "<td>" . $value . "</td></tr>\n";
  }
}

class I18N {
  private $preklady = array(
    'BIRTHDAY' => 'narozeniny',
    'EYES_COLOR' => 'barva očí');
    
  function get($nazev) {
    if(isset($preklady[$nazev])) {
      return $preklady[$nazev];
    } else {
      return '<span class="chybi_preklad">' . $nazev . '</span>';
    }
  }
}

$i18N = new I18N();

tableRows(array(
  'BIRTHDAY' => '1.1.1970', 
  'EYES_COLOR' => 'modré'), $i18N);
kuba123
Profil *
juriad:
To já vím, že globální proměnné znepřehledňují kód. Jenže RS který jsem se rozhodl použít je už na těch GP závislý. Takže s tím už nic nenadělám. Taky bych nejraději použil třídu, jenže vzhledem k tomu jak že ten RS je komplexní a více jazyčný by to bylo příliš náročné. Se třídami bych to mohl možná zkusit později, až se s tím RS seznámím více do hloubky.

Takže dá se ten dynamický způsob deklarování použít nebo ne? Vzhledem k tomu, že ty GP už tam jsou.
peta
Profil
<?php
$USERNAME = 'aaa';
$USERNAME_VALUE = 'bbb'; 
$const_name = 'USERNAME';
var_dump(array( $$const_name, ${$const_name."_VALUE"} ));
?>
juriad: Tvuj priklad postrada jednu zasadni vec. Nic nevypise. Tudiz nic nedela, je to jen fragment kodu, ktery nevis na jaky kod se jak aplikuje, aby to neco udelalo.
kuba123
Profil *
Tak zkus toto: die() má vypsat datum. Kdyby to vypsalo datum, tak bych smazal die a mělo by fugovat. Leč tam je ještě někde chyba.

function TableRow($arr){
  global $COLOR1;
  foreach ($arr as $const_name):
    $v=$const_name."_VALUE";
    $s=$const_name."_SHOW";
    global $$const_name, $$s, $$v;
    die("s:".$$s); 
    if ( $$s )
    echo '<Tr align=' . C_ALIGN . ' bgcolor="' . COLOR1 . ' ">
      <th>' . $$const_name . '<td>' . $$v;
  endforeach;
}
$BIRTHDAY="1.1.1990";
TableRow(array("BIRTHDAY"));



Aha, tak ono to vlastně funguje, jen jsem spletl název proměnné zdá se
ne
die("s:".$$s);
ale
die("datum:".$$const_name);


Ještě teda jeden dotaz. Jak zpřístupnit konstantu pomocí proměnné?


Tak už jsem to opravil. Takže ne přes proměnné, ale přes konstanty se přistupuje.

function TableRow($arr){
  global $COLOR1;
  foreach ($arr as $const_name):
    $name=constant($const_name);
    $v=constant($const_name."_VALUE");
    $s=constant($const_name."_SHOW");
    if ( $s )
    echo '<Tr align=' . C_ALIGN . ' bgcolor="' . COLOR1 . ' ">
      <th>' . $name . '<td>' . $v;
  endforeach;
}

TableRow(array("BIRTHDAY"));

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: