Ben başka bir işlev içinde bir fonksiyon içerir miyim?

4 Cevap php

Bunun içerisinde başka bir fonksiyon dahil etmek mümkün mü? Fonksiyonlarını öğrenmek, PHP kullanarak bir savaş dizisi oluşturmak için çalışıyorum. Dizisi, bu gibi görünecektir:

  1. Zar değişkenlere numaraları atayarak, rulo olacak;
  2. Hero1 saldırı sonucu yazdırılır;
  3. Zar değişkenlere numaraları atayarak, rulo olacak;
  4. Hereo2 saldırı sonucu yazdırılır;
  5. Zar değişkenlere numaraları atayarak, rulo olacak;
  6. Hero3 saldırı sonucu yazdırılır.

Zar haddeleme otomatik bir fonksiyonu olacaktır. İşte kod:

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

?>

4 Cevap

Sizin rollSim() function gerektiği return yerine bazı değişkenleri belirleme ve diğer işlevi kullanmak için çalışırken daha devirdi sayılar. Ben böyle bir ilişkisel dizi onları dönecekti:

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

Hayır, gerçekten soruyorsun ne yapamaz. Eğer rollSim() combatSim() (bunu hangi, bu yasal ama gerçek etkileri vardır) tanımı içindeki beyanını gömülü bile, değişkenleri ([{ayarı konum 0)]} hala yerel ve combatSim() tarafından erişilemez olacaktır.

Sizinle ilgili konum bilgileri etrafında geçen daha iyi bir yol gerekir. Jeremy Ruten iyi bir şekilde ayrıntıları. Başka bir yol üzerinde yöntemler olarak hem savaş olay modelleme sorumlu bir nesneyi tanımlar ve rollSim() ve combatSim() sahip olacaktır.

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

Kesinlikle, birbirinden işlevleri çağırabilirsiniz ... ama doğru başka biri kapsamını kullanmak istiyorum?

Kapsam Paylaşım pis bir iş. Sen argüman ileterek daha iyi.

PHP fonksiyonu içerisinde işlevleri tanımlamak isterseniz bunu şöyle yapabilirsiniz:

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

Sen içindeki işlevleri sonra, ilk ana işlevini çağırmalıdır.