Belirli bir değişken kurulduktan sonra PHP OOP, bir işlevi yerine

4 Cevap php

Bir değişkenin değerini kurulduktan sonra nasıl bir işlevi gerçekleştirebilirsiniz?

gibi söylemek

$obj = new object(); // dont perform $obj->my_function() just yet
$obj->my_var = 67    // $obj->my_function() now gets run

Ben nesne bu işlevi yapmak istiyorum ve şimdi komut dosyası tarafından çağrılacak zorunda.

Teşekkürler

EDIT my_var is predefined in the class, __set is not working for me.

4 Cevap

Özel mülkiyet yani __set() çağrılır kullanın:

class Myclass {
  private $my_var;
  private $my_var_set = false;

  public function __set($var, $value) {
    if ($var == 'my_var' && !$this->my_var_set) {
      // call some function
      $this->my_var_set = true;
    }
    $this->$var = $value;
  }

  public function __get($var, $value) {
    return $this->$name;
  }
}

Bkz Overloading. $my_var erişilemiyor ve kanca olduğu için __set() adlandırılır.

Ben $ obj için bir kurucu işlevi oluşturmak için tavsiye ve orada ilgili işlev çağrısı içerir ediyorum. Yani temelde kod böyle bir şekilde görünecektir:

$obj = new ClassOfYours();
$obj->setThatValue("apple");

Of course you would have to take care that all assignments to ThatValue need to be done through that setter in order make it work properly. Assuming that you're on php5 I'd set that property to private, so all direct assignments will cause an runtime error.

Php OOP hakkında iyi bir bakış devarticles.com üzerine this article bulunabilir.

HTH

Eğer tarif tam olarak ne başarmak için, bir magic setter kullanmak zorunda.

class ObjectWithSetter {

    var $data = array();

    public function my_function() {
        echo "FOO";
    }


    public function __set($name, $value) {
        $this->data[$name] = $value;
        if($name == 'my_var') {
            $this->my_function();
        }
    }

    public function __get($name) {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**  As of PHP 5.1.0  */
    public function __isset($name) {
        return isset($this->data[$name]);
    }

    public function __unset($name) {
        unset($this->data[$name]);
    }

}

Eğer bir değere, birine iki operasyonlarının saklanması ki davayı ayarlamak kez () my_function aramak istediğiniz varsayarsak. Eğer yeni bir fonksiyon set_my_var yaratmak gibi bir şey (değer)

function set_my_var(varvalue)
{
$this->my_var = varvalue;
$this->my_function();
}