我曾尝试在网上搜索此内容,但无法找到解决问题的方法。
我正在实施一个购物车,它会将一些变量发送到PayEx付款,但我正在努力处理一些Class和Public变量。
代码:
class PayEx
{
public $price = '00';
//$respons is xml
private $respons;
private $orderRef;
function initialization()
{
$this->clientIPAddress = $_SERVER['REMOTE_ADDR'];
$this->clientIdentifier = "USERAGENT=".$_SERVER['HTTP_USER_AGENT'];
$params = array
(
'price' => $this->price
);
return $params;
}
....
在此代码之前,我有一个SQL查询设置$mainPrice
的值,所以我想做的是这样的:
class PayEx
{
public $price = $mainPrice;
}
但这不起作用,我做错了什么?
答案 0 :(得分:4)
在此代码之前,我有一个SQL查询,用于设置
的值$mainPrice
好的,您想将其值分配给$price
属性。在这种情况下:编写一个以$mainPrice
作为参数的构造函数,并将其分配给$price
属性。
详情如下所述
这非常简单:$mainPrice
(可能)是一个全局变量(is evil,但这不是重点)。 PayEx
类有自己的范围。它的属性将使用构造函数中的常量值或进行初始化(使用传递给它的参数)。
一个类是一个可移植的单个代码单元。因此不依赖于自身之外的任何变量,只是为了做生意。谁会说这个$mainPrice
变量会在每次使用/初始化类时出现?更重要的是:何时会评估private $price = $mainPrice;
语句?包含类定义的文件是require
' d?当自动加载器启动时?创建第一个实例时,还是创建实例时?想一想......你知道它在OO环境中
适当的做法是:
class PayEx
{
private $price = null;
/**
* Constructors - They are there to initialize properties
* @param $mainPrice = null - null makes it optional
*/
public function __construct($mainPrice = null)
{
$this->price = $mainPrice
}
}
$x = new PayEx(123);//price propery is 123
$y = new PayEx();//price property is null
最安全设置属性的方法是,并且将始终是:创建自定义getter / setter方法。例如,这些方法可以对您尝试分配给属性的值执行额外检查。如果提供了无效数据,它们也可以抛出异常,包含有关错误的特定信息,使代码更易于使用,维护和调试:
class PayEx
{
private $price = null;
public function __construct($mainPrice = null)
{
if ($mainPrice !== null)
$this->setPrice($mainPrice);
}
/**
* Custom setter
* @param float $price
* @return $this
* @throws \InvalidArgumentException
*/
public function setPrice($price)
{
if (!is_numeric($price))
throw new \InvalidArgumentException(
sprintf(
'%s expected argument of type float, instead saw non-numeric %s',
__METHOD__,
gettype($price)
)
);
$this->price = (float) $price;
return $this;
}
/**
* custom getter
* @param null|string $format
* @return float|string
*/
public function getPrice($format = null)
{
if ($format === null)
return $this->price;
return sprintf($format, $this->price);
}
}
$x = new PayEx(12.456);
echo $x->getPrice('%.2f');//echoes 12.45
var_dump($x->getPrice());//float 12.456
我希望这能让您了解为什么在较大的项目中经常使用getter和setter。
答案 1 :(得分:1)
您不能直接在类变量上使用var。
在您的SQL之后,当您打电话给您的课程时,您可以定义价格。
// Your sql...
$payex = new PayEx();
$payex->price = $mainPrice;
答案 2 :(得分:0)
如果你想在class
开始工作之前设置变量,可以在创建对象的新实例时调用的类中使用__construct
函数。
class PayEx
{
public $price = 0;
public function __construct($price)
{
$this->price = $price
}
}
您可以传递价格变量,现在可以从PayEx
$payExObject = new PayEx($mainPrice);
替代方案,您可以使用Getter和Setter函数
class PayEx
{
public $price = 0;
public function getPrice()
{
return $this->price;
}
public function setPrice($price)
{
$this->price = $price;
return $this;
}
}
并传递像这样的变量
$payExObject = new PayEx();
$payExObject->setPrice($mainPrice);
答案 3 :(得分:0)
除了@djidi建议的内容外,您还可以使用构造函数:
class PayEx
{
public function __construct($price = '00') {
$this->price = $price;
}
....
您可以这样称呼:
....
$payex = new PayEx($mainPrice);
....