Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何正确初始化一个新类并传递一个用于它的值';s方法_Php - Fatal编程技术网

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

Php 如何正确初始化一个新类并传递一个用于它的值';s方法,php,Php,假设我有以下课程: class Item{ public $itemid; public $itemattribute; function __construct($itemid){ $this->itemid = $itemid; } public function getData(){ $this->itemattribute = foo($itemid); } } 然后我用以下代码启动一个新对象

假设我有以下课程:

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

public function getData(){
    return $this->item_id;
}

这将返回类的项id

您需要在
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
    }
}

创建对象后:

$item = New Item($itemid);
$item->itemid
根据构造函数获取
$itemid
的值


因此,只需在
getData()
方法中使用
$item->itemid
调用函数中的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返回值之前,您的设计对“以正确的顺序调用函数”非常敏感,这对大型类来说是不好的,如果一个计算依赖于之前完成的另一个计算,则更糟糕

错误用法:

$myClass = new Item(5);
$myClass->CalulateA();
$myClass->CalculateB();
$myClass->getB();
更好:

$myClass = new Item(5); //calculates A and B
$myClass->getB();


和这个问题的关系是?它与编辑之前的问题完全相关,因为OP询问getData()函数如何访问item_id变量。我很惊讶你被否决了,因为你是唯一一个返回所示数据的人。投票支持您备份。@karmafunk-1)OP不需要(或想要)返回数据,它是一个公共变量。2) 变量名是
$itemid
而不是
$item\u id
。3) 原始问题没有解释或上下文,因为OP希望使用成员变量的值调用函数
foo()
。因此,他投了反对票。他最初的问题是他想返回价值!你们这些自负的家伙!啧啧。对不起,我编辑它是为了澄清。为什么getData不返回任何内容,名称是getData。该名称意味着我们应该从中获取一些数据。在OOP中,属性也是私有的而不是公共的,例如:public$itemid;应为私有$itemid;在类项的任何方法中,私有$itemid的值;可以通过$this->itemid访问;它不是私有的,因为我以后需要在脚本中从对象输出它。getData不返回任何内容,它只是用我将从对象访问的数据填充所需的变量。这就是所谓的封装(参见此处)。公共属性是糟糕的OOP,只有方法应该是公共的,属性可以获得的最大访问权是受保护的,这只是在特定情况下。感谢您的解释。非常好和有价值的输入。当我启动这个类(我想是迫不及待地加载)时,我想知道如何执行所有填充函数。
$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.