Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Capire se un metodo di una classe ha argomenti

    Salve a tutti,

    E' possibile capire se un metodo di una determinata classe ha o no argomenti (e se si, quanti) nella sua defizione partendo dal nome stesso della classe? una cosa tipo:
    $numero = dimmi_quanti_sono("NomeClasse", "NomeMetodo");

    A quanto ho capito, func_num_args non farebbe al caso mio (o sbaglio?) perchè viene utilizzata all'interno della funzione stessa, mentre invece io ho la necessità di passare a "dimmi_quanti_sono" qualsiasi tipo di classe/metodo. Forse esiste qualcosa tra le Reflection..Qualcuno potrebbe gentilmente aiutarmi?

    Grazie mille in anticipo
    "La luce e' piu' veloce del suono. Per questo motivo alcune persone sembrano brillanti fino a quando non parlano."

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    $blah = new ReflectionMethod('classe', 'metodo');
    echo $blah->getNumberOfParameters();

  3. #3
    Fantastico, grazie
    "La luce e' piu' veloce del suono. Per questo motivo alcune persone sembrano brillanti fino a quando non parlano."

  4. #4
    Scusa la curiosità, come mai devi sapere prima il numero di argomenti?
    Mi fai un esempietto, che magari potrebbe tornarmi utile in futuro?


  5. #5
    Ciao, certamente

    In pratica sto scrivendo (con semplici fini didattici) un piccolo sistema MVC prendendo spunto da CI, quindi con il classico url controller/method/args

    Nella mia classe di Routing, in cui analizzo la chiamata, prima di invocare il metodo in questione (mettiamo il caso di avere come url blog/leggi/10 ), io devo capire a priori se il metodo (in questo caso "leggi", del controller "blog") richiede o no argomento/i, per poi controllare se nell'URL è stato definito correttamente (in questo caso per leggere il post ho bisogno del suo identificativo, che sarebbe 10).

    Ovviamente questo è solo uno dei tanti controlli da fare prima di invocare il tutto, ma proprio non trovavo niente tra le Reflection e getNumberOfParameters mi era sfuggito
    "La luce e' piu' veloce del suono. Per questo motivo alcune persone sembrano brillanti fino a quando non parlano."

  6. #6

  7. #7
    Puoi anche non controllare il numero di parametri, che potrebbe essere magari una limitazione. Soprattutto se nella funzione definisci i parametri (e li definisci non nullabili) e poi non passi il numero di parametri corretto, php stesso ti da errore... in un mvc tale errore verrebbe intercettato dal framework e gestito nella maniera opportuna

    Codice PHP:

    //il tuo controller

    class Controller{
        
        
        public function 
    metodo($arg1,$arg2){
        
            echo 
    "arg1: $arg1 \n";
            echo 
    "arg2: $arg2 \n";
            
    $args func_get_args();
            echo 
    "args: ".print_r($args,true);
            
        }
        
    }


    //nel routing
    $method 'metodo';
    $args = array("hello","world","others","arguments");
    $controller 'Controller';

    //usando la reflection
    $reflector = new ReflectionClass($controller);

    if(
    $reflector->hasMethod($method)){
        
        
    $reflectorMethod $reflector->getMethod($method);
        
        if(
    $reflectorMethod->isPublic()){ //potrebbe essere statico volendo(?)
            //istanzio il controller
            
    $mController = new $controller();
                    
    //richiamo il metodo
            
    $reflectorMethod->invokeArgs($mController,$args);
        }else{
            echo 
    "metodo $method non è pubblico";    
        }
    }else{
    echo 
    "metodo $method non esiste";    

    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    Ciao,
    intanto grazie per l'approfondimento. E' la prima volta che mi avvicino alle Reflection, sto piano piano capendone le potenzialità (veramente comode).

    Diciamo che il mio Routing è molto simile, i controlli che eseguo sono circa gli stessi.
    L'unica differenza (che ovviamente non conoscevo) era invokeArgs (io usavo call_user_func e call_user_func_array e da qui il motivo di capire se aveva argomento o no, dentro un bruttissimo if ).

    Comunque grazie
    "La luce e' piu' veloce del suono. Per questo motivo alcune persone sembrano brillanti fino a quando non parlano."

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 © 2024 vBulletin Solutions, Inc. All rights reserved.