[英]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.