Jump to content
php.lv forumi

marrtins

Reģistrētie lietotāji
  • Posts

    1,570
  • Joined

  • Last visited

Everything posted by marrtins

  1. Pamēģini pielikt exclude=mysql* libmysql* pie update un base repo
  2. Nu bļins jāsāk lamāties. Kāda starpība kur un kādā veidā tas tiek noteikts? Galvenais, lai naudas noņemšanas f-ija neļauj veikt darbību. Paziņojot ar return atbilstošu error kodu. Kas to attēlos un kā - arī kāda šķirba? Kaut vai tavs kļūdu attēlotājs, kaut vai custom error handleris, kaut vai die(). F-ijas izsaucējs zin interfeisu un f-ijas return kodus. Kur problēma? Ja dikti nepieciešams pārnest pa call stack, tad var ar array, object, string, kodiem, citām f-ijām - izvēlies. Tas try catch nodrošina, bet var arī bez tā, jo nekāds mega ieguvums tas tāpat nav.
  3. Kāpēc tai f-ijai būtu jānodarbojas ar autorizācijas pārbaudi, konta ielādi? Tam ir citas f-jas. Bet, vai Tavā kodā tas viss bija? :O Kļūdu (ne)paziņošana lai paliek izsaucēja pārziņā - lai kas tas arī būtu CLI vai HTTP vai vienalga kurā vidē un kādā formātā. Laikam pārprati par return array(). Kādā sakarā tam būtu jāsatur *visi* iespējamie stāvokļi vai dati?
  4. Tu esi nekorekti saīsinājis variantu ar IF uz catch. Pirmajā gad Tev jau ir erromsg iestrādāti, turpretim otrajā tie ja arī ir istrādāti, tad kaut kur citur (visticamāk). Tāpat arī ielogošanās pārbaude, acounta esamības pārbaude otrajā gadījumā ir kaut kur citur (iespējams). $account = new Account(); $e = $account->buyWithDollars($price*$amount); if($e ~ E_NOTENOUGHMONEY){ $e = $account->buyWithGold($price*$amount); if($e ~ E_NOTENOUGHMONEY){ return false; } } $account->addItem($itemid, $amount); return true; Ja nepieciešams atgriezt kaut ko vairāk, tad to vispirms vienojamies, ko f-ija atgriež un pieliekam, piemēram, return array( 'error'=>false, 'amount'=>$amount, 'price'$price, ); Ā un tie nested exceptions izskatās pēc totālām drausmām :)
  5. Nu bet vēlreiz - šajā decMoneu un uzreiz addItem iztrūks alternatīvie izpildes ceļi (ņemt naudu no cita maka?). Tāpēc jau ir f-iju un ir definēts, ko tā atgriež. Ja atgriež ne to, kas dokumentācijā - exception, izņēmumstāvoklis. Ja reiz atgriež naudas nav, vai neņem pretī, vai nav autorizēts vai vēl 100 no definētiem errroriem, tad uzreiz attiecīgi var rīkoties nevis vnk padot uz augšu erroru globālam error hanlderim. Kā Tu padosi divus error stāvokļus? Metīsi divus exception? :) Vnk nevajag jaukt kļūdu ar izņēmumstāvokli.
  6. Par lockošanu un transakcijām jau teicu - offtopiks. No sarežģītības neizbēgt, ja reiz tas nepieciešams. Ja f-ijai ir uzdevums atgriezt citas f-ijas rezultātu - tas ir jāparedz un attiecīgi jākodē. Savādāk izklausās, ka tas try catch Tavā gadījumā ir vnk globāls error handleris, kurā kļūdas neapstrādāsi pilnīgi visiem gadījumiem - to daudz ērtāk ir darīt uz vietas pēc konkrētās f-ijas izsaukšanas un pa rokas esot vajadzīgiem parametriem un tajā gadījumā jau vairs nav nekādas nozīmes - catch vai if. Excpetion jau pēc definīcijas ir izņēmumgadījums. Tāds, kas iepr nav definēts. Ar PHP error handleri nepārķersi sintakses kļūdas vai nedefinētas f-ijas izsaukšanu. Lūk piemēram reāls exception: try { include("a.php"); } catch(Exception $e) { print "b"; } Kur a.php satur drazu - nedefinētas f-ijas vai sintakses kļūdas. Ja ar PHP to varētu šādi pārķert būtu labi.
  7. Mainījies stāvoklis? T.i., kaut kur aizmirsās lock vai tiek darīts ārpus transakcijas? Tas jau iet offtopikā. Nav obligāti pārbaudīt vai drīkst (par sliktu jau nenāk, protams). Taču var pārbaudīt f-ijas rezultātu. Ja PHP varētu tāpat kā JS nocatchot sintakses kļūdas vai nedefinētas f-ijas, tad jau varētu sākt par šo sākt domāt. Tāpat to try catch var izmantot, ja viss izsauktas kods vispār met tos exceptionus un maksimāli daudz exceptioni ir sadefinēti (praksē labi ja puse no iespējamām kļūdām vispār ir nodefinētas kā exception). Tas ir faktiski tas pats kad f-ija atgrieztu error flagus: define('E_PARMAZNAUDAS', 1); define('E_NAVAUTORIZĒJIES', 2); define('E_BANNED', 4); define('E_FACECONTROL, 8); utt. Pēc tam $e = doSomething(); if($e ~ E_PARMAZNAUDAS){ rokamzeltu(); } if($e ~ E_NAVAUTORIZĒJIES){ sorryvecais(); } ...
  8. Pietiekami reti tādas izvirtības vispār ir vajadzīgas. Sadārdzina tikai izmaksas un bremzē izstrādi un prasa dubultā testēšanu. Softam taču ir noteiktas prasības. Man ir PC 80286, VGA ar 1MB, HDD 1GB, gribu kapāt GTA4, taisiet manai mentālajai degradācijai graceful degradation.
  9. codez, bet es joprojām neredzu, kurā vietā Tavā kodā tiek mēģināta cits maksājumu veid pie pirmā fail?
  10. Nu kas tas ir, ka neviens nepublicē portfeli? Kauns? Bailes?
  11. codez, nu man sanāk šāds: try{ $account->decMoney($item->priceInMoney()*$ammount); } catch (NepietiekamiBiezs $e) { try { $account->decItem(Model_item::goldid, $item->priceInGold()*$ammount); } catch (NepietiekamiBiezs $e) { ej_strādāt_nes_piķi(); } catch (NavAutotizēts $e) { login_pass_auth(); } finally { crash_ar_lielu_blīkšķi(); } } catch (NavAutotizēts $e) { login_pass_auth(); } finally { crash_ar_lielu_blīkšķi(); }
  12. Es nebiju domājis šādi if ($type==1) $account->decMoney($item->priceInMoney()*$ammount); //buy for money if ($type==2) $account->decItem(Model_item::goldid, $item->priceInGold()*$ammount); //buy for gold Bet if(!$account->decMoney($item->priceInMoney()*$ammount)){ if(!$account->decItem(Model_item::goldid, $item->priceInGold()*$ammount)){ ej_strādāt_nes_piķi(); } } Vnk apstrādājot ar try catch nekas tur daudz īsāk nesanāks.
  13. Viena otra laiku - tas ir kāda nebūt cita laiku? To jau jūs varat tērēt uz nebēdu :)
  14. $account->decMoney($total); - raise exeption. Noķer kontroleris. Ko man darīt, ja es gribu turpat pamēģināt citu maksāšanas metodi vai iešķiet userim soda punktus? Uzreiz tas try catch pārvēršas par tiem pašiem if else
  15. Nu bet Tu tak man demonstrē programmas stāvokli, kas ir zināms - nav nafdas vai nav daudzums. Un tagad uzraksti to pašu ar try catch - tāds pats blāķis vien sanāks.
  16. Nu pie tāda tipa kļūdām, kad nav iespējams izlabot/noteikt stāvokli, ir jākrešo ar lielu blīkšķi un jāsalabo programma.
  17. Kombinējot in_array un array_keys, bet nu labāk, protams, ir isset, ja zināms key.
  18. Nu pati flaga uzstādīšana un noņemšana nevajadzētu tik dramatiski ietekmēt performanci. Nez kāda vella pēc viņi tur šādi ņemās...
  19. Bik pastījos. Tātad: '@' { zend_do_begin_silence(&$1 TSRMLS_CC); } expr { zend_do_end_silence(&$1 TSRMLS_CC); $$ = $3; } Tālāk void zend_do_begin_silence(znode *strudel_token TSRMLS_DC) { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_BEGIN_SILENCE; opline->result.op_type = IS_TMP_VAR; opline->result.u.var = get_temporary_variable(CG(active_op_array)); SET_UNUSED(opline->op1); SET_UNUSED(opline->op2); *strudel_token = opline->result; } void zend_do_end_silence(znode *strudel_token TSRMLS_DC) { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_END_SILENCE; opline->op1 = *strudel_token; SET_UNUSED(opline->op2); } Ko dara opcodi ZEND_BEGIN_SILENCE un ZEND_END_SILENCE? static int ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE SAVE_OPLINE(); Z_LVAL(EX_T(opline->result.var).tmp_var) = EG(error_reporting); Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_LONG; /* shouldn't be necessary */ if (EX(old_error_reporting) == NULL) { EX(old_error_reporting) = &EX_T(opline->result.var).tmp_var; } if (EG(error_reporting)) { do { EG(error_reporting) = 0; if (!EG(error_reporting_ini_entry)) { if (UNEXPECTED(zend_hash_find(EG(ini_directives), "error_reporting", sizeof("error_reporting"), (void **) &EG(error_reporting_ini_entry)) == FAILURE)) { break; } } if (!EG(error_reporting_ini_entry)->modified) { if (!EG(modified_ini_directives)) { ALLOC_HASHTABLE(EG(modified_ini_directives)); zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0); } if (EXPECTED(zend_hash_add(EG(modified_ini_directives), "error_reporting", sizeof("error_reporting"), &EG(error_reporting_ini_entry), sizeof(zend_ini_entry*), NULL) == SUCCESS)) { EG(error_reporting_ini_entry)->orig_value = EG(error_reporting_ini_entry)->value; EG(error_reporting_ini_entry)->orig_value_length = EG(error_reporting_ini_entry)->value_length; EG(error_reporting_ini_entry)->orig_modifiable = EG(error_reporting_ini_entry)->modifiable; EG(error_reporting_ini_entry)->modified = 1; } } else if (EG(error_reporting_ini_entry)->value != EG(error_reporting_ini_entry)->orig_value) { efree(EG(error_reporting_ini_entry)->value); } EG(error_reporting_ini_entry)->value = estrndup("0", sizeof("0")-1); EG(error_reporting_ini_entry)->value_length = sizeof("0")-1; } while (0); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } static int ZEND_FASTCALL ZEND_END_SILENCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zval restored_error_reporting; SAVE_OPLINE(); if (!EG(error_reporting) && Z_LVAL(EX_T(opline->op1.var).tmp_var) != 0) { Z_TYPE(restored_error_reporting) = IS_LONG; Z_LVAL(restored_error_reporting) = Z_LVAL(EX_T(opline->op1.var).tmp_var); EG(error_reporting) = Z_LVAL(restored_error_reporting); convert_to_string(&restored_error_reporting); if (EXPECTED(EG(error_reporting_ini_entry) != NULL)) { if (EXPECTED(EG(error_reporting_ini_entry)->modified && EG(error_reporting_ini_entry)->value != EG(error_reporting_ini_entry)->orig_value)) { efree(EG(error_reporting_ini_entry)->value); } EG(error_reporting_ini_entry)->value = Z_STRVAL(restored_error_reporting); EG(error_reporting_ini_entry)->value_length = Z_STRLEN(restored_error_reporting); } else { zendi_zval_dtor(restored_error_reporting); } } if (EX(old_error_reporting) == &EX_T(opline->op1.var).tmp_var) { EX(old_error_reporting) = NULL; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } Vienvārdsakot - kauko ņemās. Tālāk jau ņem profileri un meklē "vājās" vietas - es tam esmu par slinku :D
  20. Kāda starpība kāpēc lēnāk? To nevajag lietot un viss.
  21. Te kas? Godaddi supports??? Acīmredzot viņu serveriem pietiekami piepildīts mail queue.
  22. ^ drausmas. Es labāk savu FW uzkodējšu nevis tērēšu laiku šāda sviesta apgūšanai.
×
×
  • Create New...