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
Параметр должен быть массивом или объектом, реализующим Счетное