Domanda

Come posso passare una classe come parametro nella mia funzione

Finora ho provato

$sc = new SampleClass();
SampleFunction($sc);


function SampleFunction(&$refClass)
{
    echo $refClass->getValue();
}

Questo è un esempio semplificato di ciò che sto facendo. In realtà devo fare procedure complesse all'interno di questa funzione di esempio. Non ricevo alcuna risposta dalla funzione di esempio. Che cosa sto facendo di sbagliato? grazie

AGGIORNARE

char.php

   class Charss {
    var $name=0;
    var $hp=500;
    var $spd=10;
    var $rtime=10;
    var $dmg=10;

    function __construct( $name, $hp, $spd, $rtime , $dmg) { 
            $this->name = $name;
            $this->hp = $hp;
            $this->spd  = $spd;
            $this->rtime = $rtime;
            $this->dmg = $dmg;
        }

    function get_name() {
        return $this->name;
    }

    function set_name($new_name) {
        $this->name = $new_name;
    }

    function get_hp() {
        return $this->hp;
    }

    function set_hp($new_hp) {
        $this->hp = $new_hp;
    }

    function get_spd() {
        return $this->spd;
    }

    function set_spd($new_spd) {
        $this->spd = $new_spd;
    }

    function get_rtime() {
        return $this->rtime;
    }

    function set_rtime($new_rtime) {
        $this->rtime = $new_rtime;
    }

    function get_dmg() {
        return $this->get_dmg;
    }

    function set_dmg($new_dmg) {
        $this->dmg = $new_dmg;
    }
}

myclass.php

    require("char.php");
class Person {

function try_process()
{
    $chr1 = new Charss("Player1",500,3,0,50);
    $chr2 = new Charss("Player2",500,6,0,70);

    while ($chr1->get_hp() > 0 && $chr2->get_hp() > 0)
    {
        $sth = min($chr1->get_rtime(), $chr2->get_rtime());
        if ($chr1->get_rtime() == 0 && $chr2->get_rtime() > 0)
        {
            exit;
            Fight($chr1,$chr2);
            $chr1->set_rtime($chr1->get_spd());
        }
        elseif ($chr2->get_rtime() == 0 && $chr1->get_rtime() > 0)
        {
            Fight($chr2,$chr1);
            $chr2->set_rtime($chr2->get_spd());
        }
        else 
        {
            Fight($chr1,$chr2); #having trouble with this
            $chr1->set_rtime($chr1->get_spd());
        }
        $chr1->set_rtime($chr1->get_rtime() - $sth);
        $chr2->set_rtime($chr2->get_rtime() - $sth);
    }
}

function Fight($atk,$def)
{
    $def->set_hp($def->get_hp() - $atk->get_dmg());
    echo $atk->get_name() . " attacked " . $def->get_name() . " for " . $atk->get_dmg() . " damage";
}

}

quindi sto chiamando la funzione try_process sul pulsante clic

È stato utile?

Soluzione

Quello che stai effettivamente facendo è passare un oggetto, non una classe.

$sc = new SampleClass();

Crea un'istanza di campionamento, alias un oggetto.

Presumo che ci sia un errore che viene lanciato altrove poiché quello che hai è corretto. Ho testato il seguente codice e ho ottenuto l'output previsto:

class SampleClass
{
    public function getValue()
    {
        return 4;
    }
}

$sc = new SampleClass();
SampleFunction($sc);

function SampleFunction(&$refClass)
{
    echo $refClass->getValue();
}

Output: 4

Se fornisci maggiori dettagli sul tuo codice effettivo, potremmo essere in grado di determinare il problema.

Altri suggerimenti

Non riesco a vedere nulla di sbagliato nel tuo codice

L'utilizzo di e $ refclass non è tuttavia consigliato e immagino che Willbe sia rimosso dalla futura iterazione della versione PHP

Ma ecco un esempio

Gli oggetti di classe vengono passati come riferimento suppongo, quindi non c'è bisogno di "&"

http://ideone.com/gbmuy

Perché l'argomento della funzione è un riferimento? Probabilmente non dovrebbe esserlo.

A parte questo, non c'è niente di sbagliato in te pubblicato, quindi l'errore è probabilmente dentro SampleClass.

Altri hanno risposto abbastanza bene, ma questo è un piccolo esempio sciocco per mostrarti come modificare la classe (chiamando un setter di proprietà o impostando direttamente le proprietà pubbliche)

class foo {
    private $member1;
    public  $member2;

    public function __construct($member1,$member2) {
            $this->member1=$member1;
            $this->member2=$member2;
    }

    public function SetMember1($value) {
            $this->member1 = $value;
    }
    public function GetMember1() {
            return $this->member1;
    }
}

function SetMembers(foo $obj, $member1, $member2) {
    // Call a setter
    $obj->SetMember1($member1);

    // Set a member variable directly
    $obj->member2 = $member2;
}

$obj = new foo('default member 1', 'default member 2');

echo "member1 (before): {$obj->GetMember1()}\n";
echo "member2 (before): {$obj->member2}\n";

// Change values
SetMembers($obj, 'new member1', 'new member2');

echo "member1 (after): {$obj->GetMember1()}\n";
echo "member2 (after): {$obj->member2}\n";

Questo emetterà:

member1 (before): default member 1
member2 (before): default member 2
member1 (after): new member1
member2 (after): new member2
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top