Autor Zpráva
peta
Profil
Lze v PHP nejak definovat, ze pokud je splnena podminka, ma se na volani funkce volat funkce1 jinak funkce2? Cili nastavit ukazatel.

podminka = 1;
funkce = podminka ? funkce1 : funkce2;
funkce();
funkce();
funkce();

podminka = 0;
funkce = podminka ? funkce1 : funkce2;
funkce();
funkce();
funkce();

Jde mi o to, ze kdyz zavolam funkce treba 10x, aby se porad nemusel dotazovat, zda je splnena podminka.
Kdyz to udelam 3x, tak je to oki. Ale pri takovem 10-20x, uz mi to moc akcni neprijde.
A nebo, kdyby byla podminka slozitejsiho typu, tak porad zjistovat vysledek podminky...
joejoe
Profil *
if ($podminka) {
function obalka() {
funkce1();
}
} else {
function obalka() {
funkce2();
}
}

zkraceny zapis by mohl vypadat priblizne takhle:

$podminka ? ( function obalka() { funkce1(); } ) : ( function obalka() { funkce2(); } );
k
Profil *
trochu nechapu smysl takoveho zapisu..
joejoe
Profil *
Tak si zkus nasledujici kod:

<?php

$podminka = true;

// a)

function foo() {
global $podminka;
if ($podminka) { ; } else { ; }
}

// b)

if ($podminka) {
function foo() { ; }
} else {
function foo() { ; }
}

// nejake volani
$start = microtime (true);
for ($i = 0; $i< 500000; $i++) {
foo();
}
$stop = microtime (true);
echo ' '.number_format($stop-$start, 4, ',', ' ').' s';

?>

na mojem pocitaci vychazi, pri 500 000 volanich a) 0.51 - 0.53 s b) ~ 0.44 s - varianta b) je tedy o 15% rychlejsi..

typicke pouziti bych demonstroval treba na tomhle prikladu:

if (get_magic_quotes_gpc()) {
function q($var) { return $_GET[$var]; }
} else {
function q($var) { return addslashes($_GET[$var]); }
}
one_k
Profil
joejoe
Jasne, ale stejne.. - popisu to na tom prikladu s oshlashovanim:

if (get_magic_quotes_gpc()) {
function q($var) { return $_GET[$var]; }
} else {
function q($var) { return addslashes($_GET[$var]); }
}

toto je sice dobre a jak rikas tak i rychlejsi ale k cemu ti presne toto bude?
Na to abys oshlashoval nakou promennou bys to timto zpusobem musel psat do kodu vsude kde ji chces oshlashovat.
Coz by vedlo s mnohem vetsimu zpomaleni.
Logicky bys ten kod dal do nake metody a tu pak volal a predaval ji obsah promenne:

function add_gpc_slashes($var){
if (get_magic_quotes_gpc()) {
function q($var) { return $var; }
} else {
function q($var) { return addslashes($var); }
}
}

vyse uvedeny kod je samozrejme blbost.
jednodusi je to takto:

function add_gpc_slashes($var){
if (get_magic_quotes_gpc()) {
return $var;
} else {
return addslashes($var);
}
}

takze stejne se pouzije ten zpusob A, ktery je mozna pomalejsi, ale ve vysledku je rychlejsi nez zpusob B.

Je mozne ze si jen uvedl spatny priklad, ale nenapada me kde by se dal zpusob B realne pouzit.

OT: kvuli obcasnemu zneuzivani(?) meho nicku jsem se zaregistroval.

K
peta
Profil
fajn, to by slo. Jsem to sice nechtel tak drasticky, podminku na definici funkce, ale budiz.

one_k Smysl to ma ten, ze to usetri cas.

function funkce1();
function funkce2();
funkce = podminka ? funkce1 : funkce2;
funkce();
funkce();
funkce();

Nebo muzes napsat
function funkce1();
function funkce2();
function funkce() {if (podminka) {funkce1();} else {funkce2();}};
funkce();
funkce();
funkce(); // a pokazde se zepta na if

Rozhodne lepsi by to bylo s temi ukazateli, ale kdyz to nevite, tak se spokojim s tim drastickym resenim...
if ($config['sqlDebug']==1)
{function sq($query) {$res = mysql_query($query) or die("<hr>Err: $query<hr>".mysql_error()); return $res;}}
else {function sq($query) {$res = mysql_query($query); return $res;}}

