当对象属性设置时,PHP运行函数/逻辑

时间:2016-04-07 14:04:02

标签: c# php class oop

每次设置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中将常量设置为对象属性。可能吗?我无法看到如何在构造函数中放置任何内容可以实现这一点,如类似问题所述。

4 个答案:

答案 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属性等效的成员函数才能实现此目的。将您的值传递给应用逻辑的函数。