Passer la classe PHP comme paramètre
-
12-11-2019 - |
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
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 "&"
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