2009-04-02 4 views
6

È possibile includere una funzione all'interno di un'altra? Per imparare le funzioni, sto provando a creare una sequenza di combattimento usando PHP. La sequenza sarebbe simile a questa:Posso includere una funzione all'interno di un'altra funzione?

  1. I dadi rotolerebbero, assegnando numeri alle variabili;
  2. I risultati di attacco di Hero1 sono stampati;
  3. I dadi rotolavano, assegnando numeri alle variabili;
  4. I risultati di attacco di Hereo2 sono stampati;
  5. I dadi rotolavano, assegnando numeri alle variabili;
  6. I risultati di attacco di Hero3 sono stampati.

Il lancio dei dadi sarebbe una funzione automatica. Ecco il codice:

<? 
rollSim(); 
combatSim(); 

function rollSim() { 
    $hAttack = rand(1,20); 
    $mDefend = rand(1,20); 
    $mAttack = rand(1,20); 
    $hDefend = rand(1,20); 
    $mDamage = rand(10,25); 
    $hDamage = rand(1,20); 
} // end rollSim 

function combatSim() { 
    rollSim(); 
    if ($hAttack>$mDefend) { 
     print "Hero hit monster for $hDamage damage.<br>"; 
    } else if ($hAttack<=$mDefend) { 
     print "Hero missed monster."; 
    } 
} // end combatSim 

?> 

risposta

4

È possibile richiamare le funzioni l'una dall'altra, certamente ... ma penso che si desidera utilizzare il campo di applicazione di uno in un altro, giusto?

La condivisione dello scopo è un'attività complicata. Ti conviene passare argomenti.

16

La tua funzione rollSim() deve restituire i numeri ottenuti anziché impostare alcune variabili e provare a utilizzarle nell'altra funzione. Li restituirei in un array associativo, in questo modo:

function rollSim() { 
    $roll['hAttack'] = rand(1,20); 
    $roll['mDefend'] = rand(1,20); 
    $roll['mAttack'] = rand(1,20); 
    $roll['hDefend'] = rand(1,20); 
    $roll['mDamage'] = rand(10,25); 
    $roll['hDamage'] = rand(1,20); 

    return $roll; 
} 

function combatSim() { 
    $roll = rollSim(); 

    if ($roll['hAttack'] > $roll['mDefend']) { 
     print "Hero hit monster for {$roll['hDamage']} damage.<br>"; 
    } else if ($roll['hAttack'] <= $roll['mDefend']) { 
     print "Hero missed monster."; 
    } 
} 
+0

Grazie per la risposta; questo è molto molto utile. Domanda di follow-up veloce: potrò avere la funzione "ripetizione" ogni volta? Quindi, ad esempio, avrei bisogno di un set separato di lanci di dadi per hero2 e hero3. Grazie ancora a tutti coloro che hanno risposto. –

+0

Il corpo del secondo se in combatSim non è necessario.(So ​​che hai copiato gli OP se, volevo solo dirlo.) – strager

+0

@Matt, passa i risultati dei rotoli come parametri a combatSim. – strager

9

No, non puoi davvero fare quello che stai chiedendo. Anche se hai incorporato la dichiarazione di combatSim() nella definizione di combatSim() (che puoi fare, è legale ma non ha effetti reali), le variabili che stai impostando in rollSim() sarebbero comunque locali ad esso e inaccessibili per combatSim().

Hai bisogno di un modo migliore per far passare le informazioni che ti interessano. Jeremy Ruten descrive un buon modo. Un altro modo sarebbe definire un oggetto responsabile della modellazione del tuo evento di combattimento e avere rollSim() e combatSim() entrambi metodi su di esso.

class myCombat { 

    private $hAttack; 
    private $mDefend; 
    private $mAttack; 
    private $hDefend; 
    private $mDamage; 
    private $hDamage; 

    function rollSim() { 
     $this->hAttack = rand(1, 20); 
     $this->mDefend = rand(1, 20); 
     $this->mAttack = rand(1, 20); 
     $this->hDefend = rand(1, 20); 
     $this->mDamage = rand(10, 25); 
     $this->hDamage = rand(1, 20); 
    } 

    function combatSim() { 
     $this->rollSim(); 
     if($this->hAttack > $this->mDefend) 
      echo 'Hero hit monster for ' . $this->hDamage . ' damage.<br />'; 
     else 
      echo 'Hero missed monster'; 
    } 

} 

$combat = new myCombat; 
$combat->combatSim(); 
+1

quando hai bisogno di funzioni all'interno delle funzioni è ora di passare a OOP e creare una classe +1 – Mikey1980

2

Se si desidera definire funzioni all'interno funzione in PHP si può fare in questo modo:

 
function a() 
{ 
    function b() 
    { 
     echo 'I am b'; 
    } 
    function c() 
    { 
     echo 'I am c'; 
    } 
} 
a(); 
b(); 
c(); 

è necessario chiamare la funzione di genitore, poi le funzioni all'interno.

3

qui è la funzione di esempio semplice chiamata all'interno della funzione

class Percobaan{ 

    public function coba(){ 
    return "return value"; 
    } 

    public function call(){ 
    //call coba function 
    return $this->coba(); 
    } 

} // end of class percobaan 

//call the method 
$klass = new Percobaan(); 
echo $klass->call(); 

il willbe di uscita:

"return value" 
+0

Sto incollando questo tra i tag php in un file chiamato what.php e caricandolo sul mio server web (php versione 5.6) ... L'output non è "valore restituito" ... Non è nulla (o forse una riga vuota) ... Cosa sto facendo male? – Speckle

+0

scusa ho dimenticato di aggiungere 'return' alla funzione' call() 'e ho editato –

0

che sarebbe una chiusura, se si farebbe.

Problemi correlati