PHP: считать объект ArrayAccess без Countable

Поэтому я работаю с некоторым внешним PHP-кодом, для которого у меня нет полного исходного кода. Я использую рефлексию для разработки вызываемых методов и т. Д.

У них есть такой класс:

class SpecialArray implments \ArrayAccess
{
    public function offsetExists($index){}
    public function offsetGet($index){}
    public function offsetSet($index, $value){}
    public function offsetUnset($index){}
}

Так логично я могу foreach(SpecialArray), Все в порядке.

Однако в коде я могу как-то сделать count(SpecialArray) и получить правильный счет, например, если в SpecialArray есть 5 элементов count(SpecialArray) вернется 5!

Однако нет count метод в классе, и класс не реализует Countableпризвание SpecialArray->count() также не удается с Call to undefined method

У кого-нибудь есть идеи, как они могут делать это волшебство вуду??

Полный \ReflectionClass::export()

Class [  class ThirdParty\SpecialArray implements ArrayAccess ] {

  - Constants [0] {
  }

  - Static properties [1] {
    Property [ public static $_metadata ]
  }

  - Static methods [1] {
    Method [  static public method &getMetadata ] {

      - Parameters [0] {
      }
    }
  }

  - Properties [0] {
  }

  - Methods [5] {
    Method [  public method offsetExists ] {

      - Parameters [1] {
        Parameter #0 [  $index ]
      }
    }

    Method [  public method offsetGet ] {

      - Parameters [1] {
        Parameter #0 [  $index ]
      }
    }

    Method [  public method offsetSet ] {

      - Parameters [2] {
        Parameter #0 [  $index ]
        Parameter #1 [  $value ]
      }
    }

    Method [  public method offsetUnset ] {

      - Parameters [1] {
        Parameter #0 [  $index ]
      }
    }

    Method [  public method fetch ] {

      - Parameters [1] {
        Parameter #0 [  $index ]
      }
    }
  }
}

1 ответ

After testing your code, I got the return value of 1. Let me quote the PHP manual of count():

Возвращает количество элементов в array_or_countable. When the parameter is neither an array nor an object with implemented Countable interface, 1 will be returned. Есть одно исключение, если array_or_countable равен NULL, будет возвращено 0.

As of PHP 7.2, trying to use count() on something uncountable will give a Warning, such as

Параметр должен быть массивом или объектом, реализующим Счетное

Demo https://3v4l.org/G0pR3

Другие вопросы по тегам