【问题标题】:How to iterate over array of objects in PHP? With object method, class static method?如何遍历 PHP 中的对象数组?用对象方法,类静态方法?
【发布时间】:2012-10-31 03:18:02
【问题描述】:

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

I.E.如果$object_array 包含15 个$object 对象,我想知道其中是否有一个对象的$type 属性设置为$some_type。 该函数的内部并不那么重要,因为它访问$object 的公共get 方法。我可以使用 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 属性以获取某些值。不过,问题仍然是“我该把这个方法放在哪里”?

【问题讨论】:

  • 将其作为静态方法放入实用程序类中。也许有时 php 会有扩展方法和原生 linq 支持。
  • 我可能倾向于把它放在一个助手中。

标签: php oop static iterator iteration


【解决方案1】:

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; 
     }
}

【讨论】:

  • 是的,但是我作为示例给出的函数将对象数组作为参数,并使用对象的公共“get”方法来获取信息。范围并不重要,因为我只使用公共方法。
  • 至于你的笔记,是的,我在错误的地方“返回 false”,忘记输入函数签名。我修复了它,所以现在应该更清楚我要做什么了。
  • 嘿。所有正确的部分都已到位,并且知道您只使用 public 使得它非常简单。你可以像这样调整你的函数: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; } 请记住,成员上没有 varchar 这样的东西,PHP 会自动装箱你分配给它的任何类成员的变量,悄悄地。这就是为什么我们使用 stristr 来检查 'string'
  • 猜猜我是在为那个无名的徽章拍摄;)
  • 哇,你的新功能毫无意义!您让我检查对象的每个属性以查看“字符串”是否是变量字符串值的 part。我的功能已经很好了。它检查 ONE 属性 $type 是否有特定的字符串值。您的函数可能会导致数百个错误,因为并非所有属性都是字符串。最重要的是,这根本没有解决我的问题。我的功能很好,我只想知道将它放在 OOP 上下文中的哪个位置。在一个新的班级?在独立功能中?在帮助类中?
猜你喜欢
  • 2012-07-06
  • 2016-09-13
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多