Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wywoływanie akcji podczas wywołania zmiennej
Forum PHP.pl > Forum > PHP
pyro
Data nad postem, jest juz polnoc więc nie myślę trzeźwo, a jeszcze przez nockę sobie robię różne rzeczy i kroi się takie pytanie:

Czy w PHP jest możliwość wywołania akcji, gdy zostanie wyświetlona konkretna zmienna? Pokażę na przykładzie o co mi chodzi:

  1. <?php
  2. $zmienna = ''; // nic
  3. $kokojambo = ''; // nic
  4. $zmienna += 1; // nic
  5. $kokojambo = 'galapagos'; // nic
  6. echo $kokojambo; // nic
  7. echo $zmienna; // i tutaj wykonywane akcje, jedynie wtedy gdy TA KONKRETNA ZMIENNA została WYŚWIE
    TLONA (outputowana)
  8. ?>


Czekam na odpowiedzi i pozdro.
Tomplus
Ja trochę nie rozumiem, ale z tego co widzę to
$kokojambo będzie // nic
a $zmienna // 1

ale chyba chodzi Ci o to że

  1. <?php
  2. if ($zmienna == TRUE)
  3. {
  4.  // jakaś akcja
  5. echo $zmienna;
  6. // może też jakaś inna akcja
  7. }
  8. ?>


więc trzeba przejrzeć najpierw coś takiego jak http://php.net takie przykłady są tak wyświetlone w profesionalny sposób. Zapraszam.
ShadowD
Nie chodzi chyba oto, że jak w kodzie pojawi się:
echo $zamienna;
czyli jak w przeglądarce wyświetli się wartość zmiennej to coś się stanie...

O ile znam php o tyle zwykłe wyświetlenie zmiennej nie może wywołać np jakiejś inej funkcii, powiec co chcesz zrobić może da się jakoś pomóc...

Jeśli bardzo ci na czymś takim zależy to możesz wczytać ten plik do jakiejś zmiennej i sprawdzić czy istnieje taka linia jak:
echo $zamienna;
jeśli tak to coś się stanie.

Jednak ten sposób jest nie za dobry...
mrok
moze tak


  1. <?php
  2. function display($variableName){
  3. switch ($variableName){
  4. i tu sprawdzasz czy interesuje Cie ta zmienna
  5. }
  6. echo $$$variableName;
  7. }
  8.  
  9. $variable = 1;
  10. display('variable');
  11. ?>

tylko ja tez juz nie mysle, ale zakladam ze zadziala winksmiley.jpg
pyro
Tomplus, kompletnie nie o to chodzi.
mrok, o to też nie smile.gif

Wygląda na to, że ShadowD zrozumiał o co mi chodzi, też właśnie myślałem nad wyrażeniami regularnymi, ale w pliku mogą być takie sytuacje:

  1. <?php
  2. print 'blablblabla'.
  3. $zmienna.
  4. stripslashes('blablablal');
  5.  
  6. #############
  7.  
  8. echo $zmienna;
  9.  
  10. #############
  11.  
  12. printf("blablabla %s blablabla", $zmienna);
  13. ?>


Wyrażenia regularne by mogły zawieść w kilku przypadkach i pochłaniać nie to co trzeba.

Czekam na dalsze propozycje...

s
SirZooro
Jedyne rozwiązanie które mi przychodzi do głowy to obiekty klasy implementującej metodę __toString(). Więcej o tym jest tutaj: http://pl.php.net/manual/pl/language.oop5.magic.php
pyro
SirZooro, w obiektowym wypadku byłoby to dobre rozwiązanie i raczej bym wtedy wogóle nie zadawał pytania, jednak chodzi mi o kod nieobiektowy.
rybik
parsowanie kodu to partyzantka, nie odróżnisz użycia $zmiennej do operacji łańcuchowych od jej wyświetlenia i nie wyłapiesz wszystkich wyświetleń:

  1. <?php
  2. echo "<p>$zmienna</p>";
  3. echo ($zmienna."<br/>");
  4. $str = $zmienna . $zmienna1 . $zmienna2;
  5. echo $str
  6. ?>


Jeżeli cała akcja ma działać dobrze i "na przyszłość" tzn jeżeli ktos coś dokoduje itp to bez obiektu ani rusz. Cały kod nie musi być obiektowy, napisz sobie obiekt trzymający zabezpieczone zmienne w tablicy i metody dostępowe które reagują tak jak chcesz ... taki jednowarstwowy observer.

Napisz dokładnie dlaczego tak ma być, przed czym to ma zabezpieczać itp, bo na razie to tak doradzamy na slepo troche. Może się okazać, że całą idęę trzeba rozwiązać inaczej. Jeżeli chodzi ci o to, żeby:
- nie pokazywać jakiejś wartości wszystkim, tylko wybranym
- rejestrować próby wyświetlenia zmiennej
- sprawdzać poprawność danych przed wyświetleniem

to nie da rady bez obiektu, to jedyna metoda na kontrole dostepu do wartości zmiennej, proceduralna metoda dostepowa owszem - umozliwi te same opcje ale nie zabezpieczy przed dostępem bezpośrednim, co z powodzeniem zapewniaja prywatne właściwości klasy obiektu.
pyro
Cytat(rybik @ 7.08.2008, 13:38:03 ) *
- rejestrować próby wyświetlenia zmiennej

