每次设置PHP对象属性时,我都希望同一对象的另一个属性为该值的20%,或者交替放置;我想在设置NetValue时计算增值税为20%的另一种财产。
在C#中它会是这样的:
public class Product
{
public decimal VAT { get; set; }
private decimal _NetValue;
public decimal NetValue { get { return _NetValue; } set { _NetValue = value; this.VAT = (value * 0.2M); } }
}
回到PHP,当我这样做时:
$product = new Product();
$product->NetValue = 10;
echo $product->VAT;
应输出:2
。
我怎样才能实现这一点,因为你只能在PHP中将常量设置为对象属性。可能吗?我无法看到如何在构造函数中放置任何内容可以实现这一点,如类似问题所述。
答案 0 :(得分:2)
尝试使用Magic Methods,更具体地说__set
和__get
。像这样:
<?php
class Product
{
private $NetValue;
private $VAT;
public function __set($name, $value)
{
if (property_exists($this, $name)) {
if ($name == 'NetValue') {
$this->VAT = 0.2 * $value;
}
$this->$name = $value;
}
}
public function __get($name)
{
if (property_exists($this, $name)) {
return $this->$name;
}
}
}
$product = new Product();
$product->NetValue = 10;
echo($product->VAT);
输出将是:
2
答案 1 :(得分:1)
你应该可以用Property overloading做到这一点,但我认为使用The Right Way™做一个简单的getter / setter。
class Product
{
private $val;
public function setNetValue($val)
{
$this->val = $val * 0.2;
}
public function getNetValue()
{
return $this->val;
}
}
$product = new Product();
$product->setNetValue(10);
echo $product->getNetValue();
这里,封装。
答案 2 :(得分:0)
它非常类似于PHP
public class Product
{
public $VAT;
private $_NetValue;
public function setNetValue($val) {
$this->_NetValue = $val;
$this->$VAT = $val * 0.2;
}
public function getNetValue() {
return $this->_NetValue;
}
}
$product = new Product();
$product->setNetValue(10);
echo 'Net Value = ' . $product->getNetValue();
echo 'VAT = ' . $product->VAT;
结果:
Net Value = 10
VAT = 2
答案 3 :(得分:-1)
您必须在c#中声明一个与Setter属性等效的成员函数才能实现此目的。将您的值传递给应用逻辑的函数。