将PHP类作为参数传递

5

如何将类作为参数传递给我的函数

到目前为止,我已经尝试过:

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


function SampleFunction(&$refClass)
{
    echo $refClass->getValue();
}
这是一个我正在做的简单示例,实际上在这个样例函数内我需要执行复杂的过程。但我没有从样例函数中得到任何响应。我做错了什么?谢谢。 更新

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

所以我在按钮点击时调用 try_process 函数。


如果您的更新现在已经完成,那么您遇到的问题是不能简单地调用 Fight($atk,$def),而是需要以 $this->Fight($atk,$def) 的形式调用它,因为它是类的成员。 - mkgrunder
另外,在 Charss::get_dmg() 中,您使用了 $get_dmg 属性(而不是 $dmg),但该属性不存在。我已经编辑了代码以使用 $this 和存在的属性,现在它可以正常运行了。 :) - mkgrunder
2
我发现这个希望找出如何传递一个类而不是类的实例。 - Solomon Ucko
4个回答

2
你实际上传递的是一个对象,而不是一个类。
$sc = new SampleClass();

创建一个SampleClass的实例,也就是一个对象。

我猜测在其他地方可能会抛出一些错误,因为您的代码是正确的。 我测试了以下代码并得到了预期的输出:

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

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

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

输出: 4

如果您提供实际代码的更多细节,我们可能能够确定问题所在。


我发布了一些代码.. 我只是在尝试一些关于 PHP 的概念,所以我才这样做.. 这些是我正在使用的练习代码。 - Philip Badilla
我缺少了$this,我应该调用我的函数$this->SampleFunction(&$refClass),因为我在我的页面上使用了required。 - Philip Badilla

1

我看不出你的代码有什么问题。

然而,不建议使用&$refClass,我猜它会在未来的PHP版本中被移除。

这里有一个例子。

类对象被传递为引用,所以不需要'&'。

http://ideone.com/GbmUy


0

其他人已经回答得很好了,但这是一个简单的例子,展示如何修改类(通过调用属性设置器或直接设置公共属性)

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

这将输出:

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

嗨,我想我已经有了那些东西.. 我担心的是传递一个参数,而这个参数是一个类。 - Philip Badilla

0

为什么函数参数是引用?可能不应该这样。

除此之外,你发布的内容没有问题,所以错误很可能在SampleClass中。


我需要它作为参考,因为我必须对类的属性成员进行更改。这是否可能? - Philip Badilla
默认情况下,它作为引用传递。不需要使用 & 符号。 - mkgrunder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接