Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Czym zastąpić "eval" ?
MESSIAH :)
post
Post #1





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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?

Ten post edytował MESSIAH :) 4.08.2015, 20:43:20
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




A po grzyba ci tu eval? O include nie slyszal?
Go to the top of the page
+Quote Post
Comandeer
post
Post #3





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


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ć).
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #4





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




No i po co ci tu eval? Przeciez to zwykly tekst.... eval nie ma tu nic do roboty.
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #6





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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. }
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #8





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


Bez eval wyświetla mi się pusta strona. Więc jest on potrzebny.
Go to the top of the page
+Quote Post
Comandeer
post
Post #9





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


Może dlatego, że nie ma nigdzie echo?
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




@Comandeer o echo juz pisales w pierwszym poscie. Chyba nie podejrzewasz tegoż tu autora o nieczytanie tego co się do niego pisze (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
Comandeer
post
Post #11





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


@nospor im dłuższy staż na forach, tym bardziej podejrzliwym człowiekiem się staję (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Tuminure
post
Post #12





Grupa: Zarejestrowani
Postów: 178
Pomógł: 49
Dołączył: 16.04.2012
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Nie wiem jaki efekt chcesz uzyskać ale z pewnością go uzyskasz bez używania eval (IMG:style_emoticons/default/wink.gif) .
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




@Comandeer to sobie pomysl jaką ja mam fazę (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Comandeer
post
Post #14





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


@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ć?
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #15





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
Comandeer
post
Post #16





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #17





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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?
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




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?
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #19





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


Chcę po prostu sprawdzić zachowanie takiego renderowania. Muszę przetestować kilka opcji i wybrać tą najlepszą dla mnie.
Go to the top of the page
+Quote Post
nospor
post
Post #20





Grupa: Moderatorzy
Postów: 36 561
Pomógł: 6315
Dołączył: 27.12.2004




Aaaaa, to ty..... ten co nie slucha innych tylko robi po swojemu... juz sobie przypomnialem (IMG:style_emoticons/default/smile.gif)
Dobra, powodzenia (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.12.2025 - 21:55