Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: [PHP5] cast tra classi

  1. #1

    [PHP5] cast tra classi

    ho letto qualcosa riguardo il type casting in PHP e cio' che ho scoperto mi e' piaciuto poco. E' possibile solo fare il type cast tra i tipi predefiniti?

    Non è possibile castare un oggetto istanza di una classe ad una classe extended della prima?

    Ad esempio, un po' di codice dal mio lavoro "odierno": una serie di classi per le operazioni in database, con eccezioni e qualche altra aggiunta
    codice:
    class TheClueMySQL extends mysqli {
    
    public function __construct($server, $user, $password, $database){
    
    @parent::__construct($server, $user, $password, $database);
    
    if(mysqli_connect_errno()) throw new TheClueMySQLException(mysqli_connect_error(), mysqli_connect_errno()); 
    }
    
    public function query($sql){
    
    return (TheClueMySqlResult) parent::query($sql);
    
    }
    }
    
    class TheClueMySqlResult extends mysqli_result { }
    Il cast in parentesi (TheClueMySqlResult) provoca errore. Su php.net ho trovato una funzione che, tramite serialize e unserialize, converte una classe in un'altra, ma funziona solo in alcuni casi (ad esempio quando converto un oggetto stdClass in un oggetto da esso derivato le proprietà sono accessibili, ma nn i metodi).

    Supponendo di utilizzare la funzione, che posto di seguito, al posto del typecast che genera errore NON riesco ad accedere ad attributi e metodi della classe appena convertita

    codice:
    function typecast($old_object, $new_classname) {
       if(class_exists($new_classname)) {
           $old_serialized_object = serialize($old_object);
           $old_object_name_length = strlen(get_class($old_object));
           $subtring_offset = $old_object_name_length + strlen($old_object_name_length) + 6;
           $new_serialized_object  = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":';
           $new_serialized_object .= substr($old_serialized_object, $subtring_offset);
           return unserialize($new_serialized_object);
         } else {
             return false;
         }
    }
    forse sto scatenando una tempesta in un bicchiere, ma...beh...sarebbe la prima volta che trovo una limitazione concettuale al buon vecchio PHP (almeno rispetto al java)
    Gabriele B. - http://9thcircle.it

  2. #2
    ...
    public function query($sql){
    return (TheClueMySqlResult) parent::query($sql);
    }
    ...

    class TheClueMySqlResult extends mysqli_result{}




    scusami eh ... forse non ho capito, ma se fai tornare un parent::query non dovresti castare con
    TheClueMySqlQuery per la classe


    class TheClueMySqlQuery extends mysqli_query{}


    ??? :master:



    cosi' e' un po' come fare, a livello teorico:

    return (mysqli_result) mysqli_query($query);

    che non so quanto sia corretto
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    era solo per nn scrivere 2 tonnellate di codice nella pagina

    la mia classe TheClueMySqlResult in realta' nn e' vuota

    cmq il cast ( ... ) come l'ho scritto io provoca un errore...un parse error addirittura. Ma l'ho scritto cosi' in notazione "c++" giusto per far capire cosa intendo fare...

    ...e che nn ho la piu' pallida idea di come si faccia ^^'
    Gabriele B. - http://9thcircle.it

  4. #4
    forse non mi sono spiegato ... a me di quanto o come scrivi importa poco

    il problema e' .

    perche' casti una query a result ?


    Estendi la query o il result ???

    Tu estendi il result con questa ( a prescindere che sia vuota o meno ):
    class TheClueMySqlResult extends mysqli_result{}



    e poi casti un mysqli_query , non un mysqli_result

    return (TheClueMySqlResult) parent::query($sql);

    non casti una query , se A e B non hanno nulla a che fare l' una con l' altra ( come e' per _result e _query ) , aivoglia a castare


    e mi sembra che questo valga anche per Java ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    aaaah, ok capito

    ho fatto una prova, prima:

    echo get_class(mysqli_query($sql))

    ---> mysqli_result Object #1

    quindi quella funzione ritorna un oggetto mysqli_result...come d'altronde mi sembra ragionevole visto che:

    $pippo->mysqli_query($sql)

    e' in effetti un result (ok, dipende da $sql, ma nn sottilizziamo) e posso infatti usare metodi come

    $pippo->fetch_array(...);

    o chiedere attributi pubblici

    $pluto = $pippo->num_rows;

    se neanche stavolta ho capito cosa intendevi...ok...mi sa che nn ho capito nulla ancora ^^'
    Gabriele B. - http://9thcircle.it

  6. #6
    originariamente scritto qui sopra
    echo get_class(mysqli_query($sql))

    ---> mysqli_result Object #1
    e allora questo dovrebbe suggerirti che la prossima cosa da tentare e' questa ...


    codice:
    class TheClueMySqlResult extends mysqli_query{}

    e lasciare sopra
    codice:
     return (TheClueMySqlResult) parent::query($sql); 
     // parent::query => mysqli_result
     // (mysqli_query)TheClueMySqlResult => mysqli_result

    o no ???
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    class TheClueMySqlResult extends mysqli_query{}
    ma mysqli_query nn è un oggetto...cioe'...nn credo almeno Oo

    return (TheClueMySqlResult) parent::query($sql);
    // parent::query => mysqli_result
    // (mysqli_query)TheClueMySqlResult => mysqli_result
    beh, a prescindere dal guazzabuglio di oggetti, resta il fatto che questa dicitura torna un parse error grosso quanto giuliano ferrara
    Gabriele B. - http://9thcircle.it

  8. #8
    Originariamente inviato da TheClue/Nash
    beh, a prescindere dal guazzabuglio di oggetti, resta il fatto che questa dicitura torna un parse error grosso quanto giuliano ferrara
    hai provato a cambiare l' extends ???

    se si, devo fare prove, fino ad ora ho scritto senza testare

    se no , devi prima cambiare l' extends , poi usare il codice di prima ...

    ancora piu' utile



    try {
    $result = (TheClueMySqlResult) parent::query($sql);
    return $result;
    }
    except(Exception $e) {
    die($e->getMessage());
    }



    e se ci dici quel getMessage cosa contiene magari ne veniamo a capo, ora sono stanchizzimo


    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9
    sono a pezzi pure io, ma nn demordo

    come ti dicevo, cmq, finche' nn tolgo il parse error c'e' poco da controllare

    sul manuale di php.net, cmq, nn sembra esservi scritto che mysqli_query lancia una eccezione...
    Gabriele B. - http://9thcircle.it

  10. #10

    una mezza idea...

    ok, appurato che il cast tra classi NON si può fare (letto un post su un forum da un tipo della zend...piu' sicuro di cosi'...) pensavo ad un possibile workaround. è qualcosa che in java si vede abbastanza spesso

    pippo = AstrattissimoStream(MoltoAstrattoStream(AstrattoSt ream(Stream(pluto)))))

    la classe TheClueMySql potrebbe essere qualcosa tipo

    codice:
    class TheClueMySqlResult{
    
    public function __construct(mysqli_result){
    
    // doh!
    
    }
    
    }
    e nella funzione query qualcosa del tipo:

    return new TheClueMysqlResult(parent::query($sql));

    l'oggetto tornato da query è inequivocabilmente istanza di TheClueMysqlResult

    ecco...problema grosso: che diavolo ci metto nel constructor di TheClueMySqlResult per renderlo, diciamo cosi', "uguale" ad un oggetto mysqli_result?

    (notare che l'oggetto nn e' piu' extends di mysqli_result quindi in qualche modo bisogna pur fare ^^')

    idee?

    (io sto definitivamente impazzendo, qui dentro)
    Gabriele B. - http://9thcircle.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.