【问题标题】:PHP OOP, perform a function once a certain variable has been setPHP OOP,一旦设置了某个变量,就执行一个函数
【发布时间】:2009-10-14 08:28:49
【问题描述】:

设置变量值后如何执行函数?

说喜欢

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

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

谢谢

编辑 my_var 是在课堂上预定义的,__set 对我不起作用。

【问题讨论】:

  • 您的问题不清楚。您想在为变量设置值时调用函数吗?

标签: php oop function methods


【解决方案1】:

使用私有属性以便调用__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 不可访问并且有你的钩子。

【讨论】:

  • 谢谢。二传手似乎是最好的方法。可以扩展它以便在设置 3 个变量后运行该函数吗? var_a、var_b 和 var_c?一旦所有这些都设置好运行一个函数?
  • 当然,你可以在里面放任何你喜欢的逻辑。
  • 谢谢。你能看看原始问题中的编辑吗?似乎 __set() 不起作用,因为变量已经预定义。
  • 如果 my_var 是可访问的,或者因为它是公共的或者您在类中访问它(因此具有私有访问权限),它将不起作用。我的猜测是它是公开的。您会注意到我在示例中故意将其设置为私有。
【解决方案2】:

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

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

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

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

HTH

【讨论】:

  • 我同意,这是一种更清洁的方式。
【解决方案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]);
    }

}

【讨论】:

  • 这个方法不是很透明。我建议你改用普通的、非魔法的 setter 函数(就像其他几个人建议的那样)。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多