Autor | Zpráva | ||
---|---|---|---|
peta Profil |
Potreboval bych neco takoveho ve funkci __construct
$this->func = !KONSTANTA ? $this->func1 : $this->func2; Kod je zhruba takovyto: define("KONSTANTA",false); class classPokus { public $func = null; function __construct() { $this->func = !KONSTANTA ? $this->func1 : $this->func2; } public function func1() { return 111; } public function func2() { return 222; } $pokus = classPokus; $pokus->func(); |
||
Bertram Profil |
#2 · Zasláno: 29. 2. 2012, 13:38:29
peta:
Ahoj, takto se přistupuje k veřejné vlastnosti objektu: $object->publicProperty; $object->publicMethod(); Tvůj kód by mohl vypadat takto, <?php define("KONSTANTA",FALSE); class Pokus { public $vlastnost; public function __construct($parametr) { $this->vlastnost = $parametr; } public function metoda() { if ($this->vlastnost) { return 111; } return 222; } } $pokus = new Pokus(KONSTANTA); echo $pokus->metoda(); |
||
Joker Profil |
#3 · Zasláno: 29. 2. 2012, 14:01:37
peta:
> Potreboval bych neco takoveho ve funkci __construct > > $this->func = !KONSTANTA ? $this->func1 : $this->func2; Je nějaký důvod nepoužít úplně triviální řešení? class classPokus { function func() { return KONSTANTA ? $this->func1() : $this->func2(); } } |
||
peta Profil |
Ja tu funkci nechci volat. Ucel neni tajny, jen jsem to chtel zjednodusit pro dotaz.
function query1($query) { return mysql_query($query); } function query2($query) { echo $query; $result = mysql_query($query) or die(mysql_error()); return $result; } $query = !$debug ? query1 : query2; $query("SELECT * FROM tabulka"); $query("SELECT * FROM tabulka"); $query("SELECT * FROM tabulka"); ... V podstate jde o to, ze uz pri construct priradim do query spravnou funkci a pozdeji se nemusis ifem ptat (viz Joker, tak to mam ted take), zda je zapnuty debug mod. Kdyz v tom Jokerove priklade zavolas tu funkci 100x, tak tam mas navic 100x if navic, ktery by tam byt nemusel. |
||
Alphard Profil |
#5 · Zasláno: 29. 2. 2012, 21:26:28
Jako název volané metody lze použít proměnnou, ale nejsem si jist, jestli je to tady úplně vhodné.
|
||
Jan Tvrdík Profil |
#6 · Zasláno: 29. 2. 2012, 22:19:27
peta:
$query1 = function ($query) { return mysql_query($query); }; $query2 = function ($query) { echo $query; $result = mysql_query($query) or die(mysql_error()); return $result; }; $query = !$debug ? $query1 : $query2; $query("SELECT * FROM tabulka"); $query("SELECT * FROM tabulka"); $query("SELECT * FROM tabulka"); |
||
peta Profil |
Tak, ted mi to pise undefined method.
Call to undefined method classSql::query() in C:\wamp\www\riv-fyzika\pp-pokus\setc\sql_inc.php on line 29 <?php class classSql { public $conn = null; public $db = null; public $query = null; private $query1 = null; private $query2 = null; function __construct() { $this->connect(); //$this->query = !SQL_DEBUGMODE ? $this->query1 : $this->query2; if (SQL_DEBUGMODE) { echo "<style>.highlight {border-bottom:1px solid #FFE6DD;padding-bottom:3px;margin-bottom:3px;}</style>"; } $this->query1 = function ($query) { return mysql_query($query,$this->conn); }; $this->query2 = function ($query) { echo "\n<div class=\"highlight\">query = ".$query."</div>"; $result = mysql_query($query,$this->conn) or die('Chyba mysql_query. ' . mysql_error($this->conn)); return $result; }; $this->query = !SQL_DEBUGMODE ? $this->query1 : $this->query2; $this->query("SET NAMES utf8"); // radek 29 } } |
||
Joker Profil |
#8 · Zasláno: 1. 3. 2012, 08:05:11
peta:
„Kdyz v tom Jokerove priklade zavolas tu funkci 100x, tak tam mas navic 100x if navic, ktery by tam byt nemusel.“ Takže na těch 100 volání bude rozdíl v rychlosti skriptu přibližně… nula? Na straně záporů je duplikování kódu, horší srozumitelnost a údržba. Já osobně bych pro situaci v [#4] volil jednu funkci. Výsledkem „optimalizací“ tohohle druhu je podle mě horší a nakonec paradoxně i pomalejší kód. Pomalejší proto, že čas investovaný do přemýšlení nad vynecháním jednoho IFu šlo investovat do optimalizací s řádově větším efektem. A někdy (když „optimalizátor“ něco nedomyslí) se i stane, že ten „optimalizovaný“ kód je sám o sobě pomalejší než ten původní. Čehož si „optimalizátor“ nevšimne, protože jako výsledek optimalizace mu stačí subjektivní pocit, že kód urychlil. Ono objektivní měření většinou stejně ani není možné, protože třeba u kódu v [#4] efekt té optimalizace ani podle mě změřit nepůjde, náhodné rozdíly mezi měřeními budou větší. |
||
peta Profil |
Tak, mam reseni. Sice trochu na pikacu, ale funguje.
<?php class classSql { public $conn = null; public $db = null; public $query_func = null; public $query = null; public function query($query) { return call_user_func($this->query_func,$query,$this->conn); } function __construct() { $this->connect(); $query1 = function ($query,$conn) { return mysql_query($query,$conn); }; $query2 = function ($query,$conn) { echo("\n<div class=\"highlight\">query = ".$query."</div>"); $result = mysql_query($query,$conn) or die('Chyba mysql_query. ' . mysql_error($conn)); return $result; }; $this->query_func = !SQL_DEBUGMODE ? $query1 : $query2; if (SQL_DEBUGMODE) { echo("<style>.highlight {border-bottom:1px solid #FFE6DD;padding-bottom:3px;margin-bottom:3px;}</style>"); } $this->query("SET NAMES utf8"); } ?> |
||
Joker Profil |
#10 · Zasláno: 1. 3. 2012, 11:03:49
peta:
„Tak, mam reseni.“ Cituji sám sebe: „A někdy (když ‚optimalizátor‘ něco nedomyslí) se i stane, že ten ‚optimalizovaný‘ kód je sám o sobě pomalejší než ten původní.“ Testovací kód (Pozn. z nějakého důvodu na testovacím webu nejde $x = function, takže jsem použil create_user_func a vytváření objektů vynechal z měření): <?php define("SQL_DEBUGMODE", true); function getmicrotime($t){ list($usec, $sec) = explode(" ",$t); return ((float)$usec + (float)$sec); } class classSql { public $conn = null; public $db = null; public $query_func = null; public $query = null; public function query($query) { return call_user_func($this->query_func,$query,$this->conn); } function __construct() { $query1 = create_function('$query,$conn', "return true;"); $query2 = create_function('$query,$conn', "return false;"); $this->query_func = !SQL_DEBUGMODE ? $query1 : $query2; } } class ClassSqlJoker { public $conn = null; public $db = null; public $query_func = null; public $query = null; public function query($query) { if(!SQL_DEBUGMODE) return true; else return false; } function __construct() { } } $test = new ClassSqlJoker(); $tStart = microtime(); for($i=0; $i<10000; $i++) { $test->query(true); } $tEnd = microtime(); echo("<p>if: ".(getmicrotime($tEnd) - getmicrotime($tStart))."s</p>"); $test = new classSql(); $tStart = microtime(); for($i=0; $i<10000; $i++) { $test->query(true); } $tEnd = microtime(); echo("<p>call_user_func: ".(getmicrotime($tEnd) - getmicrotime($tStart))."s</p>"); ?> Jedna funkce s větvením (if): 0,010s Dvě funkce s call_user_func: 0,031s Čili po X hodinách snahy urychlit konstrukci, jejíž dopad na rychlost skriptu v reálu není měřitelný (protože v praxi tam bude to mysql_query s řádově delším časem) máme „optimalizaci“, která je 3x pomalejší než původní kód. Tož asi tak. |
||
Časová prodleva: 11 let
|
0