tez to muzu zakomentovat, ale kdo by to hledal, ze? :)
DoubleThink
Profil *
Mělo by fungovat následující:
$func_name = (podminka) ? 'funkce1' : 'funkce2';

$func_name();
Jinak aby se kontinuálně kontrolovala ta podmínka a měnila hodnota proměnné, to si moc dobře představit nedokážu - akorát by šlo třeba dovnitř funkce příkaz pro změnu hodnoty té $func_name.
peta
Profil
Tak to moje nefunguje. Neprovede to DIE.
DoubleThink Jej, jasne, tak nejak to pouzivam u obrazkove knihovny, preci :)
Jen, mi by vic vyhovovalo, kdyby to byla funkce a ne promenna. Ale tak preziji.
peta
Profil
DoubleThink
nn, ani toto neni funkcni reseni. Tady musis nastavit $func_name jako global. Funkce globalne funguji bezne...
peta
Profil
mam pekne trapne reseni :)

function sq($query) {global $config; $res = mysql_query($query) or (($config['sqlDebug']==1) ? die("<hr>Err: $query<hr>".mysql_error()) :""); return $res;}

trapne na tom je, ze se pokazde musi provadet global, coz se v podstate nelisi od puvodniho. Jen zlepseni, ze ne pokazde se kontroluje ==1
Jestli ja to radeji nebudu precijen zakomentovavat...
one_k
Profil
peta
reseni je nasnade - navrhni si objektovy model, poradne ho promysli a polovina problemu bude pryc.
Jinak jsem spatne pochopil co mas na mysli, proto mi to prislo nesmyslne.
error414-
Profil *
jen se vyjadrim k te rychlosti.

Predcasna optimalizace je zdrojem vseho zla. Neoptimalizujte to dokud to neni potreba optimalizovat.
peta
Profil
error414- :) Vidim, ze mas tez bohate zkusenosti :) Jsem to chtel udelat co nejvic user-friendly. Clovek neznaly PHP nebude odkomenovavat SQL, ale radeji na urcitem miste nastavi =1. Mno, to je jedno, celkem. Mam i jine problemy.

one_k
Setkal ses uz s ukazatali, pointry?
V tomto pripade je to velice sikovna vec, viz
$func_name = (podminka) ? 'funkce1' : 'funkce2';
Prakticky to pouzivam v graficke knihovne:
$x = "-1";
switch($type1)
{
case 'png': $x = "ImageCreateFromPNG"; break;
case 'jpg': $x = "ImageCreateFromJPEG"; break;
case 'gif': $x = "ImageCreateFromGIF"; break;
case 'bmp': $x = "ImageCreateFromWBMP"; break;
case 'xbm': $x = "ImageCreateFromXBM"; break;
case 'xpm': $x = "ImageCreateFromXPM"; break;
default: return FALSE; break;
}
$imgIn = function_exists($x) ? $x : -1;
if (@$image1 = $imgIn($photo1)) {...}
jinymi slovy, do $x ulozim odkaz na funkci pro zpracovani obrazku.
kdezto tvuj kod by vypadal
switch($type1)
{
case 'png': $image1 = ImageCreateFromPNG($photo1); break;
case 'jpg': $image1 = ImageCreateFromJPEG($photo1); break;
case 'gif': $image1 = ImageCreateFromGIF($photo1); break;
case 'bmp': $image1 = ImageCreateFromWBMP($photo1); break;
case 'xbm': $image1 = ImageCreateFromXBM($photo1); break;
case 'xpm': $image1 = ImageCreateFromXPM($photo1); break;
default: return FALSE; break;
}
slo by to resit polem (to casem opravim)...
Otazka je, co je efektivnejsi? V tomto pripade asi primy vystup, ale v mem pripade je lepsi odkazovat
funkce1 na funkce1
funkce2 na funkce2
funkce na funkce1(/funkce2)
Takze volani funkce je stejne rychle jako funkce1, protoze obsahuji stejny ukazatel na misto v pameti. Proto jsem to chtel resit takhle jakoby slozite a pritom je to uzasne genialni finta. V pascalu se tomu rikalo "goto name;"
Toto téma je uzamčeno. Odpověď nelze zaslat.