0

我需要检查对象数组中的任何对象是否包含某个变量值。

IE 如果$object_array包含 15 个$object对象,我想知道其中是否有一个对象的$type属性设置为$some_type. 函数的内部并不那么重要,因为它访问get. $object我可以使用 foreach 或 array_walk 或其他任何东西。我的问题的症结是,我把这个方法放在哪里?

该函数如下所示:

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

所有被测试的对象都有一个 $type 属性,可以通过它们的公共get方法访问。

我应该把这个方法放在哪里?我应该使它成为$object类的静态方法吗?

或者我应该创建一个新类,并使用它的一个对象来执行这个操作。

我对 PHP 的内置结构(如“迭代器”)及其使用方式非常不熟悉。我不知道它们是否适用于我的情况。我将非常感谢我能得到的任何帮助。

谢谢你。

编辑:注意我修复了上面的功能。把“return false”放在正确的地方,把函数签名放进去。

EDIT2:更改了函数名称并添加了$some_type参数,以希望更清楚地表明我正在检查该$type属性的某些值。但是,问题仍然是“我应该把这个方法放在哪里”?

4

1 回答 1

0

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

因为它是一个范围敏感的操作,所以将它放在类内部或外部都会产生差异结果,如果在类内部,私有成员在范围内。如果在外面,您将被限制在可见的范围内。

打破它只是为了解释这个想法:

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,或者实现了该功能“检查”,那么您可以传递您正在寻找的内容。使用您的代码:

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 回答