2009-10-14 112 views
0

一旦变量的值已经设置,我该如何执行一个函数?PHP OOP,一旦设置了某个变量就执行一个函数

说喜欢

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

我希望对象做这个功能,现在不得不通过脚本调用。

感谢

编辑 my_var在类中预定义,__set是不是为我工作。

+0

你的问题不清楚。你想为一个变量设置一个值时调用一个函数吗? – 2009-10-14 08:32:22

回答

12

使用私有财产等等__set()被调用:

​​

Overloading。因为$my_var无法访问并且存在钩子,所以调用了__set()

+2

+1。有关魔术__set()方法的详细信息,请参阅http://php.net/__set。 – 2009-10-14 08:39:58

+1

谢谢。制定者似乎是最好的方法。可以扩展这个函数吗?一旦设置了3个变量,函数就会运行? var_a,var_b和var_c?一旦所有这些都设置运行一个函数? – dotty 2009-10-14 09:11:27

+0

当然,你可以把任何逻辑放在你喜欢的地方。 – cletus 2009-10-14 09:24:42

10

我建议为$ obj创建一个setter函数,并在那里包含相关的函数调用。所以基本上你的代码将在某种程度上是这样的:

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

当然,你必须要小心,以ThatValue所有任务必须通过 为了使二传手完成,使其正常工作。假设你在php5上,我将该属性设置为private,所以所有直接分配都会导致运行时错误。

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

HTH

+1

我同意,这是一个更干净的方式来做到这一点。 – gnud 2009-10-14 08:36:05

3

要acheive正是你的描述,你必须使用一个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]); 
    } 

} 
+1

这种方法不是很透明。 我建议你使用一个普通的非魔术设置函数(就像其他几个建议的一样)。 – gnud 2009-10-14 08:37:48

0

假设您希望在设置值时调用my_function(),那么您可以将这两种操作封装到一个中。像你这样的东西创建一个新的功能set_my_var(值)

function set_my_var(varvalue) 
{ 
$this->my_var = varvalue; 
$this->my_function(); 
} 
相关问题