5

PHPの可算インターフェースを実装して、関数count()がどのように機能するかを判別できることと、配列などのオブジェクトを使用するためのIteratorインターフェースを実装できることを知っています。

オブジェクトのempty()の動作を変更するために、ある種のインターフェース(または他の方法)を実装することは可能ですか?

基本的に、これが私がやりたいことです。

<?php
class test {
    function __empty() {
        if (count($this->data) > 0) {
            return false;
        }
        return true;
    }
}

持ってうれしいです!

4

4 に答える 4

5

いいえ、ありません。イテレータの動作とカウントの動作は、オブジェクトに対しては意味がありません。そのため、それらをオーバーライドできます。オブジェクトにempty()適用されるデフォルトの動作には、代わりに意味があります。それはオブジェクトのインスタンスですか、それともNULLですか。; そのため、オーバーライドすることはできません。

代わりに、次のことができます。

  • 呼び出されたオブジェクト内にメソッドを作成し、isEmpty()そこに実装します
  • グローバル関数emptyObj()を作成し、そこに実装します
于 2013-01-28T18:54:06.740 に答える
4

いいえ、PHP にはありません。このような機能はwiki.php.netでリクエストできます。それまでの間、あなたは自分自身を転がすことができます。

interface Empty_Checkable{
   function isempty();
}

class test implements Empty_Checkable{
    function isempty() {
        if (count($this->data) > 0) {
            return false;
        }
        return true;
    }
}
于 2013-01-28T18:54:10.103 に答える
3

これは、オブジェクトに対して直接行うことはできません。

それを行う必要がある場合は、Countableインターフェイスを実装することをお勧めします。その後、 を呼び出す代わりに...empty($foo)を呼び出します。count($foo) == 0

ただし、プロパティについては、 と の 2 つの魔法のメソッドを組み合わせて使用​​することができ__issetます__get。例えば:

class Foo {
    protected $bar = false;
    protected $baz = true;
    public function __get($key) {
        return $this->$key;
    }
    public function __isset($key) {
        return isset($this->$key);
    }
}

その結果、次のようになります。

empty($foo->abc); // true, isset returns false
empty($foo->bar); // true, isset returns true, but get returns false value
empty($foo->baz); // false, isset returns true, and get returns a true value

いいえ、単一のメソッド ハンドラーでは不可能ですが、2 つの魔法のメソッドを組み合わせることで、正常に動作します...

于 2013-01-28T19:48:57.450 に答える