Jump to content
php.lv forumi

marrtins

Reģistrētie lietotāji
  • Posts

    1,570
  • Joined

  • Last visited

Posts posted by marrtins

  1. Ja tu saki, ka tavā variantā arī tas viss, tad parādi, kā tu nosaki, ka šo funkciju drīkst izpildīt tikai autorizēts lietotājs, kā tiek ģenerēta kļūda un kā tā tiek padota vietai, kur tā tiek attēlota?Jā, lai paliek, bet kā tas izsaucējs zinās, kāda tieši kļūda ir un kas ir jāpaziņo? Un kā tu savā gadījumā šo kļūdas stāvokli pārnesīsi no augstāk izsauktām funkcijām uz zemākām.Visi iespējami domāts, ka kļūdas var būt dažādas - vienai ir paziņojums, citai kaut kas jāielogo, citai vēl kaut kas. Visa šī informācija tev būtu jāpārnes caur šo array(). Kamēr eksepšanu gadījumā katrs kļūdas veids ir klase, kura smugi glabā viskompleksākos datus, ja tas nepieciešams un par kuras pārnešanu nav jāuztraucas, jo try catch mehānisms to nodrošina.

    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.

  2. 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?

  3. 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 :)

  4. 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.

  5. 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.

  6. 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();
    }
    ...
    
     
  7. 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();
    }
    
     
  8. 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.

  9. 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

×
×
  • Create New...