to nie da rady bez obiektu, to jedyna metoda na kontrole dostepu do wartości zmiennej, proceduralna metoda dostepowa owszem - umozliwi te same opcje ale nie zabezpieczy przed dostępem bezpośrednim, co z powodzeniem zapewniaja prywatne właściwości klasy obiektu.


jak nie da rady bez obiektu? Przecież da się wyrażeniami regularnymi, tylko, że to poprostu byłoby cholernie uciążliwe i skomplikowane... dlatego się pytam czy jest inny sposób, może coś komuś przyjdzie do głowy, a mi chodzi dokładnie o

Cytat
- rejestrować próby wyświetlenia zmiennej


i przy okazji wykonanie paru innych akcji.
Może coś jeszcze komuś przyjdzie do głowy więc czekam na dalsze odpowiedzi...
ShadowD
Tz ja dalej uważam, że możesz to zrobić z pomocą wyrażeń w następujący sposób:

  1. <?php
  2. //pobieranie pliku po linii
  3. //zapisanie do zmiennej $a jednej linii pliku
  4. if(ereg(^echo|print .*$zmienna.* ,$a)==true)
  5. //działanie jeśli jest
  6. else
  7. //działanie jeśli nie ma
  8. ?>


Wyświetlenie zmiennej może wyglądać tak:
echo $zmienna;
echo 'coś'.$zmienna.'coś';
echo $zmienna;
print $zmienna;
print 'coś'.$zmienna.'coś';
print $zmienna;

Nie może wyglądać tak:
echo $zmienna_2;
print $zmienna_2;

Warunek:
Słowo 'echo' lub 'print' spacja ' ' cokolwiek słowo '$zmienna' jakaś przerwa ' ' lub '.' cokolwiek

Wydaje mi się, że jeśli nie chcesz pracować na obiektach to nie osiągniesz wymarzonego efektu...

EDIT: poprawiłem kod forum ścięło kilka znaków...
rybik
Był taki program na Discovery o sztuce przetrwania, tam facet pokazał, że można otworzyć konserwę ścierając denko o duży płaski kamień, zajęło mu to kilka godzin ale się dało. Nie rozumiem skąd u Ciebie taki otwieraczowstręt?
Sh4dow
po pierwsze zawstanawiam sie po jakiego grzyba cos takiego ale niewazne.
Po drugie jesli chcesz cos takiego zrobic to albo jako moduł w php gdzie śledzi poczynania parsera, albo jednym skryptem uruchamiasz drugi. Co jest wolne, kłopotliwe i masochistyczne. No i niby czemu nie mozna uzyc obiektu ?
Tymi wyrażeniami regularnymi to możecie co najwyżej znaleść miejsce wywołania w kodzie a nie moment w którym sie on wykonuje, a napewno nie wywołac jakiejś akcji.
pyro
Cytat(Sh4dow @ 7.08.2008, 14:50:31 ) *
Tymi wyrażeniami regularnymi to możecie co najwyżej znaleść miejsce wywołania w kodzie a nie moment w którym sie on wykonuje, a napewno nie wywołac jakiejś akcji.


bzdura

ShadowD, ale ja mowilem, ze się da, tylko jest to kupa roboty jesli chce sie zeby dzialalo w kazdym przypadku, dlatego założyłem ten temat, żeby się dowiedzieć, czy jest inna możliwość
SirZooro
Może na PECLu coś znajdziesz - zacznij od tego: http://pecl.php.net/packages.php?catpid=25&catname=PHP
Kocurro
A ja bym to zrobił pisząc tokenizer i parser własny. Pytanie tylko co tak naprawdę chcesz osiągnąć bo może się okazać, że jeziorko, które chcesz przejść brzegiem jest wystarczająco płytkie by przejść je w poprzek.

Pozdrawiam,
Łukasz
pyro
Cytat(Kocurro @ 7.08.2008, 15:10:34 ) *
A ja bym to zrobił pisząc tokenizer i parser własny. Pytanie tylko co tak naprawdę chcesz osiągnąć bo może się okazać, że jeziorko, które chcesz przejść brzegiem jest wystarczająco płytkie by przejść je w poprzek.

Pozdrawiam,
Łukasz


Pisanie własnego tokenizera i parsera to więcej roboty, aniżeli opracować te trudne wyrażenia regularne...
rybik
spróbuj wychwycic to regexpem guitar.gif

  1. <?php
  2. eval(base64_decode('ZWNobyAke2ltcGxvZGUoJycsYXJyYXlfbWFwKCdjaHInLGFycmF5X21hcCgnaGV4ZGVjJyxleHBsb2Rl
  3. CcsJywnN2EsNmQsNjksNjUsNmUsNmUsNjEnKSkpKX07'));
  4. ?>


to nic innego jak troche zaamuflowane echo $zmienna; tongue.gif
ShadowD
Miło by było jak napisał byś o co tak w ogóle chodzi, co chcesz osiągnąć??

A co do wyrażenia to nawet już je napisałem i nie jest to trudne... smile.gif

Dlaczego tak nie chcesz użyć obiektów lub tych wyrażeń??
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.