За последние 24 часа нас посетили 22323 программиста и 1033 робота. Сейчас ищут 673 программиста ...

Является ли метод магическим

Тема в разделе "Прочие вопросы по PHP", создана пользователем qwert_ukg, 12 фев 2014.

  1. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    в приложении необходимо проверить является ли метод магическим. как это сделать?
    Код (Text):
    1.  
    2. class myClass {
    3.  
    4.     public function __call($method, $arguments)
    5.     {
    6.         return 'is magic';
    7.     }
    8.  
    9.     public function notMagic()
    10.     {
    11.         return 'not a magic';
    12.     }
    13.  
    14. }
    15.  
    16.  
    17. $reflection = new ReflectionMethod('myClass', 'magic');
    18.  
    19. if ($reflection->isMagic())
    20. {
    21.     /* do some shit if is magic */
    22. }
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    магические методы имеют имя начинающееся с двух подчеркиваний.
    зачем вам это?
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    зачем это проверять???????
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ну а дальше логика...
     
  5. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    может я не так объяснил.
    есть метод который я вызываю, мне перед вызовом необходимо узнать как описан этот метод
    так:
    Код (Text):
    1.  
    2. public function notMagic()
    3.    {
    4.       return 'not a magic';
    5.    }
    или так:
    Код (Text):
    1.  
    2. public function __call($method, $arguments)
    3.     {
    4.         if ($method == 'magic')
    5.         {
    6.             return 'is magic';
    7.         }
    8.     }
    Добавлено спустя 1 минуту 3 секунды:
    нужно :)

    Добавлено спустя 3 минуты 11 секунд:
    вы вообще пример читали?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    объясни
     
  7. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    я скорее всего не правильно выразился, не магический метод, а метод описанный с помощью __call() или __callStatic() или __set()
     
  8. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    method_exists
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Скорее это просто проверит, существует ли метод, а ему нужно определение, откуда он был вызван из волшебного или из простого.
     
  10. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    использую фактори, на лету создаю методы, необходимо проверить наличие метода перед его созданием. Конкретно проблема с пересечением моих методов с методами актив рекорда.

    то есть: мне необходимо налету создать геттер/сеттер для свойства класса созданного динамически, но класс экстендится от класса который описывает актив рекорд. получается если объект AR имеет свойство типа $ar->title то производный класс (мой) не должен создовать одноименный геттер/сеттер а подтянуть значение из ролителя

    Добавлено спустя 2 минуты 14 секунд:
    если бы все так просто :)
     
  11. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Если свойство есть, и оно публичное - то ваша магия вообще не вызовется.
     
  12. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    свойств нет, все на лету
     
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    В AR тоже магия? Тогда что происходит, если вызвать несуществующее? Исключение? Тогда ловите исключение.
     
  14. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    думаю вам стоит почитать это http://goo.gl/Nt6qsu

    Добавлено спустя 1 минуту 53 секунды:
    если свойства нет, вернет пустую строку
     
  15. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Думаю вам нужно меньше советовать, что думать другим. Реализации AR бывают разные, свойства вполне могут быть описаны явно. Паттерн AR вообще это никак не определяет.

    Добавлено спустя 1 минуту 33 секунды:
    Значит ваша задача не реализуема, а AR - говно, ибо должен бросать исключение. Единственный вариант - искать в AR место, где бы вы могли взять список свойств.
     
  16. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    конечно не определяет, но где вы видели нормальный АР который при обращении к несуществующему полю ловит эксепшн?
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
  18. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    ?
     
  19. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    В Yii, например. Вообще-то это должно быть нормой - отработка обращения к несуществующему свойству как ошибка.

    Добавлено спустя 1 минуту 23 секунды:
    Причем в идеале - своим исключением, в Yii там не очень хорошо - бросается общее исключение.
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Дайте курнуть ребят)
    Если все налету то и сделай летающий метод который будет проверять этот влет =)))
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    почему бы не кидать эксепшн при обращении к несуществующему полю?
     
  22. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    ребята, возможно я не прав и на самом деле лучше выбрасывать, но вопрос не в этом. если есть желание, подумайте как решить етот вопрос

    Добавлено спустя 1 минуту 19 секунд:
    да легко :)
    делаю crud для laravel

    а Yii бросает ексепшн, факт
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я не понимаю вопроса. если есть обращение к несуществующему полю, то стало быть структура бд корявая, и всё плохо.
     
  24. qwert_ukg

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

    С нами с:
    20 июл 2010
    Сообщения:
    387
    Симпатии:
    0
    Адрес:
    Алмата
    вот для этого мне и нужно проверить если магия то не делать

    Добавлено спустя 1 минуту 6 секунд:
    слишком долго писать для чего мне это нужно, но нужно

    Добавлено спустя 5 минут 6 секунд:
    есть вариант написать трейт в которором описать __isset() и подключить его к АР, тогда можно будет проверять существование всех магически описанных свойств. если я правильно понял ман
     
  25. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    У laravel (Eloquent ORM) определена магия на isset