Можно ли включить функцию внутри другой функции?

Можно ли включить одну функцию внутри другой? Чтобы изучить функции, я пытаюсь создать последовательность боя с помощью PHP. Последовательность будет выглядеть так:

  1. Кубики будут катиться, присваивая числа переменным;
  2. Печатаются результаты атаки Hero1;
  3. Кубики будут катиться, присваивая числа переменным;
  4. Печатаются результаты атаки Hereo2;
  5. Кубики будут катиться, присваивая числа переменным;
  6. Распечатываются результаты атаки Hero3.

Перемещение кубиков будет автоматизированной функцией. Вот код:

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

rollSim() должна возвращать свернутые числа, а не устанавливать некоторые переменные и пытаться использовать их в другой функции. Я бы вернул их в ассоциативный массив, например:

 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."; } } 

Нет, вы не можете делать то, что вы просите. Даже если вы rollSim() объявление rollSim() в определение combatSim() (которое вы можете сделать, это законно, но не имеет реальных эффектов), переменные, которые вы устанавливаете в rollSim() , по-прежнему будут локальными для него и недоступны by combatSim() .

Вам нужен лучший способ передать информацию, о которой вы беспокоитесь. Джереми Рутен подробно описывает. Другой способ – определить объект, который отвечает за моделирование вашего боевого события, и иметь rollSim() и 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(); 

Конечно, вы можете вызывать функции друг от друга … но я думаю, вы хотите использовать сферу действия одного в другом, правильно?

Объем обмена – это беспорядочный бизнес. Тебе лучше передавать аргументы.

вот простая примерная функция вызова внутри функции

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

выход будет:

 "return value" 

Если вы хотите определить функции внутри функции в PHP, вы можете сделать это следующим образом:

 функция a ()
 {
     функция b ()
     {
         эхо «я б»;
     }
     функция c ()
     {
         эхо «я есть»;
     }
 }
 а ();
 б ();
 с ();

Сначала вы должны вызвать родительскую функцию, затем функции внутри.