2012-02-25 7 views
5

Come posso passare una classe come parametro nella mia funzionePasso PHP classe come parametro

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

UPDATE

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

}

Così Im chiamando la funzione try_process su scatto del tasto

+0

Se il tuo aggiornamento è ora completo, il tuo problema è che non puoi semplicemente chiamare 'Lotta ($ atk, $ def)', ma piuttosto devi chiamarlo nel formato '$ this-> Lotta ($ atk, $ def) ', in quanto membro della classe. – mkgrunder

+0

Inoltre, si stava usando la proprietà '$ get_dmg' (invece di' $ dmg') in 'Charss :: get_dmg()', che non esisteva. Ho modificato il codice per usare '$ this', e la proprietà che esiste, e ora funziona per me. :) – mkgrunder

+1

Ho trovato questo sperando di capire come passare una _class_ non una _stanza di una classe_. –

risposta

2

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

$sc = new SampleClass(); 

crea un'istanza di SampleClass, ovvero un oggetto.

Presumo che ci sia qualche errore che viene generato altrove poiché quello che hai è corretto. Ho provato il seguente codice e ottenuto i risultati attesi:

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

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

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

di uscita: 4

Se si forniscono ulteriori dettagli della vostra codice vero e proprio che potrebbe essere in grado di determinare il problema.

+0

ive ha pubblicato alcuni codici .. stavo solo cercando alcuni concetti su php è per questo che sto facendo questo .. questi sono i codici di pratica sto lavorando con –

+0

mi mancava $ questo dovrei chiamare la mia funzione $ this-> SampleFunction (& $ refClass) poiché stavo usando richiesto sulle mie pagine –

0

Perché l'argomento della funzione un punto di riferimento? Probabilmente non dovrebbe essere.

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

+0

ho bisogno di esso come riferimento come devo fare modifiche ai membri della proprietà della classe all'interno di quella funzione. È possibile? –

+0

Viene passato come riferimento per impostazione predefinita. Il & non è richiesto. – mkgrunder

1

non riesco a vedere niente di sbagliato con il codice

utilizzando & $ refClass è, tuttavia, non è raccomandata e immagino willbe rimosso dal futuro iterazione della versione di PHP

ma qui è un esempio

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

http://ideone.com/GbmUy

0

Altri hanno risposto abbastanza bene, ma questo è un piccolo esempio stupido per mostrare come modificare la classe (o chiamando il 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 stamperà:

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

hi in realtà ho già quelli che penso .. sono preoccupato per il passaggio di un parametro che il parametro è una classe –