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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ООП - проверка метода 
V
    Опции темы
MoLeX
Дата 23.9.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Добрый день.

Есть простой класс
Код

class Test 
{
   function t1()
   {
      echo __FUNCTION__.'<br />';
   }
   
   public function t2()
   {
      echo __FUNCTION__.'<br />';
   }
   
   private function t3()
   {
      echo __FUNCTION__.'<br />';
   }
}


как узнать, что вызываемый метод открыт?


В голову приходит только такой вариант: перед закрытыми методами ставим землю (было t3(), стало _t3()) и когда его вызывают делать проверку. Но способ какой то кривой, может есть готовая ф-ция?


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 23.9.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(MoLeX @  23.9.2010,  10:42 Найти цитируемый пост)
как узнать, что вызываемый метод открыт?

публик или привате? PHP сам скажет.

А для чего? для писания руками, вроде как, хватает и error'ов php. Что-то генерится автоматически или совсем посторонними юзерами?

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

Есть reflection для несложного анализа свеженаписанного чужого кода. Не оно?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 23.9.2010, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Цитата(ksnk @  23.9.2010,  10:49 Найти цитируемый пост)
А для чего? 

чтобы на этапе вызова отсечь неправильно обращение. К данному классу можно будет обратиться так: http://example/test/t1 и соответственно вызовется метод t1(). А вот если будет попытка вызвать так http://example/test/t3 (t3() - private, нельзя его так вызывать) то мне надо отреагировать


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 23.9.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(ksnk @  23.9.2010,  10:49 Найти цитируемый пост)
для пущего визуального эффекта можно приватные методы делать с двумя подчеркиваниями в начале, а протектнутые - с одним. Смешно становится, когда политика партии меняется по нескольку раз на дн в связи с аварийным дописыванием проекта.

ага..а потом public функция становиться protected и надо менять каждый вызов этой функции в потомках smile 

Цитата

Есть reflection

 smile 

MoLeX
посмотри тут
http://www.php.net/manual/en/function.method-exists.php
пост от
Цитата

admin ( at ) djokodonev dot com
16-Oct-2009 11:30


Код

function is_class_method($type="public", $method, $class) {
   // $type = mb_strtolower($type);
    $refl = new ReflectionMethod($class, $method);
    switch($type) {
        case "static":
        return $refl->isStatic();
        break;
        case "public":
        return $refl->isPublic();
        break;
        case "private":
        return $refl->isPrivate();
        break;
    }
}

а зачем это вообще понадобилось?


Это сообщение отредактировал(а) azesmcar - 23.9.2010, 11:01
PM   Вверх
ksnk
Дата 23.9.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



MoLeX, гы-гы... Это уже не приватно-публичное, а юзеродоступное  smile при чем тут политика доступности функций в php? Это уже сверхкатегория smile
Обычно я делал префикс у таких функций. Функция do_logout вызывается по запросу ?do=logout. Префикс нужен, чтобы юзеры не вызывали все подряд и не пришлось внимательно тестить, не приведет ли непреднамеренный вызов этого метода к непредсказуемым результатам. Никакой отдельной политики приватноcти нету. То есть, при получении заявки на выполнение действия контроллер ищет фунцию  с менем 'do_'.{действие}у модели. если нету - ковыряемся в другом месте и  плачемся об ошибке , по желанию...

Это сообщение отредактировал(а) ksnk - 23.9.2010, 11:38


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 23.9.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



ksnk
в CI как раз делают через землю
Цитата(http://code-igniter.ru/user_guide/general/controllers.html#private)

Защищенные функции
В некоторых случаях вы можете захотеть скрыть ту или иную функцию от публичного доступа. Чтобы сделать функцию приватной — просто добавьте символ подчеркивания перед ее названием и она не будет отображаться при запросе через URL. Например, если вы назвали функцию примерно так:
Код

function _utility()
{
  // какой-то код
}

Попытки получить к ней доступ, набрав ее имя в запросе окажутся неудачными: www.your-site.com/index.php/blog/_utility/


но шальная мысля моя пошла дальше и решила - "а почему бы не использовать для этого public & private"

Добавлено через 1 минуту и 49 секунд
Цитата(azesmcar @  23.9.2010,  11:00 Найти цитируемый пост)
MoLeX
посмотри тут
http://www.php.net/manual/en/function.method-exists.php


то что доктор прописал)

Это сообщение отредактировал(а) MoLeX - 23.9.2010, 11:38


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
ksnk
Дата 23.9.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



MoLeX Обычно, внутренняя  логика исполнения развивается менее предсказуемо, чем интерфейсные функции. Тоесть предсказать что конкретно захочет юзер от системы и зафиксировать список интерфейсных функций  -значительно проще, чем предсказать историю развития внутренностей системы. Тоесть делать функции "доступными" юзеру с помошью префикса - значительно менее затратная политика. чем "скрывать" от юзера некоторые функции префиксом. imho, конечно...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Shogun
Дата 23.9.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сёгун-сан
**


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

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



Для этого есть функция is_callable.

if (is_callable(array('Test', 't2')))
  {
    ...
  }

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

Это сообщение отредактировал(а) Shogun - 23.9.2010, 17:10


--------------------
2b || !2b
PM MAIL ICQ Skype   Вверх
MoLeX
Дата 24.9.2010, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Shogun, да, как то прошляпил эту функцию


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
krundetz
Дата 28.9.2010, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MoLeX, можешь подробнее объяснить зачем тебе понадобилось доступность вызова метода по URL-у реализовывать через доступность вызова функции в коде? Если пользователей разделить на группы по возможностям то схема сразу потребует переделки.

Может лучше реализовать полноценный Access Control List?


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


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



krundetz, используется система Модель-Отображение-Контроллер, в итоге все работает по такому принципу:
www.example.com/class/function

Это сообщение отредактировал(а) MoLeX - 29.9.2010, 05:46


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
gta4kv
Дата 29.9.2010, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

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



Прямое обращение к функциям - извращенство.

Я бы сделал обязательную функцию init для каждого класса и описал её в интерфейсе. А init уже делал то, что тебе нужно. (is_callable, или еще какие-то проверки).

Это сообщение отредактировал(а) gta4kv - 29.9.2010, 07:36
PM MAIL   Вверх
MoLeX
Дата 29.9.2010, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Цитата(gta4kv @  29.9.2010,  07:35 Найти цитируемый пост)
Я бы сделал обязательную функцию init для каждого класса и описал её

и так)


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
krundetz
Дата 29.9.2010, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(MoLeX @  29.9.2010,  05:46 Найти цитируемый пост)
krundetz, используется система Модель-Отображение-Контроллер

я это понял, я не понял почему именно так? почему выбрал такую реализацию? каковы у этой реализации преимущества, по сравнению с полноценным Access Control List? ведь чем то ты руководствовался при выборе решения

Это сообщение отредактировал(а) krundetz - 29.9.2010, 21:38


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


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



krundetz, тем что она ближе мне (сталкивался, работал) вот и решил её использовать.


Цитата(krundetz @  29.9.2010,  21:35 Найти цитируемый пост)
по сравнению с полноценным Access Control List

примерчик дай  smile 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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