0

オブジェクトの配列内のオブジェクトに特定の変数値が含まれているかどうを確認する必要があります。

IE$object_arrayに 15 個のオブジェクトが含まれている場合、そのうちの 1 つでもプロパティが に設定され$objectているかどうかを知りたいです。の publicメソッドにアクセスするため、関数の内部はそれほど重要ではありません。foreach や array_walk などを使用できます。私の質問の要点は、このメソッドをどこに置くかです。$type$some_typeget$object

関数は次のようになります。

public function hasSomeType($object_array,$some_type) {
    foreach($object_array as $object) {
      if($object->get('type') == '$some_type') {
        return true;
      }         
    }
    return false;
}

テストされたすべてのオブジェクトには、パブリックgetメソッドによってアクセス可能な $type プロパティがあります。

このメソッドはどこに置くべきですか?$objectのクラスの静的メソッドにする必要がありますか?

または、新しいクラスを作成し、そのオブジェクトの 1 つを使用してこの操作を実行する必要があります。

「イテレータ」などの PHP の組み込み構造とその使用方法について、私は非常によく知りません。それらが私の状況に当てはまるかどうかはわかりません。私が得ることができる助けを大いに感謝します。

ありがとうございました。

編集:上記の機能を修正したことに注意してください。「return false」を適切な場所に置き、関数の署名を入れます。

EDIT2:関数名を変更し、引数を追加して、プロパティの値を$some_typeチェックしていることをより明確にしたいと考えています。$typeしかし、問題は依然として「このメソッドをどこに配置すればよいか」です。

4

1 に答える 1

0

http://ca3.php.net/manual/en/function.get-object-vars.php

これはスコープに依存する操作であるため、クラス内またはクラス外に配置すると、クラス内のプライベート メンバーがスコープ内にある場合に diff の結果が得られます。外にいる場合は、目に見えるものに限定されます。

アイデアを説明するために簡単に分解します。

class Bar {

   public function check( $type = 'int' ) {
       $vars = get_object_vars( $this );
       foreach( array_values( $vars ) as $v )
           if( stristr( $v, $type ) !== FALSE )
              return true;

       return false;
   }
}

たとえば、すべてのクラスが Bar を拡張したり、その関数「check」を実装したりした場合、探しているものを渡すことができます。あなたのコードを使用して:

function checkArrayOfObjects( $object_array = array() )
{
    foreach($object_array as $object)
        if( is_object( $object ) /*&& $object instanceof Bar*/ && $object->check('int') )
            return true;
    return false;
}

最初のコードでは、最初のオブジェクトのみをチェックしたことに注意してください;)

幸運を。

また、質問を単純化しすぎた場合は、PHP の ReflectionClass http://ca3.php.net/manual/en/class.reflectionclass.phpをのぞいてみてください。

以下のコメントからのコード

public function hasVarchar($object_array) { 
    foreach($object_array as $object) { 
        $vars = get_object_vars( $object ); 
        foreach( array_values( $vars ) as $v ) 
            if( stristr( $v, 'string') !== FALSE ) 
                return true; 
        }
        return false; 
     }
}
于 2012-10-31T03:52:24.183 に答える