FAQ |
Kalender |
![]() |
#11 | ||
|
|||
Medlem
|
Det bör väl även beaktas hur lång tid det tar att kompilera de olika scripten?
Det är lite beroende på servern konfiguration, men kompileras scriptet till vart anrop kan det vara av större betydelse, lite beroende på hur classen används i scripten. |
||
![]() |
![]() |
![]() |
#12 | ||
|
|||
Nykomling
|
Klassen instansieras 1 gång på varje sida :P
När jag väl vet vad som går snabbast så tar jag den snabbare varianten |
||
![]() |
![]() |
![]() |
#13 | ||
|
|||
Mycket flitig postare
|
Citat:
Speciellt om det handlar om en enda instans. Som jag skrev tidigare - du skall inte optimera fel saker. lös rätt problem! |
||
![]() |
![]() |
![]() |
#14 | ||
|
|||
Nykomling
|
I det här fallet så behöver man knappast ändra på konstruktorn.
Det är bara att ge 4 engenskaper ett värde. Resten av classen sköts av andra metoder. |
||
![]() |
![]() |
![]() |
#15 | ||
|
|||
Mycket flitig postare
|
Citat:
|
||
![]() |
![]() |
![]() |
#16 | ||
|
|||
Nykomling
|
Varför skulle en DB abstraction layers konstruktor behöva ändring om classen är skriven som min
Ge mig 1 passande senario då jag skulle behöva ändra på den. Hela Klassen : Kod:
<?php /*-------------------------------------------- | file = db/mysql.php | description : A database class | -------------- | copyright = (C) 2005 The Magicasoft Group | email = [email protected] *-------------------------------------------*/ class DB { var $host; // The hostname var $user; // The username var $password; // The password var $database; // The database var $conn = array('server' => 0, 'database' => 0); // Database and Server connection recource var $query = array(); // The exsisting querys var $currMethod; // The last result var $lang_struct = array('text' => 'TEXT', 'primkey const' => 'NOT NULL auto_increment', 'primkey' => 'PRIMARY KEY (#2)', 'spec prim' => '', 'primkey dt int' => 'INTEGER(#1)'); function DB($host,$user,$password,$database) // PHP4 class constructor { // populate the properties thats needed for connection $this->host = $host; $this->user = $user; $this->password = $password; $this->database = $database; } function __construct($host,$user,$password,$database) // PHP5 class constructor { // populate the properties thats needed for connection $this->host = $host; $this->user = $user; $this->password = $password; $this->database = $database; } function connect($errormode = 'print') // connect to the database { if($errormode === 'return') { $ext_test = ( function_exists('mysql_connect') ? '' : -1); if($ext_test === -1) return -1; $this->conn['server'] = @mysql_connect($this->host,$this->user,$this->password); return (@mysql_select_db($this->database,$this->conn['server']) ? 1 : 0); } $this->conn['server'] = mysql_connect($this->host,$this->user,$this->password) or $this->error('Can\'t connect to the server'); $this->conn['database'] = mysql_select_db($this->database,$this->conn['server']) or $this->error('Can\'t connect to the database'); } function close() // close the database connection { $this->query = NULL; mysql_close($this->conn['server']); } function query($query,$queryname,$overwrite = 'no') // run a query { if(!isset($this->query[$queryname]) || $overwrite === 'yes') // make sure there is no chance of unwanted conlicts with queries { $this->query[$queryname] = $this->currMethod = mysql_query($query,$this->conn['server']) or $this->error($queryname.' invalid query'); return $this->currMethod; } else $this->error('Can\t overwrite query : '.$queryname); // display error } function fetch_row($queryname) // fetch a row as an array { $this->currMethod = mysql_fetch_row($this->query[$queryname]); return $this->currMethod; } function fetch_assoc($queryname,$load = 'yes') // fetch a row as an hash { if($load === 'no') // check if query is outside $this->query { $this->currMethod = mysql_fetch_assoc($queryname); return $this->currMethod; } else { $this->currMethod = mysql_fetch_assoc($this->query[$queryname]); return $this->currMethod; } } function num_rows($queryname) // get the number of rows in a query { if(mysql_num_rows($this->query[$queryname])) { $this->currMethod = (string)mysql_num_rows($this->query[$queryname]) or $this->error('Can\'t get the number of rows from query : '.$queryname); return (int)$this->currMethod; } } function showcolumns($table,$keep = 'no') // show the columns of a table { $this->query("SHOW COLUMNS FROM $table",'showcolumns_'.$table); while($col = $this->fetch_assoc('showcolumns_'.$table)) { extract($col); $columns[$Field]['name'] = $Field; $Type = explode('(',$Type); $columns[$Field]['type'] = $Type[0]; $columns[$Field]['maxlength'] = str_replace(')','',$Type[1]); } $this->currMethod = $columns; if($keep === 'no') unset($this->query['showcolumns_'.$table]); return $this->currMethod; } function ALTER_TABLE($table,$action,$column,$type = '',$length = '',$newcolumn = '') // add,edit,delete columns from a table { if($action === 'add') // handle adding columns { $this->query("ALTER TABLE {$table} ADD COLUMN {$column} {$type}{$length} NOT NULL",'alter-table-add_sql'); } elseif($action === 'edit') // handle editing columns { $this->query("ALTER TABLE {$table} RENAME {$column} TO {$newcolumn}",'alter-table-edit_sql'); $this->query("ALTER TABLE {$table} MODIFY {$newcolumn} {$type}{$length} NOT NULL",'alter-table-edit_sql','yes'); } elseif($action === 'delete') // handle deleting columns { $this->query("ALTER TABLE {$table} DROP COLUMN {$column}",'alter-table-delete_sql'); } } function lang() // get a sql language structure { $num_args = func_num_args(); // number of arguments if($num_args === 0) trigger_error('Invalid argument count for function : lang, the function need atleast 1 argument',E_USER_ERROR); // function can't be void elseif($num_args === 1) return $this->lang_struct[func_get_arg(0)]; // if only 1 argument the return the language stucture else // handle language structures with arguments/variables { $code = $this->lang_struct[func_get_arg(0)]; for($i = 1; $i < $num_args; $i++) { ${$i} = func_get_arg($i); $code = preg_replace('/#'.$i.'/',$$i,$code); } return $code; } } function error($msg) // display the last error and terminate { $error = mysql_error(); $errorcode = mysql_errno(); $message = 'Database error in Magicasoft BBman 2:'.$msg.' Database Error:'.error.' Error Code: '.$errorcode.' Date: '.date('F j, Y h:i A').' Script: '.$_SERVER['REQUEST_URI']; echo' <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html> <head> <title>Magicasoft BBman 2 Database Error</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <style type="text/css"> body, p { font-family: verdana,arial,helvetica,sans-serif; font-size: 11px; } </style> </head> <body> <blockquote><p><strong>Fatal error caused by fault in database.</strong><br/> You may try this action again by pressing <a href="javascript:window.location=window.location;">refresh</a>.</p> <p>We apologise for any inconvenience.</p> <form action="null"><textarea rows="10" cols="55">'.$message.'</textarea></form> </blockquote> </body> </html>'; die; } } ?> |
||
![]() |
![]() |
![]() |
#17 | ||
|
|||
Mycket flitig postare
|
Du förstår inte poängen. Genom att göra på ett visst sätt i detta fall är risken/chansen stor att du (eller någon annan som tittar på din kod och skall göra tillägg) gör på samma sätt i andra klasser och förr eller senare kommer det en klass som ändras, men bara på ett ställe. Om du vill gömma dig bakom argument som "bara jag ska hålla på med det här", "när det verkligen behövs kommer jag göra på ett annat sätt" eller "Jag kommer aldrig behöva ändra något i den här klassen" så kan vi sluta diskussionen nu. Jag kommer med tips för att generellt skapa en snyggare och mer lätthanterad kod eftersom prestandavinsten är försumbar i sammanhanget (optimera rätt sak som jag skrev tidigare).
men vill du ha förslag på ändringar? Några mer eller mindre rimliga förändringar: - host skall i konstruktorn skrivas om till ett IP-nummer - alla värden skall ha defaultvärden om de är tomma - php kommer med ett nytt mysql interface som kräver nya parametrar som inte fanns tidigare - Du vill använda en annan databas än mysql vars interface i php kräver fler parametrar Trust me - du kommer inte ångra dig om du låter den ena konstruktorn anropa den andra. Det kan jag garantera. Om du däremot duplicerar kod kanske du inte kommer ångra dig - men det är inte säkert. Det här handlar inte längre om din lilla databasklass. Det handlar om generella principer där kodens läsbarhet och underhålls egenskaper är i ena vågskålen och prestanda i den andra. Det handlar om att välja att optimera sin kod för rätt saker. Något som kan ta ett tag att lära sig. Men du slipper. Kör du med cut-n-paste kod. |
||
![]() |
![]() |
![]() |
#18 | ||
|
|||
Nykomling
|
saxat från php.net :
"For backwards compatibility, if PHP 5 cannot find a __construct() function for a given class, it will search for the old-style constructor function, by the name of the class." Vill The PHP Group vara snälla och berätta för mig varför classen DB ger följande fel ger: Debug Strict (PHP 5): C:\wamp\www\projects\bbman\wd\db\mysql.php line 34 - Redefining already defined constructor for class DB Detta betyder att PHP5 först hittar DB() som konstruktor och sedan hittar __construct() Om det är något som ska redefinera det andra så är det DB() ännu löng från The PHP Group 1. Förklara mer om "host skall i...", varför?, går det att ansluta till alla databaser (som går att ansluta till genom host) genom ip? 2. Tack för tipset fast det görs väl inte i konstruktorn. 3. MySQL Improved är redan känt för mig och det finns en klass för det, inga skillnader på konstruktorn fast på andra metoder. 4. Till projektet finns det 8 olika classer för 8 olika api:s som alla har en konstruktor som ser likadan ut. Be mig inte att posta dem det e mer än 1000 rader kod sammanlagt om ngn vill ha dem så finns alla i projektet BBman2 (magicasoft.net) Tror att jag skippar PHP 5 construktorn tillsvidare |
||
![]() |
![]() |
![]() |
#19 | ||
|
|||
Mycket flitig postare
|
jag tror jag ger upp mitt korståg...
Men för att svara på dina frågor: 1a) Jag kanske vill bespara mig en DNS uppslagning i ett senare tillfälle? 1b) vet du inte att ett namn bara är ett alias för en IP adress? 2) Skulle kunna göras där. 3) Och vad vet du om "MySQL super improved++" som inte ens börjat skapas ännu? 4) Ja och dessa 8 klasser är ju självklart allt som någonsin behövs. Bonus) Nej jag ber dig att inte posta mer kod för det mesta av koden (allt utom konstruktorerna) har ju varit irrelevant. |
||
![]() |
![]() |
![]() |
#20 | ||
|
|||
Nykomling
|
1a) lagt det till min todo till nästa version detta borde tillhöra "optimera rätt grej" delen
1b) Klantade mig oerhört. sorry ![]() 2) tar det när variablerna skapas. Diskutionen stannar nog här. |
||
![]() |
![]() |
Svara |
|
|