如果设置了变量值,我该如何执行功能?
说像
$obj = new object(); // dont perform $obj->my_function() just yet
$obj->my_var = 67 // $obj->my_function() now gets run
我希望对象执行此功能,现在必须由脚本调用。
由于
修改 my_var是在类中预定义的,__ set对我不起作用。
答案 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();
}