За последние 24 часа нас посетили 22782 программиста и 1224 робота. Сейчас ищут 684 программиста ...

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

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

  1. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Благодарю вас, когда мне нужен материал, я сам нахожу его, а не прошу никого разжовывать...

    Ваши аргумены невероятны по мощи.

    Как я понял вы считаете, что есть какое-то "правильное" ООП и какие-то "правильные" языки, а есть отдельно убогий PHP?

    20 самых популярных языков - посчитайте сколько здесь вариантов типизации и сколько вариантов ООП. И на скольки из этих языков можно сделать то, что вы хотите.
     
  2. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    vasa_c
    Молодец, за идею борешься))) Где я говорил что считаю php, как язык убогим?) Главное приносит стабильный доход, значит заслуживает уважения, "правильное ООП" - ну хотябы, чтобы разработчик в функции, работая с определенным интерфейсом не мог случайно выйти за его пределы..., а в php эта тема очень слабо развито, разве тривиального instanceof достаточно? Лучше расскажи, какими проектами занимаешься ты, что тебя все абсолютно устраивает?
     
  3. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    меня не устраивает очень многое, а сюда я просто попи...ть зашёл.

    PHP предоставляет возможность определить интерфейс и указать коду с каким интерфейсом он работает (type hinting). Прикладному коду предоставляется возможность работать с этим интерфейсом и никуда не лезть. Всякая IDE будет автодополнять методы только для этого интерфейса.

    А вот если программист захочет залезть внутрь в обход этого интерфейса, это его право. И ни Java, ни C++ ему в этом так же не помешают. У них есть плюшки, чтобы сделать это чуть сложнее, но к ООП это не относится.

    В Python'е же вообще модификаторов доступа и интерфейсов в виде конструкций языка нет, что не мешает ему считаться более ООП'шным и более правильным языком, чем многие из тех, в которых это есть.
     
  4. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    скоро новая версия пыхи?
     
  5. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    PhpDoc имеешь ввиду?
    Если ты посмотришь выше, то написан метод, который не позволяет программисту выйти за пределы интерфейса
     
  6. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    type hinting имею ввиду.
    PHP:
    1. public function(IName $object) {}
    Метод, несомненно забавный и его написание надеюсь доставило вам много удовольствия.
    Однако, если вы хотите действительно использовать его, то может лучше перейти на Яву всё-таки?
     
  7. karlozzz

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

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

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    прикольный код
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Не нравится мне всё это...
    Мне кажется не позволять программисту выходить за какие-то пределы должен начальник отдела при постановке задачи. Ну и сам программист и коллективное общение. Люди сидят за соседними столами и всегда могут посоветоваться, выйти в курилку и обсудить кто что и как пишет. А впихивать в ядро программы какие-то навороты специально, чтобы ограничить возможности других программистов - по мне так "не айс".
    Хотя я не вчитывался и, возможно, вообще не понял про что тут :)
     
  10. karlozzz

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

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

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

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

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    А вот с привязкой к КОНКРЕТНЫМ объектам, посмотрите, кому интересно (конечно универсальный делать не к чему мне, пример дан в моем случаи)
    PHP:
    1. <?php
    2. /**
    3.      * Проверяет наличия доступа к методу
    4.      *
    5.      * @param array $objects типы объектов (или ключевое слово)
    6.      * @param boolean $notIt (false - Только указанным, true - всем, кроме указанных)
    7.      * @todo Доделать, проверить, вставить, если надо
    8.      */
    9.     public function isAccessToMethod($objects, $notIt = false) {
    10.         //Получаем данные от кого пришел запрос
    11.         $debug = debug_backtrace();
    12.         $className = $debug[2]['class'];
    13.         $classObj = $debug[2]['object'];
    14.  
    15.         //Стандартный доступ
    16.         $access = $notIt;
    17.  
    18.         if (class_exists($className, true) AND is_array($objects)) {
    19.             //Проверяем на ввод ключевого слова
    20.             if (is_string($objects)) {
    21.                 switch ($objects) {
    22.                     case('privateObjects'):
    23.                         $objects = array('table', 'handler', 'driver', 'driverElement');
    24.                         break;
    25.                     case('internalObjects'):
    26.                         $objects = array('table', 'handler', 'driver', 'driverElement', 'manager');
    27.                         break;
    28.                 }
    29.             }
    30.  
    31.             $isAccess = false;
    32.             //Перебираем введенные объекты
    33.             foreach ($objects as $v) {
    34.                 switch ($v) {
    35.                     case('table'):
    36.                         $isAccess = ($this === $classObj);
    37.                         break;
    38.                     case('manager'):
    39.                         $isAccess = ($this->m_manager === $classObj);
    40.                         break;
    41.                     case('handler'):
    42.                         $isAccess = ($this->m_handler === $classObj);
    43.                         break;
    44.                     case('driver'):
    45.                         $isAccess = ($this->m_driver === $classObj);
    46.                         break;
    47.                     case('driverElement'):
    48.                         //Получаем интерфейсы объекта, от которого пришел запрос (+autoload)
    49.                         $classInterfaces = class_implements($className, true);
    50.                         if(isset($classInterfaces['Table_interface_driver_element'])){
    51.                             $isAccess = ($this->m_driver->getElement($classObj->getId()) === $classObj);
    52.                         }
    53.                         break;
    54.                     default:
    55.                         exit('Not found element: ' . $v . ';');
    56.                 }
    57.                 //В зависимости от типа запроса
    58.                 if ($notIt) {
    59.                     $access = ($access AND !$isAccess);
    60.                 } else {
    61.                     $access = ($access OR $isAccess);
    62.                 }
    63.             }
    64.         }
    65.  
    66.         if (!$access) {
    67.             exit('not Access: ' . $debug[1]['class'] . '->' . $debug[1]['function'] . '; Caller: ' . $debug[2]['class'] . ';');
    68.         }
    69.         return true;
    70.     }
     
  13. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    это всё бред. "Позволять программиту не вызвать метод програмно"?? Ха ха... Спорим я вызову метод? И мне ничего не помешает вообще. Ваша идея бредовая, хоть и кажется хорошей и типа что то делающей, но смысла в этом нет, потому что тупо давать мне ручку и листки и думать, что я ничего не напишу, если я могу...
     
  14. karlozzz

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

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

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

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

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

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

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Точно, ДЛЯ ТУПЫХ, я же писал, что есть паблики, которые для общения внутри структуры, а есть те, которые для общения с пользователем...
     
  18. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Да, как обходить то собрался? Пост выше...
     
  19. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
     
  20. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Не понял, я про метод класса, ты про ручку с листком)
     
  21. Костян

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

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Изменю твой код и всё, проблем то...
     
  22. karlozzz

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

    С нами с:
    24 окт 2010
    Сообщения:
    430
    Симпатии:
    0
    Адрес:
    Y-OLA
    Костян
    Как ты его изменишь?) По нему zend guard пробежал, или хотябы ион куб, или как там из простеньких, как изменить то собрался?
     
  23. Костян

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

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

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Вот, честно, зачем это?
    Забота о бедном программисте, который не то вызовет?
     
  25. Devzirom

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

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь