2015-10-27 9 views
5

È possibile eseguire il metodo php sul cambio delle proprietà? Come mostrato nel seguente esempio:Metodo di esecuzione php sulla modifica delle proprietà

Classe:

class MyClass 
{ 
    public MyProperty; 

    function __onchange($this -> MyProperty) 
    { 
     echo "MyProperty changed to " . $this -> MyProperty; 
    }   
} 

Oggetto:

$MyObject = new MyClass; 
$MyObject -> MyProperty = 1; 

Risultato:

"MyProperty changed to 1" 
+2

Inserire la variabile come privato e utilizzare una funzione per modificarlo. –

+0

Dovrai implementarlo. E.g Cambia la proprietà, attiva l'evento e cattura l'evento. – Xlander

risposta

4

Come @lucas Detto questo, se è possibile impostare la proprietà come privata all'interno della classe, quindi è possibile utilizzare __set() per rilevare una modifica.

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. 
2

È c un risultato migliore utilizzando un metodo setter.

class MyClass 
{ 
    private MyProperty; 

    public function setMyProperty($value) 
    { 
     $this->MyProperty = $value; 
     echo "MyProperty changed to " . $this -> MyProperty; 
    } 

} 

Ora basta chiamare il setter invece di impostare il valore da soli.

$MyObject = new MyClass; 
$MyObject -> setMyProperty(1); 
0

Utilizzando la 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'; 

Può essere un'idea migliore e più convenzionale di utilizzare un buon setter vecchio stile invece:

class Foo { 

    protected $bar; 

    public function setBar($value) { 
     echo "bar changed to $value"; 
     $this->bar = $value; 
    } 

} 

$f = new Foo; 
$f->setBar('baz');