Question

Comment puis-je passer une classe en paramètre dans ma fonction

Jusqu'à présent, j'ai essayé

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


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

c'est un exemple simplifié de ce que je fais..je dois en fait effectuer des procédures complexes dans cet exemple de fonction.Je ne reçois aucune réponse de la fonction exemple.Qu'est-ce que je fais mal?merci

MISE À JOUR

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

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

}

donc j'appelle la fonction try_process en cliquant sur le bouton

Était-ce utile?

La solution

Ce que vous faites réellement, il y a un objet, pas une classe.

$sc = new SampleClass();

crée une instance de sampleclass, aka un objet.

Je suppose qu'il y a une erreur d'être jetée ailleurs comme ce que vous avez est correct. J'ai testé le code suivant et j'ai obtenu la sortie attendue:

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

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

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

sortie: 4

Si vous fournissez plus de détails sur votre code actuel, nous pourrions peut-être déterminer le problème.

Autres conseils

Je ne vois rien de mal à votre code

Utiliser et $ Refclass n'est cependant pas recommandé et je suppose que Willbe est retiré de la future itération de la version PHP

mais voici un exemple

Les objets de classe sont transmis comme référence que je suppose donc pas besoin de "&"

http://ideone.com/gbmuy

Pourquoi l’argument de la fonction est-il une référence ?Cela ne devrait probablement pas être le cas.

A part ça, il n'y a rien de mal à ce que vous ayez posté, donc l'erreur est probablement dans SampleClass.

D'autres personnes ont assez bien répondues, mais c'est un petit exemple idiot pour vous montrer comment modifier la classe (en appelant un constructeur de propriétés ou en définissant des propriétés publiques directement)

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

Ceci produira:

member1 (before): default member 1
member2 (before): default member 2
member1 (after): new member1
member2 (after): new member2

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top