2016-04-07 19 views
0

Her bir PHP nesne özelliği ayarladığımda, aynı nesnenin başka bir özelliğinin bu değerin% 20'si olması veya dönüşümlü olarak yerleştirilmesini istiyorum; NetValue'yi ayarladığımda başka bir mülkün% 20'sinde KDV hesaplamak istiyorum.Nesne özelliği ayarlandığında PHP çalıştır işlevi/mantığı

C#, şöyle olabilir gibi bir şey: I do Yani geri PHP'de

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

:

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

Bu çıkış yapmalıdır: 2.

Bunu yalnızca PHP'de nesne özellikleri olarak sabitler olarak ayarlayabildiğiniz için nasıl başarabilirim. Mümkün mü? Benzer sorularda belirtildiği gibi, kurucuya bir şey koymanın bunu nasıl başarabildiğini göremiyorum.

+0

yanı PHP'de aynı olurdu , C# kümesinde bir Setter kullanıyorsunuz PHP – RiggsFolly

cevap

2

Magic Methods ve daha ayrıntılı olarak __set ve __get kullanmayı deneyin. Böyle bir şey:

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

Çıktı olacaktır:

2 
+0

Grea'da aynı t! Ama ... 'veriyi erişilemeyen özelliklere yazarken __set() çalıştırılıyor. Bunu yapabilir miyim ama $ NetValue ve $ KDV kamuya açık mı? –

+0

'Aşırı yükleme yöntemleri, bildirilmemiş veya geçerli kapsamda görünmeyen özelliklere veya yöntemlerle etkileşim kurarken çağrılır. Yani bu özelliklerin görünürlüğünü 'korumalı 'veya' özel 'olarak değiştirmelisiniz. Ama her durumda bu özelliklere '__set' ve '__get' metodları ile erişebilirsiniz. –

+1

Ah Gördüğüm ... '__set()' ve '__get()' yöntemlerini uyguladıktan sonra diğer sınıflar tarafından görünür hale gelirler. özel olanlara erişebildikleri için. Teşekkürler! –

1

Property overloading ile yapabilmeniz gerekir, ancak bu işi yapmak için The Right Way ™ 'in basit bir alıcı/ayarlayıcı olduğunu düşünüyorum. Burada, kapsülleme işlemi gerçekleştirilir.

-1

Bunu başarmak için C# içinde Setter özelliğine eşdeğer bir üye işlevini bildirmeniz gerekir. Değerinizi, mantığınızın uygulandığı bu işleve iletin.

0

PHP'de Onun oldukça benzer

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; 

Sonuç:

Net Value = 10 
VAT = 2