簡體   English   中英

如何在 PHP 的 object 中使用對象並訪問它們的方法?

[英]How do I use objects and access their methods while within an object in PHP?

當我在 object 中時,如何使用 object(及其方法和屬性)?

假設我有這樣的無用類:

class Fruit {
    private $name;          // Name of the fruit.
    private $health = 10;   // 0 is eaten, 10 is uneaten.
    private $object;        // This is a PHP object.

    public function __construct($name) {
        $this->name = $name;
    }

    public function set($varname,$value) {
        $this->$varname = $value;
    }
}

class Eater {
    private $name;

    public function eat($object) {
        $object->set('health',0);    // I know I can pass and modify objects like this.
        // The object is passed by reference in PHP5 (but not 4), right?
    }
}

我這樣使用它:

<?php
    $pear = new Fruit("Pear");
    $apple = new Fruit("Apple");

    $paul = new Eater("Paul");
    $paul->eat($apple);
?>

但是,如果我像這樣修改 Eater class :

class Eater {
    private $name;
    private $objectToEat;    // Let's say if I need the object to be over here instead of in a method.

    public function set($varname,$value) {
        $this->$varname = $value;
    }

    public function eat() {
        $this->objectToEat->set('health',0);    // This doesn't work!
    }
}

並像這樣設置主程序:

<?php
    $pear = new Fruit("Pear");
    $apple = new Fruit("Apple");

    $paul = new Eater("Paul");
    $paul->set('objectToEat',$apple);
    $paul->eat();
?>

如何從方法內部訪問對象的屬性? 我知道我使用$this->objectToEat objectToEat 來告訴 PHP 我說的是 class 屬性,但由於該屬性是 ZA8CFDE6331BD59EB2AC96F8911C4B 方法666Z,我如何訪問該對象?

我試過$this->objectToEat->set('health',0)但這不起作用。 我希望你們能理解我想要表達的意思(對不起,我無法弄清楚如何在不影響清晰度的情況下濃縮我的問題)!

您必須正確設置屬性。 由於它是private的,因此不能從 object 之外執行此操作,因此必須使用封裝:

class Eaters {
    private $name;
    private $objectToEat;

    public function eat() {
        $this->objectToEat->set('health',0);    // Assumed "object" was just a typo
    }

    public function setObjectToEat($object) {
        $this->objectToEat = $object;
    }
}

然后像這樣使用它:

<?php
    $pear = new Fruit("Pear");
    $apple = new Fruit("Apple");

    $paul = new Eater("Paul");
    $paul->setObjectToEat($apple);
    $paul->eat();
?>

注意:在這個簡短的示例中,您的原始方法是更好的設計。 在某些情況下,您可能希望通過預先設置屬性來啟動要使用的方法,但更多時候您希望直接使用參數調用它,因為它更清晰且更可重用(分區)。

這可能是因為您的 eat 方法不接受任何參數,而 Eaters class 沒有 $object 屬性。

    class Tester {
       private $variable;
       private $anObj;

       public function testFn($val) {
           $this->variable = $val;
           $this->anObj = new SecondObj();
           $this->doSomething();
       }

       public function doSomething() {
           echo("My variable is set to " . $this->variable);
           $this->anObj->wow();
       }
    }

   class SecondObj {
       public function __construct() {
           echo("I'm new!");
       }
       public function wow() { echo("Wow!"); }
   }

    $tester = new Tester();
    $tester->testFn(42);

Output:

I'm new!My variable is set to 42Wow! 

你可以讓 $objectToEat 成為一個引用,然后在eat() function 中使用它嗎?

你必須在 class Eaters 中設置 $this->object

function __construct($object){
    $this->object = $object;
}

或者

<?php
    $pear = new Fruit("Pear");
    $apple = new Fruit("Apple");

    $paul = new Eater("Paul");
    $paul->eat($apple);
?>

這個答案修改了 Renesis 的答案

在 class 中,吃的 object 是私有變量,因此您不能 go

$paul->objectToEat = $apple;

你可以做的是在 Eaters 中創建一個 setter 方法

class Eaters {    
    private $name;    
    private $objectToEat;

    public function eat() {        
        $this->objectToEat->set('health',0); // Assumed "object" was just a typo    
    }

    public function setFood($object) {
        $this->objectToEat = $object;
    }
}

因此,您可以改為調用setFood()方法。

或者

eat()更改為

public function eat($object) {
    $this->object->set('health',0);
    return $object;
}

將修改后的 object 保存回原始變量。

或者

class Eaters {
    private $name;

    public function eat(&$object) { // this passes object by reference
        $object->set('health', 0);
    }
}

盡管此代碼未經測試,但您可以通過引用傳遞變量。

注意:您只在定義方法時需要& ,而不是在傳遞參數時。 有關按參考傳遞 go 的更多信息,請訪問此鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM