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.