属性改变的Php run方法

时间:2015-10-27 11:57:12

标签: php class object methods properties

是否可以在属性更改上运行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"

4 个答案:

答案 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)

使用magic method __set

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
*/