2012-02-25 15 views
5

Làm thế nào tôi có thể vượt qua một lớp học như một tham số trong chức năng của tôiđèo PHP Class như Parameter

Cho đến nay tôi đã cố gắng

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


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

đây là một ví dụ đơn giản về những gì im làm .. tôi thực sự phải làm các thủ tục phức tạp bên trong hàm mẫu này. Tôi không nhận được bất kỳ phản ứng nào từ chức năng mẫu. Tôi đang làm gì sai? cảm ơn bạn

CẬP NHẬT

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

}

để im gọi hàm try_process trên nút, hãy nhấp vào

+0

Nếu cập nhật của bạn đã hoàn tất, vấn đề của bạn là bạn không thể gọi đơn giản là 'Chiến đấu ($ atk, $ def) ', mà cần gọi nó dưới dạng' $ this-> Fight ($ atk, $ def) ', vì nó là thành viên của lớp. – mkgrunder

+0

Ngoài ra, bạn đang sử dụng thuộc tính '$ get_dmg' (thay vì' $ dmg') trong 'Charss :: get_dmg()', không tồn tại. Tôi đã chỉnh sửa mã để sử dụng '$ this' và thuộc tính hiện tồn tại và nó hiện đang chạy cho tôi. :) – mkgrunder

+1

Tôi thấy điều này hy vọng tìm ra cách vượt qua một _class_ không phải là một _instance của một class_. –

Trả lời

2

Những gì bạn đang thực sự làm ở đó là truyền một đối tượng, không phải là một lớp.

$sc = new SampleClass(); 

tạo một phiên bản của SampleClass, còn gọi là đối tượng.

Tôi cho rằng có một số lỗi được đưa ra ở nơi khác vì những gì bạn có là chính xác. Tôi đã thử nghiệm đoạn mã sau và có sản lượng dự kiến:

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

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

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

Output: 4

Nếu bạn cung cấp thêm thông tin chi tiết của mã thực tế của bạn mà chúng ta có thể xác định được vấn đề.

+0

ive đăng một số mã .. tôi đã chỉ cố gắng một số khái niệm trên php đó là lý do tại sao im làm điều này .. đây là những mã thực hành im làm việc với –

+0

tôi đã thiếu $ này tôi nên gọi chức năng của tôi $ this-> SampleFunction (& $ refClass) kể từ khi tôi đã được sử dụng yêu cầu trên các trang của tôi –

0

Tại sao tham số hàm tham chiếu? Có lẽ không nên.

Ngoài ra, không có gì sai với bạn đã đăng, do đó, có khả năng lỗi trong phạm vi SampleClass.

+0

tôi cần nó như là tài liệu tham khảo như tôi phải làm thay đổi cho các thành viên bất động sản của lớp trong chức năng đó. là nó có thể? –

+0

Nó được chuyển làm tham chiếu theo mặc định. & Không bắt buộc. – mkgrunder

1

Tôi không thể nhìn thấy bất cứ điều gì sai trái với mã của bạn

sử dụng & $ refClass được tuy nhiên không được khuyến khích và tôi đoán willbe khỏi lặp tương lai của phiên bản PHP

nhưng đây là một ví dụ

đối tượng lớp học được truyền dưới dạng tham chiếu mà tôi cho là không cần '&'

http://ideone.com/GbmUy

0

Những người khác đã trả lời khá tốt, nhưng đây là một ví dụ nhỏ ngớ ngẩn để cho bạn thấy làm thế nào để sửa đổi các lớp (hoặc bằng cách gọi một setter tài sản, hoặc thiết lập các thuộc công trực tiếp)

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

chí đầu ra này:

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

hi thực sự có những người đã tôi nghĩ .. im quan tâm về việc đi qua một tham số mà tham số là một lớp –