如何正确初始化一个新类并传递一个值用于它';s方法


how to properly initialize a new class and pass a value to use for it's methods

假设我有以下类:

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函数。

要调用函数中的itemid,只需在函数内部加载即可。
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