ある関数を別の関数の中に含めることは可能ですか?関数を学ぶために、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()
関数は、いくつかの変数を設定して他の関数で使用しようとするのではなく、ロールされた数値をreturnする必要があります。次のように、連想配列でそれらを返します。
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()
の定義内にcombatSim()
の宣言を埋め込んだとしても(これは可能ですが、それは合法ですが、実際の効果はありません)、rollSim()
はまだローカルであり、combatSim()
からはアクセスできません。
関心のある情報を渡すためのより良い方法が必要です。ジェレミー・ルーテンは良い方法を詳しく説明しています。もう1つの方法は、戦闘イベントのモデリングを担当するオブジェクトを定義し、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();
確かに、関数を相互に呼び出すことはできます...しかし、相互にスコープを使用したいと思いますよね?
スコープの共有は厄介なビジネスです。引数を渡したほうがいいです。
PHPの関数内で関数を定義したい場合は、次のように行うことができます。
function a() { function b() { echo'I am b '; } function c() { echo'I am c '; } } a(); 紀元前();
最初に親関数を呼び出し、次に内部の関数を呼び出す必要があります。
これが関数内の関数呼び出しの簡単な例です
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"
あなたがそうするならば、それは閉鎖になるでしょう。