Ben her özellik için bir ayarlayıcı ve bir alıcı yazma ihtiyacı olmadan bazı özel nitelikleri dış aramalar için kesmek __get() ve __set() sihirli yöntemler kullanıyorum. Şimdiye kadar iyi:
<?
class Foo{
private $id;
private $info = array();
private $other;
public function __set($name, $value){
switch($name){
case 'id':
case 'info':
return $this->$name = $value;
break;
default:
throw new Exception('Attribute "' . $name . '" cannot be changed from outside the class');
}
}
public function __get($name){
switch($name){
case 'id':
case 'info':
return $this->$name;
break;
default:
throw new Exception('Attribute "' . $name . '" cannot be read from outside the class');
}
}
}
$MyFoo = new Foo;
$MyFoo->id = 33;
$MyFoo->info = array (
'item_id' => '20',
'issue' => '53',
);
try{
$MyFoo->other = 44;
}catch(Exception $e){
echo 'Exception raised as expected: ' . $e->getMessage();
}
?>
Şimdi ben bazı öznitelik (bir dizi) boş veya değil kalır olup olmadığını test etmek gerekir. I empty($MyFoo->info) daima false bu yüzden manuel olarak baktım ve buldum olduğunu fark etti __isset():
__isset() is triggered by calling isset() or empty() on inaccessible properties.
Ancak, benim kodunda __isset() uygulamak nasıl benim için açık değil. Ben bunun doğru veya yanlış dönmek gerekiyordu ama ... empty() aracılığıyla çağrıldığını arasında veya üzerinden ayırt edebilirsiniz sanırım isset()?