За последние 24 часа нас посетили 21963 программиста и 1010 роботов. Сейчас ищут 660 программистов ...

ООП доступ к методам

Тема в разделе "Прочие вопросы по PHP", создана пользователем karlozzz, 28 дек 2010.

  1. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Допустим есть объект, хотелось бы его в одни функции передавать с одним интерфейсом, а в другие с другим, т.е. чтобы в первой функции доступны были определенные первым интерфейсом методы, а в другой вторым интерфейсом, собственно вопрос, КАК ЭТО СДЕЛАТЬ?
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    С точки зрения концепции ООП такой подход неправильный.
    Реализуй общий объект, доступный всем, а потом сделай наследованные реализации для требуемых методов.
     
  3. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Apple
    Ты не понял суть, объект один и тот же, он должен содержать в себе все необходимые методы, просто подключаемым к нему объектам он должен быть доступен больше, чем пользователю скажем
     
  4. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    karlozzz
    это ты не понял, что ты хочешь
     
  5. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Костян
    Вчитайся в вопрос, предположим есть класс, реализующий интерфейсы a и b, я хочу чтобы пользователь имел возможность работать с ним не более чем через интерфейс a, а внутренний объект (чтобы понятней было допустим администратор) имел возможность работать и через интерфейс a и через интерфейс b

    P/S почему если не понимаешь вопрос, считаешь его глупым или что то в этом роде?
     
  6. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Сомневаюсь что в php все таки такое предусмотрено, нах**на тогда вообще интерфесы? ради мимолетного instanceof? Ну хоть что-то, хотя пользы практически не приносит, неужели придется что то типа адаптора писать?
     
  7. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    для этой задачи в новом php можно будет использовать traits (пока в ветке trunk)

    а интерфейсы штука важная: если тип аргумента метода интерфейс, а не класс, повышается гибкость, позволяя любому классу реализовать этот интерфейс
     
  8. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Ti
    Спасибо за информацию, но это несовсем то что нужно
    Фактически об этом я и говорю, но передавать то мы будем класс с этим интерфейсом, помоему в любом языке все было бы нормально, но ведь *ля пхп то круче всех, он же не типизирован, и что? Получается доступны и методы вне интерфейса...
     
  9. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    PS тема не закрыта, решения так и нет...
     
  10. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    karlozzz если я тебя понял, то нельзя менять области видимости методов у интерфейсов...
     
  11. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    karlozzz
    прочие методы объекта не должны иметь значения для клиента определенного интерфейса, ибо он "подписывается" использовать конкретный интерфейс
     
  12. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Ti
    Подписываться то подписывается и по стандартам так оно и будет, но все же надеялся, что хотябы исключение какое нить чтоб всплывало в случае чего, а то теоретически стандарты то нарушены, метод то открытый, хотя он служебный, но нужен для связи объектов в структуре
     
  13. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    по идее иде должна подсказывать, что метод не определен.
     
  14. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Если phpDoc верно написать, то все без проблем показывает
     
  15. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Профессионалы ООП ... что вы советуете человеку особенно что он не правильно задачу поставил!
    А полиморфизм это не ООП а ... вот это он и хочет.
    К слову наследование это самая жёсткая связь в ООП которой нужно как можно больше сторонится.
    karlozzz
    Реализуй одним классом два интерфейса - это в PHP можно.
    Затем передавай в любой метод объект с указанием типа интерфейса объект будет себя вести полиморфно.
    Код (Text):
    1. <?php
    2. class MyClass implements anInterface, anotherInterface {
    3.         //...
    4. }
    5.  
    6. class A {
    7.  
    8.     public function setAnInterface(anInterface $anInterface)
    9.    {
    10.  
    11.    }
    12.  
    13.    public function setAnotherInterface(anotherInterface $anotherIntarface)
    14.    {
    15.  
    16.     }
    17. }
    18. ?>
     
  16. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Greg1978
    Хрен. В смысле:

    [js]
    class MyClass implements anInterface, anotherInterface {

    public function aMethod(){
    ..... //Это от anInterface
    }

    public function anotherMethod(){
    ..... //Это от anotherInterface
    }

    //...
    }

    class A {

    public function setAnInterface(anInterface $anInterface)
    {
    $anInterface->aMethod(); // выполниться как и должно
    $anInterface->anotherMethod(); // выполниться. А хочется чтоб выскочил хотя бы нотис.

    }

    public function setAnotherInterface(anotherInterface $anotherIntarface)
    {

    }
    }

    $a=new A();
    $my=new MyClass();
    $a->setAnInterface($my);
    [/js]
     
  17. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Volt(220)
    Тихо Тихо ...
    Опять прежняя ошибка ... с архитектурой и проектировкой, да и пониманием определения интерфейсов.
    В начале вспомните что такое интерфейс, для чего существует сам interface и с какой целью! он вообще проектируется!?
     
  18. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Greg1978
    Спасибо за советы, но как было, так и осталось, конечно класс реализует несколько интерфейсов, но как писал Volt(220), пхп на это немного пох**, ответьте на вопрос, для чего в пхп вообще нужны интерфейсы, такое чувство, что если бы их небыло, все аналогичные им функции можно было бы на бумажке написать (всмысле просто инструкция, с какими методами работать и как их создавать), только разве что instanceof небыло бы и все, что вы по этому поводу считаете?

    С наступающим НГ!!!
     
  19. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    блин, данная задача не имеет решения в контексте предоставленных данных и условий.
    интерфейсы существуют не для разделения одного и того же класса, а для обязательности реализации объявленных методов интерфейсов внутри класса - вот и всё.

    задачу, заданную в начале топика, нужно решать по другому, пересмотреть подход как минимум.
    возможно придётся писать адаптер, либо же внутри класса создать метод, проверяющий права текущего пользователя.

    хотя вполне возможно я тоже чего-то недопонимаю :)
     
  20. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Кстати, первый раз вижу указатели на типы данных в пхп
    Что они дают?
     
  21. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Gromo
    Спасибо за мнение, но если говорить прямо, то существует класс, который служит для объединения объектов в структуру (управленец выводом, менеджер таблицы, драйвер), они через него друг с другом работают, и хотелось бы, чтобы разработчик создавая этот класс не имел доступ к методам их взаимодействия, одно решение придумал, если получится - отпишусь
     
  22. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    как сказал Gromo
    немного подучите проектирование именно проектирование в стиле ООП, тогда и интерфейсы поймёте
     
  23. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Greg1978
    Подскажите что именно подучить? Не вижу альтернативы реализовать данную структуру, а что касается интерфейсов, я их понимаю, но склонен считать, что в пхп основная задача интерфейсов - проконтролировать, не были ли забыты в реализации определенные методы и правильно ли они описаны (в плане аргументов)
     
  24. Greg1978

    Greg1978 Активный пользователь

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Определение интерфейс, класс и т.п. не привязаны к определённому языку программирования.
    Интерфейс объекта он и на PHP и на Assemblere только реализация их разная. Это все вещи ООП архитектуры.
     
  25. karlozzz

    karlozzz Активный пользователь

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Greg1978
    1) Какой компилятор ассемблера позволяет работать с объектами? интересно
    2) что подучить?
    3) кроме изложенного мной выше, вы можете хотябы одно предназначение интерфейсов написать?