16

重複の可能性:
count() を使用して ArrayAccess を実装するオブジェクトの要素をカウントしますか?

PHP 5 では、マジック メソッドを使用したり、一部のクラスをオーバーロードしたりできます。C++ では、引数の型が異なる限り、存在する関数を実装できます。PHPでこれを行う方法はありますか?

私がやりたいことの例はこれです:

class a {
    function a() {
        $this->list = array("1", "2");
    }
}

$blah = new a();

count($blah);

何とか2を返したいと思います.IEはクラス内の特定の配列の値を数えます。したがって、C++ では、これを行う方法は次のようになります。

int count(a varName) { return count(varName->list); }

基本的に、私は大規模なアプリケーションのデータ呼び出しを簡素化しようとしているので、これを行うことができます:

count($object);

それよりも

count($object->list);

リストはオブジェクトのリストになる可能性があるため、使用方法によっては、誰かが現在の方法でそれを行う必要がある場合、非常に厄介なステートメントになる可能性があります。

count($object->list[0]->list[0]->list);

だから、私はこれに似たものを作ることができます:

function count(a $object) {
    count($object->list);
}

PHP の count が混合変数を受け入れることは知っているので、個々の型をオーバーライドできるかどうかはわかりません。

4

2 に答える 2

34

Countableインターフェイスを実装したいようです:

class a implements Countable {
    public function __construct() {
        $this->list = array("1", "2");
    }

    public function count() {
      return count($this->list);
    }
}

$blah = new a();

echo count($blah); // 2
于 2011-12-14T18:54:42.873 に答える
23

tl;dr - 答えは一番下にあります:)

PHP では、このモデルが逆になっています。さまざまな引数の型を持つ関数 (メソッドではない) をオーバーロードするのではなく、各クラスはそれらの関数ごとに魔法のメソッドを定義することを意図しています。

以下は、クラス内で魔法の振る舞いを定義できる関数のリストです。例では、への各参照$objはクラスのインスタンスであり->unknown、欠落しているプロパティを->blamethod()参照し、欠落しているメソッドを参照しています。

  1. __toString()- このメソッドは、オブジェクトが文字列コンテキストで使用されたときに呼び出されます。echo "My object is: $obj\n";

  2. __invoke([$arg1..n])- オブジェクトが関数として使用される場合、このメソッドが呼び出されます。$obj($a, $b);

  3. __get($prop)- クラスの存在しないプロパティにアクセスしようとする試みをインターセプトできます$obj->unknown。ところで、これは、コンストラクターで行うとかなりの量の処理が必要な特定のプロパティを遅延ロードする方法として使用されることがあります。

  4. __set($prop, $value)- 存在しないプロパティが設定されているときに呼び出されます。$obj->unknown = 42;

  5. __isset($prop)- 存在しないプロパティの存在を判断するために呼び出されます (私はそれがいかにおかしいか理解しています) isset($obj->unknown)$obj->__isset('unknown')

  6. __unset($prop)- このような場合に呼び出されますunset($obj->unknown);

  7. __call($name, $arguments)$obj->blamethod(1, 2, 3);- クラスの実装されていないメソッドへの呼び出しをインターセプトします。たとえば、$obj->__call('blamethod', array(1, 2, 3));

  8. __callStatic($name, $arguments)- 同様ですが、実装内__call()で使用することはできません。$this

  9. __clone() - が呼び出されたとき$x = clone $obj;に呼び出されるため、保持するデータと破棄するデータを決定できます。

SPL では、特定のインターフェースを実装することによって、さらにいくつかの概念が導入されました。

  1. Traversableforeach-コンストラクトで使用されたときにクラスが何をするかを定義する抽象インターフェイス。具体的なインターフェースは と呼ばれIteratorます。

  2. ArrayAccess- クラスのインスタンスを配列のように使用できるようにするインターフェイス。

  3. Serializableserialize()-またはで呼び出される 2 つのメソッドを定義するインターフェイスunserialize()__sleep()とを使用することは相互に排他的__wakeup()です。

  4. Countablecount()-クラス インスタンスで が実行されるたびに呼び出される 1 つのメソッドを定義します。

于 2012-09-03T09:36:22.843 に答える