2016-04-07 11 views
0

PHPオブジェクトプロパティを設定するたびに、同じオブジェクトの別のプロパティをこの値の20%にするか、 NetValueを設定すると、別のプロパティの20%でVATを計算したいと思います。だから、戻って私はPHP、中オブジェクトプロパティセット時の関数/ロジックの実行

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); } } 
} 

:C#ので

は、それはようなものになるだろう

$product = new Product(); 
$product->NetValue = 10; 
echo $product->VAT; 

それはすべき出力:2

これは、PHPでオブジェクトプロパティとしてのみ定数を設定できるので、これをどのように実現できますか。出来ますか?私はコンストラクターに何かを入れても同様の質問で述べたようにこれを達成することができません。

+0

が同様にPHPで同じだろう。このような何かあなたはC言語でSetterを使用しています#PHPで同じ動作をします – RiggsFolly

答えて

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 
+0

Grea t!しかし、...アクセスできないプロパティにデータを書き込むときに '__set()が実行されます.'これを行うことはできますが、$ NetValueと$ VATは公開できますか? –

+0

'オーバーロードメソッドは、宣言されていないか、現在のスコープ内に表示されていないプロパティまたはメソッドと対話するときに呼び出されます。したがって、このプロパティの可視性を 'protected'または' private'に変更する必要があります。しかし、いずれの場合でも、これらの '__set'メソッドと' __get'メソッドを使ってこのプロパティにアクセスすることができます –

+1

ああ、私が見ると、 '__set()'メソッドと '__get()'メソッドを実装すると、彼らは私的なものにアクセスすることができるからです。ありがとう! –

1

あなたはProperty overloadingでそれを行うことができるはずですが、私はこの作業を行う正しい道™は単純なゲッター/セッターであると思います。

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(); 

ここで、カプセル化。

-1

これを達成するには、c#のSetterプロパティに相当するメンバー関数を宣言する必要があります。ロジックが適用されている関数に値を渡します。

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 
関連する問題