假设我有以下类:
class Item{
public $itemid;
public $itemattribute;
function __construct($itemid){
$this->itemid = $itemid;
}
public function getData(){
$this->itemattribute = foo($itemid);
}
}
然后我用这个代码启动一个新对象:
$item = New Item($itemid);
$item->getData();
var_dump($item);
基本上,我要做的是,在初始化对象时定义$itemid
,在调用$item->getData
时,让它使用之前定义的$itemid
执行该函数。这是我第一次尝试从头开始编写OOP,所以请耐心等待。问题是$itemid
没有传递给getData
中的foo
函数。
class Item{
public $itemid;
public $itemattribute;
function __construct($itemid){
$this->itemid = $itemid;
}
public function getData(){
$itemid = $this->itemid; // or
// simply. do what ever you want to itemid
$this->itemid;
return $this->itemattribute = foo('bar');
// you should have return
}
}
这种方法似乎是正确的(除了你需要使用$this->来访问属性(,但是:给自己做一个调味,看看getter和setter是如何正常使用的。getter应该返回一些东西,而setter应该设置一些东西。如果你需要在内部做一些"事情",你应该使用另一种方法,甚至在构造函数中做,等等
class Item{
public $itemid;
public $itemattribute;
function __construct($itemid){
$this->itemid = $itemid;
}
public function getItemId(){
return $this->itemid;
}
//option 1:)
public function calculateAttributeValue(){
$this->itemAttribute = foo($this->itemid);
}
//option 2:)
public function calculateAttributeValue($func){
$this->itemAttribute = $func($this->itemid);
}
//option 3:) (lazy loading)
public function getItemAttribute(){
if ($this->itemAttribute == null){
$this->itemAttribute = foo($this->itemid);
}
return $this->itemAttribute;
}
//option 4 (eager loading)
function __construct($itemid){
$this->itemid = $itemid;
$this->itemAttribute = foo($this->itemid);
}
public function getItemAttribute(){
return $this->itemAttribute;
}
}
然而,这是一个好主意,要么使用热切加载,要么使用懒惰加载。每当你需要"调用"另一个函数来计算一个值时,在getter返回值之前,你的设计就会对"以正确的顺序调用函数"变得敏感,这对大型类来说是不好的,更糟糕的是,如果一个计算依赖于之前完成的另一个计算。。。
错误的usagE:
$myClass = new Item(5);
$myClass->CalulateA();
$myClass->CalculateB();
$myClass->getB();
更好:
$myClass = new Item(5); //calculates A and B
$myClass->getB();
或
$myClass = new Item(5);
$myClass->getA(); //calculates A.
$myClass->getB(); //calculates B and A when required.
您需要在getData
函数中使用$this->itemid
而不是$itemid
来提取值,以便将值"传递"给函数:
class Item{
public $itemid;
public $itemattribute;
function __construct($itemid){
$this->itemid = $itemid;
}
public function getData(){
// echo $this->itemid; // This will print the same value you passed to the constructor
$this->itemattribute = foo( $this->itemid); // <-- HERE
}
}
请注意,如果您期望getData()
的值,则需要返回以下内容:
public function getData(){
$this->itemattribute = foo( $this->itemid);
return $this->itemattribute;
}
创建对象后:
$item = New Item($itemid);
$item->itemid
根据您的构造函数取$itemid
的值。
所以只需在getData()
方法中使用$item->itemid
public function getData(){
return $this->item_id;
}
这将返回类的项目id