За последние 24 часа нас посетили 16875 программистов и 1641 робот. Сейчас ищут 974 программиста ...

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

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

  1. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Они и дают использовать интерфейс, а не конкретный класс, что повышает гибкость приложения.
     
  2. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Костян
    Проверяет на соответствие интерфейсу или просто в качестве информативных целей, хотя сейчас попробую
     
  3. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    karlozzz
    это то, что тебе надо знать... IDE тебе будет показывать только те методы которые диктует интерфейс - всё заебись, ты пишешь методы интерфейса
     
  4. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    karlozzz
    допустим мы работаем в двоем, я пишу некий класс для обработки твоих объектов в нем есть метод add
    [js]class Padaboo {

    private $karlozzzObjects = array();

    public function add($obj){
    if(!$obj instanceof IPadaboo)echo "ololo";
    $this->karlozzzObjects[] = $obj;
    }

    public function update(){
    foreach ($this->karlozzzObjects as $obj) {
    $obj->update();
    }
    }
    }[/js]
    и я тебе говорю, вот делай что хочешь но что бы метод update там был

    [js]/**
    * привет karlozzz все твои объекты
    * должны реализовывать этот интерфейс
    * он должен сохранять объект
    */
    interface IPadaboo{

    public function update();

    }[/js]
    ты пишешь свои объекты, один пишет в базу, другой пишет в файл
    [js]class Karlozzz implements IPadaboo{

    private $name;

    public function __construct($name) {
    $this->name = $name;
    }

    public function update() {
    echo "пишем в базу $this->name <br/>";
    }
    }

    class Karlozzz2 implements IPadaboo{

    private $name;

    public function __construct($name) {
    $this->name = $name;
    }

    public function update() {
    echo "пишем в файл $this->name <br/>";
    }
    }[/js]
    а мне тем временем обсалютно все равно что происходит в методах update я тебе дал интерфейс остальное не мои заботы
    [js]$padaboo = new Padaboo();

    $karlozzz = new Karlozzz('адин');
    $karlozzz2 = new Karlozzz2('два');

    $padaboo->add($karlozzz);
    $padaboo->add($karlozzz2);
    $padaboo->update();[/js]

    такие и похожие ситуации встречаются когда ты работаешь с библиотеками или API т.е. когда ты разработчика в глаза не видел, а есть только интерфейс
     
  5. karlozzz

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

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

    Представь, что ты разработал свой объект,
    public function add
    так и осталась публично, потому что твой объект является частью структуры, а через данный метод выполняются запросы от другого объекта структуры, и что ты не делай, как не прописывай интерфейсы, я то к нему доступ буду иметь, а что если не в интерфейс посмотрю, а в реализацию и использую его, что в корне не правильно будет...
     
  6. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    karlozzz
    я тебе уже написал, что нельзя скрывать паблик члены. Чё ты хочешь? Их НЕЛЬЗЯ скрывать, они на то и публичные.
     
  7. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    karlozzz
    так и должен будешь использовать все это, представь что мой класс - библиотека
    если хочешь что бы разные объекты выдавала система напиши фабрику которая будет возвращать объект в зависимости от уровня доступа
    т.е.
    [js]$obj = $factory->getObject($user->access);[/js]
    я не думаю что, кто то предложит что то дельное не зная контекста использования объектов, может быть есть смысл сделать совсем по другому
     
  8. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Padaboo
    Фабрика тут не поможет, ладно, не буду никого грузить, нашел альтернативное решение, когда время будет написать, и сюда выложу
     
  9. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    karlozzz
    лучше расскажи что это вообще и зачем так надо
     
  10. karlozzz

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

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

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

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

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Для того что ты хочешь используется интерфейс в связке с абстрактным классом (хотя в этом случае интерфейс не свистит вообще а абстрактный класс его создаёт) и шаблон "Composite " с листьями
     
  13. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Набросок сделал...
    PHP:
    1. <?php
    2.  public function isAccessToMethod() {
    3.         $debug = debug_backtrace();
    4.         $args = func_get_args();
    5.  
    6.         switch($args[0]){
    7.             case('privateObjects'):
    8.                 $args = array('table', 'handler', 'driver', 'driverElement');
    9.                 break;
    10.             case('internalObjects'):
    11.                 $args = array('table', 'handler', 'driver', 'driverElement', 'manager');
    12.                 break;
    13.         }
    14.         //Для прямого доступа
    15.         $access = false;
    16.         //Для запрета определенных
    17.         $notAccess = true;
    18.  
    19.         $className = $debug[2]['class'];
    20.         $classInterfaces = class_implements($className, true);
    21.         if (class_exists($className, true)) {
    22.             foreach ($args as $v) {
    23.                 if (strpos('not-', $v) == 1) {
    24.                     $not = true;
    25.                     $v = substr($v, 4);
    26.                 } else {
    27.                     $not = false;
    28.                 }
    29.                 switch ($v) {
    30.                     case('table'):
    31.                         $interface = 'Table_interface_main';
    32.                         break;
    33.                     case('manager'):
    34.                         $interface = 'Table_interface_manager';
    35.                         break;
    36.                     case('handler'):
    37.                         $interface = 'Table_interface_handler';
    38.                         break;
    39.                     case('driver'):
    40.                         $interface = 'Table_interface_driver';
    41.                         break;
    42.                     case('driverElement'):
    43.                         $interface = 'Table_interface_driver_element';
    44.                         break;
    45.                     default:
    46.                         exit('Not found element: '.$v.';');
    47.                 }
    48.                 $isAccess = isset($classInterfaces[$interface]);
    49.                 if ($not) {
    50.                     $isAccess = !$isAccess;
    51.                     $notAccess = ($notAccess AND $isAccess);
    52.                 } else {
    53.                     $access = ($access OR $isAccess);
    54.                 }
    55.             }
    56.         }
    57.         if (!$access OR !$notAccess) {
    58.             exit('not Access: '.$debug[1]['class'].'->'.$debug[1]['function'].';');
    59.         }
    60.     }?>
    61.  
    Greg1978
    Посмотрел этот шаблон, все таки не думаю что он подойдет...
     
  14. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Странно что пхп не отображается норм, кому интересно в нетбинс и альт шифт ф
     
  15. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Ах да, используется так:
    PHP:
    1. <?php
    2. $this->isAccessToMethod('privateObjects');
    3. $this->isAccessToMethod('manager', 'table');
    4. $this->isAccessToMethod('not-table', 'not-manager');
    5. ?>
    итд
     
  16. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    У меня то же что то код не выводит нормально.
    и всё же этот код ничего не объясняет, где полиморфное использование одного и того же типа в данном случае интерфейса.
    Если нужны разные методы, точнее один и тот же метод с разным алгоритмом при чём что бы он являлся доступным методом в виде интерфейса шаблон "Composite" всё таки самое оно.
    Может всё таки смогли бы сделать в UML, показать что собственно нужно?
     
  17. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Greg1978
    Нет, смотри примерчик


    [js]<?php
    class a{
    public $bObj;
    //Доступный всем
    public function f1(){
    ..
    $this->bObj->test();
    }
    //Только b
    public functoin f2(){
    }
    }
    class b{
    public $caller;
    public function test(){
    ...
    $this->caller->f2();
    ...
    }
    }
    $a = new a();
    $a->bObj = new b();
    $a->bObj->caller = &$a;
    //Отлично работает
    $a->f1();
    //Доступ запрещен, т.к. внутренняя функция структуры, а функция isAccessToMethod, проверяет кто вызвал данную функцию и имеет ли объект к ней доступ (является ли внутренним в структуре или внешним)
    $a->f2();
    ?[/js]>
     
  18. Greg1978

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

    С нами с:
    18 окт 2008
    Сообщения:
    484
    Симпатии:
    0
    Адрес:
    class SenjorUser{}
    Как, возможно, и ранее говорилось неверная архитектура.
    Может быть f2() не должна являться методом объекта A и перенести её в частное владение объекта B.
    Ведь именно объект B нуждается в этом методе который не должен быть доступен при чём всем объектам.
    Другими словами этим методом f2() пользуется лишь объект B. Отсюда вывод что если есть другие однотипные объекты которые используют метод f2() они должны просто наследовать от абстрактного класса допустим X в котором метод f2() только лишь объявлен но не реализован, что даёт иметь "листья" в наследовании.

    В проектировании ООП есть такой процесс как анализ Проектных классов их зависимости, возможности и требования.
    Отсюда вывод интерфейсов и свойств объектов.
    Кстати UML в помощь!
     
  19. karlozzz

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

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

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

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    а от кого вы что скрывать собрались?

    если у вас public метод он и будет public, или вы хотите что бы
    [js]
    <?php

    class fooClass{
    public function methodA(){

    }
    }


    class barClass{
    private function methodB(fooClass $a){
    $a->methodA();
    }
    }
    $foo = new fooClass();
    $bar = new barClass();
    // и что бы
    $foo->methodA(); // нельзя было
    $bar->methodB($foo); // можно было?
    ?>
    [/js]
     
  21. VItalijs

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

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    а вторую страницу я не заметил =)
     
  22. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    VItalijs
    Тема закрыта, если так интересно посмотрите предложенный выше метод, все зависит от класса - из который вызывается метод, скрывать на всякий случай, чтобы ошибок при разработке небыло
     
  23. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Расслабтесь, в PHP OOP "своей конструкции" ;)
    В языках с более менее нормальным ООП это работает нормально, так как Вы хотите здесь.
    п.с. Когда я наткнулся на эту "особенность" PHP, я офигел и полдня собирал мозги в кучку, чтобы осознать что "на безрыбье и рак рыба".
     
  24. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Chushkin, давайте продолжим бессмысленный срач. Объясните, каким образом, вещи являющиеся темой данного разговора имеют хоть какое-то отношение к ООП?
     
  25. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    vasa_c
    А почему не следует относить данные вещи к объектно ориентированному?)