За последние 24 часа нас посетили 16927 программистов и 1646 роботов. Сейчас ищут 959 программистов ...

Писать или не писать тип аргумента

Тема в разделе "PHP для новичков", создана пользователем VLK, 13 фев 2015.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Скажите, есть ли в чем то преимущество у второго варианта, перед первым:

    первый:
    Код (PHP):
    1. function Show1($message)
    2. {
    3.     echo $message;
    4. }
    второй:
    Код (PHP):
    1. function Show2(string $message)
    2. {
    3.     echo $message;
    4. }
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Может ты хочешь словить ошибку если в функцию будет передан аргумент другого типа.
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    это в целом или только про стандартные типы?
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    из стандартных типов только array вроде работает. остальное - только классы допустимы.
     
  5. Cognio

    Cognio Новичок

    С нами с:
    8 апр 2014
    Сообщения:
    21
    Симпатии:
    0
    Как выше говорили будет работать только array и object.
    А преимущества - строгая типизация.
    Для меня уменьшает количество потенциальных ошибок, делает код более приятным и понятным. В PHP такого к сожалению нету.
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ладно, я понял, что ни чего не понял :)
    ну а точнее, пользоваться нужно иногда, там где это действительно нужно, как то так.
     
  7. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Используй вместо проверки is_array и т.д. если ловишь ошибки и их обрабатываешь.
     
  8. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Нельзя сделать string, возможно только array или имя класса и >=5.4 появился еще тип, callable.
     
  9. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    И еще такой вопрос возник, а возможно ли сделать так, что бы ну что бы функция возвращала значение определенного типа, ну например как в С#:
    Код (Text):
    1. public string xxx() // данная функция возвращает переменную только типа string
    2. { /* **** */ }
     
  10. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ага, приводи возвращаемое значение к нужному типу и возвращай его
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    в смысле вот так вот:
    Код (PHP):
    1. class cls {}
    2.  
    3. function fns()
    4. {
    5.     return new cls();
    6. }
    7.  
    8. $var = (cls)fns();
    но у меня выдает ошибку.
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну потому что так нельзя. Если уже возвращаешь класс, никуда его приводить не надо. А вот для скалярных значений вполне можно писать что-то вроде
    Код (Text):
    1.  
    2. function f() {
    3.     return (int) $n;
    4. }
    А вообще, PHP нетипизированный язык, к этому надо привыкнуть. Я, когда вернулся после долгого перерыва в программирование, и начал изучать php, тоже всё удивлялся после Паскаля и С++, как так - переменная, и без типов... Сейчас привык.
     
  13. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    тип есть у каждой переменной! просто типизация динамическая, но она есть всегда. и зачастую тип меняется неявно при приобразованиях. но пхп предоставляет инструменты и для явного приведения типа, если это нужно.
    так что - никаких проблем
     
  14. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Когда я создавал тему мне было интересно в чем различия, после того как я ее создал, я сразу открыл редактор, написал, затестил и понял. У меня такое часто бывает, создаю тему с вопросом, тут же начинаю сам искать ее решение, нахожу / проверяю до получения первого ответа. Я знаю что это плохо, но я ни чего не могу с собой поделать.

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

    $cls объект класса cls, но как видите не показывает свойства и методы этого класса, это не удобно, надо в ручную писать :)
    (не надо разъяснять почему так, я и так все понимаю)
    [​IMG]

    а вот если указываю какую переменную я получаю, все ок, мне отображаются свойства и методы этого класса:
    [​IMG]

    но это на прием переменной, а хотелось бы что бы еще при возвращении функцией / методом значения IDE знала какой тип мы возвращаем, и отображала свойства и методы этого класса, т.е. (вопрос собственно на скриншоте):
    [​IMG]

    я надеюсь суть моего вопроса ясна.
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    как бы контроль целостности данных и хинты в идеешечке - две разные вещи. тип переменной идеешке можно явно задать через однострочный комментарий. да и вообще документация кода помогает иде ускорять процесс написания кода.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Если суть в том, чтоб ide подсвечивала, можно использовать phpdoc, NetBeans его понимает:
    Код (PHP):
    1. /** @return cls */
    2. function ret() {
    3.    return new cls;
    4. }
    5.  
     
  17. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Существует такая штука, как phpdoc, выглядеть это может примерно так:
    Код (PHP):
    1. function myFunction($item) {
    2.   /** @var User $item */
    3.   /* ... */
    4. }
    5.  
    и ide поймет что добавлять в подстановку.

    Если говорить о теме вообще, лично я стараюсь использовать подобные вещи, проставляя класс объекта, либо его интерфейс. К примеру, у нас есть табличка images, в которой хранятся изображения от разных сущностей: мы им прописываем ImageInterface и указываем его в качестве принимаемого типа. На первый взгляд совершенно лишняя заморочка, но если проект растет в размерах, то позволяет избежать глупых ошибок ещё на стадии написания кода. Да и в целом, такой подход не дает забыть нужный метод, перепутать аргументы и т.п.
     
  18. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Спасибо всем за ответы, что то понял, а что то пойму при написании ближайшего проекта (просто сейчас изучаю JS), спасибо еще раз.