是否可以在属性更改上运行php方法?如下例所示:
类别:
class MyClass
{
public MyProperty;
function __onchange($this -> MyProperty)
{
echo "MyProperty changed to " . $this -> MyProperty;
}
}
对象
$MyObject = new MyClass;
$MyObject -> MyProperty = 1;
结果:
"MyProperty changed to 1"
答案 0 :(得分:4)
就像@lucas说的那样,如果您可以在类中将属性设置为私有,则可以使用__set()来检测更改。
class MyClass
{
private $MyProperty;
function __set($name, $value)
{
if(property_exists('MyClass', $name)){
echo "Property". $name . " modified";
}
}
}
$r = new MyClass;
$r->MyProperty = 1; //Property MyProperty changed.
答案 1 :(得分:2)
使用setter方法可以达到最佳效果。
class MyClass
{
private MyProperty;
public function setMyProperty($value)
{
$this->MyProperty = $value;
echo "MyProperty changed to " . $this -> MyProperty;
}
}
现在你只需调用setter而不是自己设置值。
$MyObject = new MyClass;
$MyObject -> setMyProperty(1);
答案 2 :(得分:0)
class Foo {
protected $bar;
public function __set($name, $value) {
echo "$name changed to $value";
$this->$name = $value;
}
}
$f = new Foo;
$f->bar = 'baz';
使用一个好的老式二传手可能是一个更好,更传统的想法:
class Foo {
protected $bar;
public function setBar($value) {
echo "bar changed to $value";
$this->bar = $value;
}
}
$f = new Foo;
$f->setBar('baz');
答案 3 :(得分:0)
这篇文章很老,但是我必须处理相同的问题以及具有多个字段的典型类。为什么要使用私有财产? 这是我实现的:
class MyClass {
public $foo;
public $bar;
function __set($name, $value) {
if(!property_exists('MyClass', $name)){ // security
return;
}
if ('foo' == $name) { // test on the property needed to avoid firing
// "change event" on every private properties
echo "Property " . $name . " modified";
}
$this->$name = $value;
}
}
$r = new MyClass();
$r->bar = 12;
$r->foo = 1; //Property foo changed.
var_dump($r);
/*
object(MyClass)[1]
public 'foo' => int 1
public 'bar' => int 12
*/