Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по использовани. SPL, а возможно и нет.. 
:(
    Опции темы
ShamanVoodoo
Дата 23.6.2013, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



Код

class CountableObject implements Countable
{
    protected $_container = array('a', 'b', 'c', 'd');

    public function count()
    {
        return count($this->_container);
    }
}

$countable = new CountableObject;
var_dump(count($countable));


только сейчас задумался, а как собственно это работает?
каким образом php узнает, что при count($countable) надо вызвать метод данного объекта?!
и можно ли это применять к другим метода объекта или данное правило действует только на объекты на основе spl ?
скажем если метод class_test вызван моей функцией funct_test, то будет ли запущен этот метод?

Это сообщение отредактировал(а) ShamanVoodoo - 23.6.2013, 01:44
PM MAIL ICQ   Вверх
Gromdron
Дата 23.6.2013, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.9.2006

Репутация: 1
Всего: 1



Дело в том что класс CountableObject реализует интерфейс Countable, не было бы интерфейса, вы бы получили в результате - 1 обьект.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
krundetz
Дата 24.6.2013, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(ShamanVoodoo @  23.6.2013,  01:30 Найти цитируемый пост)
только сейчас задумался, а как собственно это работает?

Zend API


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ShamanVoodoo
Дата 24.6.2013, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



Gromdron krundetz меня скорее это интересует:
Цитата

и можно ли это применять к другим метода объекта или данное правило действует только на объекты на основе spl ?
скажем если метод class_test вызван моей функцией funct_test, то будет ли запущен этот метод?


и если да, то как и какие особенности?
PM MAIL ICQ   Вверх
krundetz
Дата 24.6.2013, 15:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(ShamanVoodoo @  24.6.2013,  14:02 Найти цитируемый пост)
и можно ли это применять к другим метода объекта или данное правило действует только на объекты на основе spl ?

можно применять к:
1. объектам spl реализующим Countable
2. собственным объектам которые реализуют Countable
3. собственным объектам которые расширяют spl объекты реализующие Countable

если изменить ваш пример так:
Код

class CountableObject
{
    protected $_container = array('a', 'b', 'c', 'd');
    public function count()
    {
        return count($this->_container);
    }
}
$countable = new CountableObject();
var_dump(count($countable));

в ответ получим:
Код

int(1) 


Это сообщение отредактировал(а) krundetz - 24.6.2013, 15:04


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ShamanVoodoo
Дата 24.6.2013, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



krundetz > Countable часть SPL. Речь не только о Countable, а вообще о подобном принципе:  если в объекте реализован метод, то  при вызове его одноименной функцией вместо класса подставляется результат работы метода.

печально что такой финт только для узкого круга методов на базе spl, было бы круто если бы  работало что-то подобное:
Код

function test($data)
{
    // ...
}

interface iTest
{
    public function test();
}

class myTest implements iTest
{
    public function test()
    {
        return "taadaaa";
    }
}
$test = new myTest;
var_dump(test($test)); // taadaaa


да да, знаю, вы скажете, что такое можно и самому реализовать, но не прописывать же в каждую функцию для проверки  is_object + method_exists или чего-то подобного



Это сообщение отредактировал(а) ShamanVoodoo - 24.6.2013, 16:53
PM MAIL ICQ   Вверх
krundetz
Дата 24.6.2013, 17:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(ShamanVoodoo @  24.6.2013,  16:48 Найти цитируемый пост)
было бы круто если бы  работало что-то подобное:

в том и дело, что совсем не круто

1. в вашем примере мы вместо явного вызова получаем не явный, что ухудшает читаемость кода
2. и если для итератора реализация интерфейса Countable нам позволит использовать функцию count с экземпляром класса также как с любым другим объектом языка и ожидаемый результат у нас всегда один и тот же, то в вашем примере такая реализации не несет никакой дополнительной выгоды

Есть я правильно помню в PHP есть еще несколько удачных примеров продуманной реализации данного подхода: key(), next(), rewind(), valid(), current(). Что позволяет spl итератору спокойно работать в цикле foreach.

Это сообщение отредактировал(а) krundetz - 24.6.2013, 17:59


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
ShamanVoodoo
Дата 24.6.2013, 23:34 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



krundetz

1. с этим согласен, но подобные неявные вызовы распространены повсеместно взять хоть магические методы в php, хоть триггеры в бд. они обеспечивают компактность кода, я бы посмотрел как вы тот же цикл сделали без spl...

2. мой пример это абстракция и как она работает вы знать уж точно не можете. хотите реальный пример? пожалуйста: у count есть аналог sizeof - работает он быстрее, вот только sizeof($countable) уже выполняться не будет

3. + (де)сериализация еще.. это больше похоже на заплатку, чем на продуманное решение, к __toString() можно было добавить __toArray() и обеспечить  совместимость с функциями для работы с массивами

Это сообщение отредактировал(а) ShamanVoodoo - 24.6.2013, 23:37
PM MAIL ICQ   Вверх
Fortop
Дата 25.6.2013, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(ShamanVoodoo @  24.6.2013,  16:48 Найти цитируемый пост)
$test = new myTest;
var_dump(test($test)); // taadaaa

Чем это отличается от 

Код

$test->test() ;



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ShamanVoodoo
Дата 25.6.2013, 15:03 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 17.10.2007
Где: Сергиев Посад

Репутация: -1
Всего: -3



Fortop> технически ничем, а практически такой вариант компактнее, проще, быстрее.  Удивился просто, что подобное решение только в качестве хинта для нескольких методов сущестует

ладно, дальше будет только флейм, так что тему можно закрывать. обидно, досадно, но ладно..

Это сообщение отредактировал(а) ShamanVoodoo - 25.6.2013, 15:05
PM MAIL ICQ   Вверх
Arantir
Дата 25.6.2013, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Все просто. Есть стандартные PHP-шные фукнкции. А есть пользовательские функции. 
И чтобы не изобретать велосипед и не ухудшать читаемость кода — можно использовать стандартные в своих классах по их назначению.
А test($test) — это явное указание на то, что где-то у Вас в процедурном стиле в глобальной области описана данная пользовательская функция. Существование двойственности — возможности описания ее в классе объекта и просто в глобальной области — лишь сбиивало бы с толку.

Цитата(ShamanVoodoo @  25.6.2013,  14:03 Найти цитируемый пост)
а практически такой вариант компактнее, проще, быстрее

Технически, вариант
Код

$a->b += $c->d($n)->f($g)->t;
тоже компактнее, проще, быстрее. Но, как бы...

Это сообщение отредактировал(а) Arantir - 25.6.2013, 15:39


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
krundetz
Дата 27.6.2013, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(ShamanVoodoo @  24.6.2013,  23:34 Найти цитируемый пост)
2. мой пример это абстракция и как она работает вы знать уж точно не можете. хотите реальный пример? пожалуйста: у count есть аналог sizeof - работает он быстрее, вот только sizeof($countable) уже выполняться не будет

 smile 
это не конкретный пример, это бред, так как:
    1) не даны данные на которых выполняется сравнение count() и sizeof(), следовательно проверить я ничего не могу
    2) функция sizeof() является псевдонимом функции count(), тоесть быстрее она быть не может. ну никак. Пруф. Да и кто вам мешает сделать так?
