[erledigt]eval :-(

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

[erledigt]eval :-(

Beitrag von Ambience »

Code: Alles auswählen

/**
  * 
  * compile the template
  *
  * @access private
  * @param string $handle
  *
  **/
  private function compile($handle)
  {
    $code = file($this->root . $this->file[$handle]);
    $code = implode('', $code);
    
    //
    // parse single assigns
    //
    $code = preg_replace('/\{(.*?)\}/is', '<?php (isset($this->assigns["$1"])) ? $this->assigns["$1"] : ""; ?>', $code);

    eval($code);
    return true;
  }
Parse error: parse error, unexpected '<' in C:\Programme\xampp\htdocs\xxx\includes\template.php(168) : eval()'d code on line 1
Es handelt sich nicht um ein phpbb..
Zuletzt geändert von Ambience am 18.11.2006 17:27, insgesamt 1-mal geändert.
Benutzeravatar
Olli Oberhausen
Mitglied
Beiträge: 561
Registriert: 22.10.2004 01:03
Wohnort: Oberhausen NRW
Kontaktdaten:

Beitrag von Olli Oberhausen »

Da du ja anscheinend unter die hardcoreentwickler gehst, solltest du dir mal das Zend Studio besorgen, damit findest du solche fehler in echtzeit...

1. Das <?php und ?> muß weg ; muß bleiben.
2. im geparsten String fehlt ein echo

Olli
Neulich im Zoo: Papa, guck mal, da sind Linuxe...
KB-Suche :: db_update_generator :: phpMyAdmin
Winmerge :: Zend Studio
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

1. und 2. funktioniert irgendwie nicht:

Code: Alles auswählen

    //
    // parse single assigns
    //
    $code = preg_replace('/\{(.*?)\}/is', 'echo (isset($this->assigns["$1"]) ? $this->assigns["$1"] : "");', $code);

zend studio habe ich schon oft versucht, aber der findet meinen xampp nie odersowas.

Und wie meinst du das mit haardcore? ich hab das früher mit echo statt eval gemacht, bis mir einer erklärte das ich eval nehmen MUSS, da ein echo in funktionen fehlamplatz sei...

Danke
Benutzeravatar
Banger
Ehemaliges Teammitglied
Beiträge: 375
Registriert: 03.05.2005 21:53
Wohnort: Düsseldorf
Kontaktdaten:

Re: eval :-(

Beitrag von Banger »

Herrje... mach dat doch gescheit!

Code: Alles auswählen

/**
  * 
  * compile the template
  *
  * @access private
  * @param string $handle
  *
  **/
  
  private function getAssign($r)
  {
    $k = &$r[1];
    return isset($this->assigns[$k]) ? $this->assigns[$k] : '';
  }

  private function compile($handle)
  {
    $code = file_get_contents($this->root . $this->file[$handle]);
    
    //
    // parse single assigns
    //
    return preg_replace_callback('/\{(.*)\}/is', array(&$this, 'getAssign'), $code);

  }
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

aber jetzt weiß ich nicht genau was ich genau falsch gemacht habe, und dein code versteh ich auch nicht so recht.

also preg_replace_callback(meinesuche, meinfunctionsaufrufbeigefunden, von code);

soweit komm ich mit.. aber was ist an meinem genau falsch gelaufen? ich kenne eval nicht und bei php.net hab ich auch nichts in meinem zusammenhang gefunden.

Ich versteh hier gerade nix. aber funktionieren tut es

und funktionieren tut es bisher auch nur mit echo $this->compile(); also der rückgabewert des return von der compile funktion.

so sieht das ding nun aus:

Code: Alles auswählen

function display($handle)
  {
    if ($handle != '')
    {
      if (isset($this->file[$handle]))
      {
        echo $this->compile($handle);
        return true;
      }
      else
      {
        die('Template->display(): You have to add the template before display');
      }
    }
    else
    {
      return false;
    }
  }
  
  /**
  *
  * get all assigns for compile
  *
  **/
  private function getAssign($r) 
  { 
    $k = &$r[1]; 
    return isset($this->assigns[$k]) ? $this->assigns[$k] : ''; 
  } 
    
  /**
  * 
  * compile the template
  *
  * @access private
  * @param string $handle
  *
  **/
  private function compile($handle)
  {
    $code = file_get_contents($this->root . $this->file[$handle]); 
    
    //
    // replace \ with \\ and then ' with \'
    //
		$code = str_replace('\\', '\\\\', $code);
		$code = str_replace('\'', '\\\'', $code);
    
    //
    // parse single assigns
    //
    return preg_replace_callback('/\{(.*)\}/is', array(&$this, 'getAssign'), $code);  
  }
und er parst nur einmal... also nicht alle {lala} sondern nur das erste..
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

so nun funktionierts zu meiner zufriedenheit:

Code: Alles auswählen

private function compile($handle) 
  { 
    $code = file($this->root . $this->file[$handle]); 
    $line_counts = count($code);
    $code = implode('', $code);
        
    // 
    // parse single assigns 
    // 
    while (list($k, $v) = each($this->assigns))
    {
      if (preg_match('/\{(' . $k . ')\}/is', $code))
      {
        $code = str_replace('{' . $k . '}', $v, $code);
      }
      else
      {
        $code = str_replace('{' . $k . '}', '', $code);
      }
    }
    
    eval("echo '$code';");    
    return true;
Benutzeravatar
larsneo
Mitglied
Beiträge: 2622
Registriert: 07.03.2002 15:23
Wohnort: schwäbisch gmünd
Kontaktdaten:

Beitrag von larsneo »

ein schönes zitat in diesem zusammenhang:
"If eval is the answer, then you are asking the wrong question."
[Rasmus Lerdorf]
gruesse aus dem wilden sueden
larsneo
..::[krapohl.net]::..
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

dann sag mir wie dann?
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag von gn#36 »

Die Zeile

Code: Alles auswählen

eval("echo '$code';");  
ist nicht gerade sinnvoll. eval macht ja nichts anderes, als den übergebenen String als PHP Code zu interpretieren und auszuführen. Wobei es mich ehrlich gesagt wundert dass das so funktioniert, denn in einfachen Anführungsstrichen sollten eigentlich die Variablen nicht geparst werden, aber gut. Statt der Anweisung könntest du also auch direkt echo $code; schreiben. Eval kostet hier nur unnötig Zeit.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Olli Oberhausen
Mitglied
Beiträge: 561
Registriert: 22.10.2004 01:03
Wohnort: Oberhausen NRW
Kontaktdaten:

Beitrag von Olli Oberhausen »

Eval ist schon der richtige ansatz, macht nur bei einer template klasse deiner größe (noch) keinen sinn.

Wenn du dir mal das phpbb oder das extremestyles template ansiehst macht es schon sinn.
Da wird der code in zig kleinen schritten zusammengebaut und erst am ende ausgeführt.

Der große vorteil ist das du den Kompilierten code cachen kannst und bei seiner 2. verwendung nicht neu zusammen bauen musst. Dann holst du einfach $code von der platte und schickst es durch eval.

Mein tipp. nutze die "Perfekte" klasse von cyberalien und bastel daran rum - die kannst du ohne weiteres erweitern...

Ein paar Highlights:

Code: Alles auswählen

<!-- IF USERNAME -->Hallo {USERNAME}<!-- ELSE -->Hallo Welt<!-- ENDIF -->

<!-- INCLUDE noch_ein_template.tpl -->

<?php echo 'php im template möglich'; ?>

usw... usw... 
Olli
Neulich im Zoo: Papa, guck mal, da sind Linuxe...
KB-Suche :: db_update_generator :: phpMyAdmin
Winmerge :: Zend Studio
Antworten

Zurück zu „Coding & Technik“