PHP OOP,一旦设置了某个变量就执行一个函数

时间:2009-10-14 08:28:49

标签: php oop function methods

如果设置了变量值,我该如何执行功能?

说像

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

我希望对象执行此功能,现在必须由脚本调用。

由于

修改 my_var是在类中预定义的,__ set对我不起作用。

4 个答案:

答案 0 :(得分:12)

使用私有属性,以便调用__set()

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

Overloading。调用__set()是因为$my_var无法访问,而且有钩子。

答案 1 :(得分:10)

我建议为$ obj创建一个setter函数,并在那里包含相关的函数调用。所以基本上你的代码看起来像这样:

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

当然,您必须注意所有对ThatValue的分配都必须如此 通过该setter完成,以使其正常工作。假设您使用的是php5,我将该属性设置为private,因此所有直接赋值都会导致运行时错误。

关于php中OOP的一个很好的概述可以在devarticles.com上的this article找到。

HTH

答案 2 :(得分:3)

要完全按照您的描述进行操作,您必须使用magic setter

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

}

答案 3 :(得分:0)

假设您想在设置值时调用my_function(),那么您可以将这两个操作封装为一个。像你一样创建一个新函数set_my_var(value)

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