Можно ли включить одну функцию внутри другой? Чтобы изучить функции, я пытаюсь создать последовательность боя с помощью PHP. Последовательность будет выглядеть так:
Перемещение кубиков будет автоматизированной функцией. Вот код:
<? 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 () { эхо «я есть»; } } а (); б (); с ();
Сначала вы должны вызвать родительскую функцию, затем функции внутри.