Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czym zastąpić "eval" ?
Forum PHP.pl > Forum > Przedszkole
MESSIAH :)
Czytałem w manualu aby nie stosować tej funkcji. Więc jak powinien wyglądać poprawnie funkcja renderowania html?
  1. if (file_exists($path)) {
  2. $content = file_get_contents($path);
  3.  
  4. eval(' ?>' . $content . '<?php ');
  5. }

Co takiego złego jest w tym eval?
nospor
A po grzyba ci tu eval? O include nie slyszal?
Comandeer
Wszystko… Już lepiej po prostu
Kod
echo file_get_contents($path);


Chyba że w środku jest PHP, więc można pokombinować z buforem i include (albo po prostu zaincludować).
MESSIAH :)
Słyszałem o include i stosuje to. Mam mały system renderowania html w którym używam preg_replace i np mam kod html:
  1. Witaj [user] ostatni byłeś [online] masz [messages] nieprzeczytanych.

Dlatego użyłem eval
  1. eval(' ?>' . $content . '<?php ');
aby oddzielić php od html.
nospor
No i po co ci tu eval? Przeciez to zwykly tekst.... eval nie ma tu nic do roboty.
MESSIAH :)
Cytat
eval — Evaluate a string as PHP code

Poprawny kod wygląda następująco:
  1. if (file_exists($path)) {
  2. $content = file_get_contents($path);
  3. foreach (this->vars as $key => $value) {
  4. $content = preg_replace('/\[' . $key . '\]/', $value, $content)
  5.  
  6. eval(' ?>' . $content . '<?php ');
  7. }
nospor
No i dobrze... nadal sie pytam po grzyba ci tu eval?? Czemu preg_replacem nie zamieniasz od razu na wartosc jaka ma byc? Bo teraz rozumiem, ze zamieniasz to na zmienna a potem evalem parsujesz... bez sensu totalnie.

ps: i nie cytuj mi tu prosze definicji. Ja wiem co robi eval. To ty bez sensu kombinujesz a nie ja tongue.gif
MESSIAH :)
Bez eval wyświetla mi się pusta strona. Więc jest on potrzebny.
Comandeer
Może dlatego, że nie ma nigdzie echo?
nospor
@Comandeer o echo juz pisales w pierwszym poscie. Chyba nie podejrzewasz tegoż tu autora o nieczytanie tego co się do niego pisze wink.gif

Cytat
Bez eval wyświetla mi się pusta strona. Więc jest on potrzebny.
No tak, nie ma to jak wyciągnac logiczny wniosek wink.gif
Nie dam rady poleciec do sklepu oddalonego o 200 metrow - musze kupic helikopter.... Ale zeby pomyslec zeby uzyc nóg, to już ciezko na to wpaść.
Tak jak juz wspominano wczesniej: by sie cos wyswietlilo na ekranie, to trzeba uzyc echo. Wiesz, takie tam podstawy, ktore powinno sie znac od samego początku.
Comandeer
@nospor im dłuższy staż na forach, tym bardziej podejrzliwym człowiekiem się staję wink.gif
Tuminure
Nie wiem jaki efekt chcesz uzyskać ale z pewnością go uzyskasz bez używania eval wink.gif.
nospor
@Comandeer to sobie pomysl jaką ja mam fazę biggrin.gif
Comandeer
@nospor jestem adminem na (konkurencyjnym?) forum, więc też już mam odpowiednią…

Co do tematu: nie łatwiej już wziąć jakiś super mega prosty system szablonów, skoro i tak ten kod go ma przypominać?
MESSIAH :)
Więc sprawa wygląda następująco. Nie mogę używać echo lub tym podobne gdyż moje if, else i endif będą miały postać komentarza html czyli:
  1. <!-- if 1 == 1 -->

I tutaj będę podmieniał tylko wartość dla if. Więc eval jest tutaj jak najbardziej na miejscu. Echo wyświetla wszystko i psuje output preg_replace.
Comandeer
Jeśli masz tam if to najlepszy znak tego, że potrzebujesz systemu szablonów, a nie rzeźbienia czegoś takiego na szybko.

Najprostszy system szablonów można uzyskać używając PHP (tzw. PHP Views), np. przy pomocy output bufferingu + include jak wspominałem.

  1. <?php
  2. function generateView($file, array $vars = [])
  3. {
  4.  
  5. extract($vars);
  6.  
  7. include $file;
  8.  
  9. return ob_get_clean();
  10. }
  11.  
  12. echo generateView('view.php', [
  13. 'a' => 1
  14. ]);


I plik view.php:
  1. <?php if($a > 0): ?>
  2. <p>Super! $a wynosi aż <?=$a;?>.</p>
  3. <?php endif; ?>


Zero eval.

Oczywiście PHP Views są najmniej przyjemne w pracy (ale za to masz dostęp do całego PHP, co w zależności od punktu widzenia jest plusem lub minusem) i warto zaznajomić się choćby z Twigiem czy jakąś implementacją wąsów dla PHP
MESSIAH :)
W moim pliku z View używam tylko html - php odpada. Chcę mieć w nim czysty html
  1. Witaj [użytkownik] <br>
  2.  
  3. <!-- Jeśli 1 == 1 -->
  4. Jest równe
  5. <!-- Inaczej -->
  6. Nie jest równe
  7. <!-- KoniecJeśli -->


Moim celem jest przetworzenie
  1. <!-- Jeśli 1 == 1 -->
na
  1. <?php if ($1) : ?>
i ponownie na html. Czy bez eval się nie obędzie?
nospor
Cytat
W moim pliku z View używam tylko html - php odpada. Chcę mieć w nim czysty html
Jest ku temu jakiś konkretny powód czy zwykły kaprys?
MESSIAH :)
Chcę po prostu sprawdzić zachowanie takiego renderowania. Muszę przetestować kilka opcji i wybrać tą najlepszą dla mnie.
nospor
Aaaaa, to ty..... ten co nie slucha innych tylko robi po swojemu... juz sobie przypomnialem smile.gif
Dobra, powodzenia smile.gif
Comandeer
Polecam sprawdzić wszelkie możliwe problemy związane z tym sposobem, które miał phpBB i pomyśleć czemu przeszedł na inny system szablonów.
CuteOne
Poczytaj o smarty/twig itp. systemach szablonów jak chcesz mieć "czysty" html w jednym pliku.. ale poważnie po co zakładasz temat skoro i tak nie słuchasz czyichś rad?

@edit wiec chyba, mozna go dodac do listy ignorowanych smile.gif
nospor
@CuteOne przeciez w smartym nie ma czystego html. Tam przecież są wstawki smartiego. A on chce miec czysty HTML... Kod html, np. komentarze, bedzie potem zamienial na php a potem evalem biggrin.gif

Takze tak, w tym wypadku eval jest niezbędny. Ale przyjmij do wiadomosci, ze caly mechanizm co wymysliles jest juz do bani.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.