Özel niteliklerini () boş Çağrı

1 Cevap php

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()?

1 Cevap

Bunu bu şekilde yapmak gerekir:

public function __isset($name) {
    return isset($this->$name);
}

Bu durumda, isset($MyFoo->info) ve beklendiği gibi empty($MyFoo->info) çalışır:

// isset($MyFoo->info) --> true
// empty($MyFoo->info) --> false
$MyFoo->info = array(1, 2, 3);

// isset($MyFoo->info) --> true
// empty($MyFoo->info) --> true
$MyFoo->info = array();

// isset($MyFoo->info) --> false
// empty($MyFoo->info) --> true
$MyFoo->info = null;