Поэтому я работаю с некоторым внешним 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. Позвольте мне процитировать руководство по PHP count()
:
Возвращает количество элементов в array_or_countable. Когда
параметр не является ни массивом, ни объектом с реализованным счетным
интерфейс, 1 будет возвращен. Есть одно исключение, если
Аргумент array_or_countable имеет значение NULL, 0 будет возвращено.
Начиная с PHP 7.2, пытаясь использовать count()
на что-то неисчислимое предупреждение выдаст, например
Параметр должен быть массивом или объектом, реализующим Счетное
демонстрация https://3v4l.org/G0pR3
Других решений пока нет …