Код

class CountableObject implements Countable
{
    protected $_container = array('a', 'b', 'c', 'd');
    public function count()
    {
        return sizeof($this->_container);
    }
}

    3) в реализации интерфейса Countable скорость работы count() полностью зависит от программиста и его технической грамотности, ваш пример ставит под сомнение вашу техническую грамотность. Его можно переписать так:
Код

class CountableObject implements Countable
{
    protected $_container = array('a', 'b', 'c', 'd');
    protected $_count = 4;
    public function count()
    {
        return $this->_count;
    }
}

достаточно вычислять $_count только при изменение $_container, этим мы изрядно сократим количество вычислений, при условии что частота изменения меньше частоты вызова возвращения $_count, а по другому у вас и быть не может если вам важно чтобы именно этот метод работал быстрее.

Цитата(ShamanVoodoo @  25.6.2013,  15:03 Найти цитируемый пост)
а практически такой вариант компактнее, проще, быстрее.

 smile 
бред и еще раз бред
рассмотрим ваш пример:

Код

function test($data)
{
    // ...
}
interface iTest
{
    public function test();
}
class myTest implements iTest
{
    public function test()
    {
        return "taadaaa";
    }
}
$test = new myTest;
var_dump(test($test)); // taadaaa

как будет в данном случае работать интерпретатор наткнувшись на последнею строку:
1. он проверит является ли переменная $test реализацией интерфейса iTest
2. если это так, то он вызовет метод myTest::test()
3. выполнит функцию var_dump()
в случае если вызов сделать так:
Код

$test = new myTest;
var_dump($test->test());

то интерпретатор наткнувшись на последнею строку отработает так:
1. вызовет метод myTest::test()
2. выполнит функцию  var_dump()

то есть быстрее данный код быть не может по определению, так как интерпретатор выполняет на 1 действие больше.

простотой здесь тоже не пахнет, я вам уже говорил вы явный вызов заменяете на неявный, это усложненяет понимание кода, а не упрощает его.

компактность тоже не верна, так как проверку на соответствие переменной интерфейсу вам тоже надо где то выполнить.

Ставлю вам минус за упертость в своей технической безграмотности.




Это сообщение отредактировал(а) krundetz - 27.6.2013, 11:52


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
krundetz
Дата 27.6.2013, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(ShamanVoodoo @  24.6.2013,  23:34 Найти цитируемый пост)
3. + (де)сериализация еще.. это больше похоже на заплатку, чем на продуманное решение, к __toString() можно было добавить __toArray() и обеспечить  совместимость с функциями для работы с массивами

для совместимости работы с массивами существуют другие методы и интерфейс, в одном из своих ответов в этой теме я их упоминал

Это сообщение отредактировал(а) krundetz - 27.6.2013, 13:28


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0953 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.