Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zaciemnianie kodu
Forum PHP.pl > Forum > PHP
Snowak
Witam,
piszę własny zaciemniacz kodu pod mój drobny projekt. Mam jednak problem z ukryciem wywołań standardowych funkcji, a dokładniej z ich wywołaniem...

Założmy, że mam funkcję:
preg_match_all($a, $b, $c);

I nazwę funkcji otrzymuję z wywołania funkcji o przykładowej nazwie f('123', 'abc'), to aby ją wywołać musiałbym ją przechować w pośredniej zmiennej (coś w stylu f(..)($a, $b, $c) nie działa). Niestety taka możliwość nie zawsze występuje... więc trzeba się obyć bez tej zmiennej. W manualu php znalazłem takie cudo jak call_user_func. Po zaciemnieniu, wygląda to mniej więcej tak:
call_user_func($f('123', 'abc'), $a, $b);

Wszystko działa pięknie... do czasu. Jak się okazało, call_user_func nie jest w stanie przekazać trzeciego parametru przez referencję, więc wszystko mi się wysypuje.

Zakładam, że w żaden sposób nie jestem w stanie zmusić call_user_func, aby się zachowywało tak jak należy, więc mam trochę inne pytanie. W jaki sposób mogę to zaciemnić? A może jestem w stanie wywołać jakoś inaczej funkcję otrzymując jej nazwę z innej funkcji?

coś w stylu $funcName($a, $b, $c) działa idealnie, ale niestety nie wszędzie da się coś takiego zrobić...

z góry dzięki za pomoc
planet
Po co Ci właściwie zaciemniać kod? Bo trochę takiego działania nie rozumie.
grn
Abstrahując od zasadności zaciemniania kodu możesz spróbować tak:

  1. <?php
  2. function fn($x)
  3. {
  4.  echo $x;
  5. }
  6.  
  7. class Zaciemniacz
  8. {
  9.  public function fn($x)
  10.  {
  11.    fn($x);
  12.  }
  13. }
  14.  
  15. $z = new Zaciemniacz();
  16. $f = 'fn';
  17.  
  18. $z->$f('x');
  19. ?>
Snowak
Dzięki, ale to zupełnie nie jest odpowiedzią na moje pytanie. Mam funkcję, która zwraca nazwę funkcji do wywołania i chce ją wywołac bez przechowywania jej nazwy w zmiennej nie korzystając z metod call_user_func~ ponieważ nie przekazują parametrów przez referencję (chociaż jedną z nich można do tego zmusic, ale musiałbym z góry wiedziec jak te parametry przekazywac co nie wchodzi w grę).

Potrzebuję czegoś w stylu:
  1. <?php
  2. function increment($costam, &$ref)
  3. {
  4.  $ref++;
  5. }
  6.  
  7. function getFunctionName($costam)
  8. {
  9.  return 'increment';
  10. }
  11.  
  12. $parametr2 = 1;
  13. getFunctionName('costam')('parametr1', $parametr2);
  14. echo($parametr2);
  15. ?>
nospor
Cytat
Wszystko działa pięknie... do czasu. Jak się okazało, call_user_func nie jest w stanie przekazać trzeciego parametru przez referencję, więc wszystko mi się wysypuje.

Przeciez w manualu masz przyklad jak przekazac referencje:
Cytat
Przykład #1 call_user_func() example and references
<?php
error_reporting(E_ALL);
function increment(&$var)
{
$var++;
}

$a = 0;
call_user_func('increment', $a);
echo $a."\n";

call_user_func_array('increment', array(&$a)); // You can use this instead before PHP 5.3
echo $a."\n";
?>
maroko
Może "zaciemniaczem" mogła by być funkcja "class_alias".
Nie zmieniasz nazwy klasy tylko odwołujesz się do jej aliasu.

No ale wydaje mi się, że faktyczny zaciemniacz może wyglądać tak:
  1. <?php
  2.  
  3.        function fcn($a,$b)
  4.        {
  5.            if(is_numeric($a) && is_numeric($b)) return $a+$b;
  6.            return 'conajmniej jedna zmienna nie jest liczba!';    
  7.        }
  8.  
  9.        function zaciemniacz($funkcja, $atrybut1, $atrybut2)
  10.        {
  11.            return create_function('$atrybut1,$atrybut2', 'return '.$funkcja.'($atrybut1, $atrybut2);');
  12.        }
  13.                
  14.        $fn = zaciemniacz('fcn',$a,$b);
  15.        echo 'Nowa zaciemniona funkcja: '.$fn.' a to jej wynik: ';
  16.        echo $fn(2, 3) . "\n";
  17.        
  18. ?>


Cytat
coś w stylu $funcName($a, $b, $c) działa idealnie, ale niestety nie wszędzie da się coś takiego zrobić...

shit nie doczytałem
Snowak
Prosiłbym wszystkich, aby doczytali dokładnie mojego posta. Przecież jeżeli mam funkcję, która zwraca nazwę funkcji do wywołania to może byc to cokolwiek i w kodzie nie mam absolutnie żadnego pojęcia do czego ona służy oraz jakie parametry przyjmuje. A więc tak jak mówiłem, call_user_func nie jest w stanie przekazac parametrów przez referencję tak jak należy a call_user_func_array wymaga WIEDZY, które parametry jak należy przekazac. Rozwiązanie $funcName($a, $b, $c) sprawdzałoby się idealnie, ponieważ samo przekazuje parametry przez referencję kiedy jest to wymagane, ale tak jak pisałem w 1szym poście - wymaga zastosowania tymczasowej zmiennej do przechowywania nazwy funkcji a ja potrzebuję operowac bezpośrednio na wyniku funkcji zwracającej nazwę funkcji do wywołania.

Ale i tak dzięki za chęci.
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.