2009-04-02 20 views
6

¿Es posible incluir una función dentro de otra? Para aprender funciones, intento crear una secuencia de combate usando PHP. La secuencia se vería así:¿Puedo incluir una función dentro de otra función?

  1. Los dados rodaban, asignando números a las variables;
  2. Se imprimen los resultados de los ataques de Hero1;
  3. Los dados rodaban, asignando números a las variables;
  4. Se imprimen los resultados del ataque Hereo2;
  5. Los dados rodaban, asignando números a las variables;
  6. Se imprimen los resultados del ataque de Hero3.

los Rolling dados sería una función automatizada. Aquí está el código:

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

?> 

Respuesta

4

Puede llamar a funciones entre sí, desde luego ... pero creo que desea utilizar el alcance de una en otra, ¿correcto?

Compartiendo alcance es un asunto complicado. Es mejor pasar argumentos.

16

Su función rollSim() debe volver los números lanzados en lugar de establecer algunas variables y tratar de utilizarlos en su otra función. Me gustaría devolver el producto en una matriz asociativa, así:

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

Gracias por responder; esto es muy, muy útil. Pregunta de seguimiento rápido: ¿podré tener la función "volver a lanzar" cada vez? Entonces, por ejemplo, necesitaría un juego separado de dados para hero2 y hero3. Gracias de nuevo a todos los que han respondido. –

+0

El cuerpo del segundo si está en combateSim no es necesario.(Sé que copió los OP si, solo quería mencionarlo) – strager

+0

@Matt, pase los resultados de los rollos como parámetros para combatirSim. – strager

9

No, realmente no se puede hacer lo que preguntas. Incluso si incluyó la declaración de rollSim() dentro de la definición de combatSim() (que puede hacer, eso es legal pero no tiene efectos reales), las variables que establezca en rollSim() seguirán siendo locales e inaccesibles por combatSim().

Se necesita una mejor manera de pasar alrededor de la información que está preocupado con. Jeremy Ruten detalla una buena manera. Otra forma sería definir un objeto que sea responsable de modelar su evento de combate y tener los dos métodos rollSim() y combatSim().

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

cuando necesite funciones dentro de funciones es hora de ir a OOP y hacer una clase +1 – Mikey1980

2

Si desea definir funciones dentro de la función en PHP que puede hacerlo de esta manera:

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

debe llamar a la función de los padres en primer lugar, a continuación, las funciones dentro.

3

aquí es la función ejemplo simple llamada dentro de la función

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(); 

la willbe de salida:

"return value" 
+0

Estoy pegando esto entre php-tags en un archivo llamado whatever.php y cargándolo a mi servidor web (php versión 5.6) ... La salida no es "valor de retorno" ... No es nada (o posiblemente una línea vacía) ... ¿Qué estoy haciendo mal? – Speckle

+0

lo siento, me olvidé de agregar 'return' a la función' call() ', y he editado –

0

Eso sería un cierre si lo haría.

Cuestiones relacionadas