![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
только сейчас задумался, а как собственно это работает? каким образом php узнает, что при count($countable) надо вызвать метод данного объекта?! и можно ли это применять к другим метода объекта или данное правило действует только на объекты на основе spl ? скажем если метод class_test вызван моей функцией funct_test, то будет ли запущен этот метод? Это сообщение отредактировал(а) ShamanVoodoo - 23.6.2013, 01:44 |
|||
|
||||
Gromdron |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 4.9.2006 Репутация: 1 Всего: 1 |
Дело в том что класс CountableObject реализует интерфейс Countable, не было бы интерфейса, вы бы получили в результате - 1 обьект.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
Zend API |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
Gromdron krundetz меня скорее это интересует:
и если да, то как и какие особенности? |
|||
|
||||
krundetz |
|
||||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
можно применять к: 1. объектам spl реализующим Countable 2. собственным объектам которые реализуют Countable 3. собственным объектам которые расширяют spl объекты реализующие Countable если изменить ваш пример так:
в ответ получим:
Это сообщение отредактировал(а) krundetz - 24.6.2013, 15:04 |
||||||
|
|||||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
krundetz > Countable часть SPL. Речь не только о Countable, а вообще о подобном принципе: если в объекте реализован метод, то при вызове его одноименной функцией вместо класса подставляется результат работы метода.
печально что такой финт только для узкого круга методов на базе spl, было бы круто если бы работало что-то подобное:
да да, знаю, вы скажете, что такое можно и самому реализовать, но не прописывать же в каждую функцию для проверки is_object + method_exists или чего-то подобного Это сообщение отредактировал(а) ShamanVoodoo - 24.6.2013, 16:53 |
|||
|
||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
в том и дело, что совсем не круто 1. в вашем примере мы вместо явного вызова получаем не явный, что ухудшает читаемость кода 2. и если для итератора реализация интерфейса Countable нам позволит использовать функцию count с экземпляром класса также как с любым другим объектом языка и ожидаемый результат у нас всегда один и тот же, то в вашем примере такая реализации не несет никакой дополнительной выгоды Есть я правильно помню в PHP есть еще несколько удачных примеров продуманной реализации данного подхода: key(), next(), rewind(), valid(), current(). Что позволяет spl итератору спокойно работать в цикле foreach. Это сообщение отредактировал(а) krundetz - 24.6.2013, 17:59 |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
krundetz
1. с этим согласен, но подобные неявные вызовы распространены повсеместно взять хоть магические методы в php, хоть триггеры в бд. они обеспечивают компактность кода, я бы посмотрел как вы тот же цикл сделали без spl... 2. мой пример это абстракция и как она работает вы знать уж точно не можете. хотите реальный пример? пожалуйста: у count есть аналог sizeof - работает он быстрее, вот только sizeof($countable) уже выполняться не будет 3. + (де)сериализация еще.. это больше похоже на заплатку, чем на продуманное решение, к __toString() можно было добавить __toArray() и обеспечить совместимость с функциями для работы с массивами Это сообщение отредактировал(а) ShamanVoodoo - 24.6.2013, 23:37 |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
Чем это отличается от
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
ShamanVoodoo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 17.10.2007 Где: Сергиев Посад Репутация: -1 Всего: -3 |
Fortop> технически ничем, а практически такой вариант компактнее, проще, быстрее. Удивился просто, что подобное решение только в качестве хинта для нескольких методов сущестует
ладно, дальше будет только флейм, так что тему можно закрывать. обидно, досадно, но ладно.. Это сообщение отредактировал(а) ShamanVoodoo - 25.6.2013, 15:05 |
|||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 16 Всего: 55 |
Все просто. Есть стандартные PHP-шные фукнкции. А есть пользовательские функции.
И чтобы не изобретать велосипед и не ухудшать читаемость кода — можно использовать стандартные в своих классах по их назначению. А test($test) — это явное указание на то, что где-то у Вас в процедурном стиле в глобальной области описана данная пользовательская функция. Существование двойственности — возможности описания ее в классе объекта и просто в глобальной области — лишь сбиивало бы с толку. Технически, вариант
Это сообщение отредактировал(а) Arantir - 25.6.2013, 15:39 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
krundetz |
|
||||||||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
![]() это не конкретный пример, это бред, так как: 1) не даны данные на которых выполняется сравнение count() и sizeof(), следовательно проверить я ничего не могу 2) функция sizeof() является псевдонимом функции count(), тоесть быстрее она быть не может. ну никак. Пруф. Да и кто вам мешает сделать так?
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, 11:52 |
||||||||
|
|||||||||
krundetz |
|
|||
![]() Вечный странник ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1400 Регистрация: 14.6.2007 Где: НН(Сормово) Репутация: 20 Всего: 69 |
для совместимости работы с массивами существуют другие методы и интерфейс, в одном из своих ответов в этой теме я их упоминал Это сообщение отредактировал(а) krundetz - 27.6.2013, 13:28 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |