| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Вопросы по использовани. SPL |
| Автор: ShamanVoodoo 23.6.2013, 01:30 | ||
только сейчас задумался, а как собственно это работает? каким образом php узнает, что при count($countable) надо вызвать метод данного объекта?! и можно ли это применять к другим метода объекта или данное правило действует только на объекты на основе spl ? скажем если метод class_test вызван моей функцией funct_test, то будет ли запущен этот метод? |
| Автор: Gromdron 23.6.2013, 17:19 |
| Дело в том что класс CountableObject реализует интерфейс Countable, не было бы интерфейса, вы бы получили в результате - 1 обьект. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//object-id51c626286ccc195c06000002#findElement_E7045_51c703df6ccc19777f00037d_0 |
| Автор: krundetz 24.6.2013, 09:25 |
Zend API |
| Автор: ShamanVoodoo 24.6.2013, 14:02 | ||
Gromdron krundetz меня скорее это интересует:
и если да, то как и какие особенности? |
| Автор: ShamanVoodoo 24.6.2013, 16:48 | ||
| krundetz > Countable часть SPL. Речь не только о Countable, а вообще о подобном принципе: если в объекте реализован метод, то при вызове его одноименной функцией вместо класса подставляется результат работы метода. печально что такой финт только для узкого круга методов на базе spl, было бы круто если бы работало что-то подобное:
да да, знаю, вы скажете, что такое можно и самому реализовать, но не прописывать же в каждую функцию для проверки is_object + method_exists или чего-то подобного |
| Автор: krundetz 24.6.2013, 17:56 |
в том и дело, что совсем не круто 1. в вашем примере мы вместо явного вызова получаем не явный, что ухудшает читаемость кода 2. и если для итератора реализация интерфейса Countable нам позволит использовать функцию count с экземпляром класса также как с любым другим объектом языка и ожидаемый результат у нас всегда один и тот же, то в вашем примере такая реализации не несет никакой дополнительной выгоды Есть я правильно помню в PHP есть еще несколько удачных примеров продуманной реализации данного подхода: key(), next(), rewind(), valid(), current(). Что позволяет spl итератору спокойно работать в цикле foreach. |
| Автор: ShamanVoodoo 24.6.2013, 23:34 |
| krundetz 1. с этим согласен, но подобные неявные вызовы распространены повсеместно взять хоть магические методы в php, хоть триггеры в бд. они обеспечивают компактность кода, я бы посмотрел как вы тот же цикл сделали без spl... 2. мой пример это абстракция и как она работает вы знать уж точно не можете. хотите реальный пример? пожалуйста: у count есть аналог sizeof - работает он быстрее, вот только sizeof($countable) уже выполняться не будет 3. + (де)сериализация еще.. это больше похоже на заплатку, чем на продуманное решение, к __toString() можно было добавить __toArray() и обеспечить совместимость с функциями для работы с массивами |
| Автор: Fortop 25.6.2013, 11:47 | ||
Чем это отличается от
|
| Автор: ShamanVoodoo 25.6.2013, 15:03 |
| Fortop> технически ничем, а практически такой вариант компактнее, проще, быстрее. Удивился просто, что подобное решение только в качестве хинта для нескольких методов сущестует ладно, дальше будет только флейм, так что тему можно закрывать. обидно, досадно, но ладно.. |
| Автор: Arantir 25.6.2013, 15:38 | ||
| Все просто. Есть стандартные PHP-шные фукнкции. А есть пользовательские функции. И чтобы не изобретать велосипед и не ухудшать читаемость кода — можно использовать стандартные в своих классах по их назначению. А test($test) — это явное указание на то, что где-то у Вас в процедурном стиле в глобальной области описана данная пользовательская функция. Существование двойственности — возможности описания ее в классе объекта и просто в глобальной области — лишь сбиивало бы с толку. Технически, вариант
|
| Автор: krundetz 27.6.2013, 11:23 | ||||||||||
это не конкретный пример, это бред, так как: 1) не даны данные на которых выполняется сравнение count() и sizeof(), следовательно проверить я ничего не могу 2) функция sizeof() является псевдонимом функции count(), тоесть быстрее она быть не может. ну никак. http://php.net/manual/ru/function.sizeof.php Да и кто вам мешает сделать так?
3) в реализации интерфейса Countable скорость работы count() полностью зависит от программиста и его технической грамотности, ваш пример ставит под сомнение вашу техническую грамотность. Его можно переписать так:
достаточно вычислять $_count только при изменение $_container, этим мы изрядно сократим количество вычислений, при условии что частота изменения меньше частоты вызова возвращения $_count, а по другому у вас и быть не может если вам важно чтобы именно этот метод работал быстрее. бред и еще раз бред рассмотрим ваш пример:
как будет в данном случае работать интерпретатор наткнувшись на последнею строку: 1. он проверит является ли переменная $test реализацией интерфейса iTest 2. если это так, то он вызовет метод myTest::test() 3. выполнит функцию var_dump() в случае если вызов сделать так:
то интерпретатор наткнувшись на последнею строку отработает так: 1. вызовет метод myTest::test() 2. выполнит функцию var_dump() то есть быстрее данный код быть не может по определению, так как интерпретатор выполняет на 1 действие больше. простотой здесь тоже не пахнет, я вам уже говорил вы явный вызов заменяете на неявный, это усложненяет понимание кода, а не упрощает его. компактность тоже не верна, так как проверку на соответствие переменной интерфейсу вам тоже надо где то выполнить. Ставлю вам минус за упертость в своей технической безграмотности. |
| Автор: krundetz 27.6.2013, 13:26 | ||
для совместимости работы с массивами существуют другие методы и интерфейс, в одном из своих ответов в этой теме я их упоминал |