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

функция внутри класса

Тема в разделе "PHP для новичков", создана пользователем mifitator, 28 окт 2014.

  1. mifitator

    mifitator Новичок

    С нами с:
    11 сен 2014
    Сообщения:
    11
    Симпатии:
    0
    Задолбался гуглить - нигде ответа нет ((

    Что нужно дописать что б пользоваться функциями внутри класса?
    Код (Text):
    1.  
    2. class classtest{
    3.  
    4.        static $path = array(1,2,3,4,5,6,7,8);
    5.  
    6.        static $res=count($path); //Ошибка синтаксиса
    7.  
    8. }
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. Ganzal

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

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

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    переменные класса (свойства) не могут быть функциями (анонимными функция), по крайне мере статические переменные точно.
    Проверено горьким опытом :)

    можно тупо сделать в виде обыкновенной переменной
    Код (PHP):
    1. class cls 
    2. {
    3.     public function fns()
    4.     {
    5.         $in = function()
    6.         {
    7.             echo 'hello';
    8.         };
    9.     }
    10. } 
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы невнимательны.
    человек пишет "статическое свойство а=массив(тра-та-та)" и у него все ок. а потом он пишет "статическое свойство б = результат выполнения функции подсчета кол-ва элементов массива в переменной паф" и анализатор его шлет нахер потому что массив(тра-та-та) это конструкция а каунт(паф) это выражение. так же не сработает b=1+2 и подобная хрень. потому что array() не является выражением и допустимо при объявлении свойства. об этом сказано в мануале.
    и более того мне удивительно что в конструкции $res = count($path) вы видите объявление анонимной функции... то есть вам тоже в мануал?
     
  6. mifitator

    mifitator Новичок

    С нами с:
    11 сен 2014
    Сообщения:
    11
    Симпатии:
    0
    )) А говорят классы - расширенные функции.

    Получается наоборот раз тут такие ограничения. Ну ок буду зубрить.
    Спс, парни.
     
  7. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы просто назначение классов не понимаете)))) поищите примеры
    нет, ограничения только на этапе декларации. вы можете дать значение статического метода выполнив желаемое выражение в любом из методов (внутри или снаружи класса не суть важно)
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это только в этом месте нельзя. Можно в конструкторе присвоить что хочешь.
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    или же в методе, созданном внутри класса)))

    Добавлено спустя 1 минуту 40 секунд:
    Код (PHP):
    1. к примеру function setRes(){
    2. $this->res = count($this->path);
    3. } 
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а конструктор это не метод класса? и что именно подразумевает формулировка "созданном внутри класса"?
     
  11. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    так и есть.
    метод который принадлежит классу, в данном случае "classtest".

    Добавлено спустя 1 минуту 29 секунд:
    конструктор вызывается по умолчанию, при создании объекта класса, а вдруг надо произвести инициализацию после).
    Жалко что тут нельзя создавать несколько конструкторов с разными параметрами конструктора
     
  12. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    многие сидят на статических классах. там конструктор не нужен.

    об этом я уже написал выше -
    то есть мы не ограничиваемся "внутренностью" класса так как свойство не объявлено как защищенное/приватное следовательно кастуется как публичное.

    это называется перегрузка и хорошо что ее нет в пхп (имхо). впрочем кто хочет тот всегда может реализовать через обработку стека вызова а не списка аргументов.
     
  13. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    да я не против статических параметров. Показал другой вариант тоже.
    да, называется так, не назвал так, потому что такого определения в php нету.
    я бы не отказался, если бы тут была перегрузка

    Добавлено спустя 4 минуты 28 секунд:
    можно. Но когда есть перегрузка, можно в стек не лезть. Может и работает медленнее функция при перегрузке, но все таки, в некоторых случаях она была бы кстати
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Сначала надо читать, потом применять. Классы не являются расширенными функциями. Это классы. Они не лучше процедурного программирования. Они не хуже процедурного программирования. Они иначе.
    В ООП нет понятия "декларации". Более того, сразу присваивать значения описываемым полям - дурной тон и грязь.
    В ООП есть понятие "инициализация". Инициализация проводится либо на этапе создания объекта, в его конструкторе, либо после, если мусье знает толк.
    "Сидение на статических классах" - это, имхо, суррогат ООП. Когда объектный подход человеку нахрен не нужен, но, по каким-то внутренним причинам, он считает, что процедурный код - это унизительно, не тру, и вообще лучше из окна прыгнуть.
    1) В пхп ЕСТЬ перегрузка. Но сделана она через нереальный анус. Просто нереальный.
    2) Перегрузка всегда хорошо, в любом языке. Присутствие любого инструмента - всегда хорошо. Использовать его или нет - твой выбор.
    3) Вместо перегруженных функций в пыхе можно жить, используя параметры по умолчанию. В большинстве случаев они заменяют перегрузку на отлично. Был очень рад, в свое время, когда обнаружил, что в пыхе этот механизм реализован.
     
  15. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    странно, ни разу не сталкивался с упоминанием перезагрузки в php. А где можно про это прочитать?

    Добавлено спустя 5 минут 42 секунды:
    ну чем то инициализировать стоит. Тут не знаю, у меня с java это осталось, чтобы компилятор не ругался. ) не мешает же загнать туда null?

    Добавлено спустя 1 минуту 45 секунд:
    может в интерпретируемых языках это считается так
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Эх...
    Зачем? Хоть одну причину назови, зачем в пхп, в ООП, или проще, зачем в ООП в любом языке что-либо инициализировать до вызова конструктора? Присваивай значения в конструкторе класса. Все равно до этого момента эти поля не будут использоваться. Он на то и конструктор. Это его прямое назначение. Даже в Си++, где, по умолчанию, объявление переменной не означает очистку памяти, которую она занимает, что, в итоге, приводит к тому, что она, на момент рождения, забита рандомным мусором, не надо заниматься инициализацией до создания объекта.
    Копилятор JAVA ругается на то, что в описании класса есть неинициализированные переменные? И давно? Или, может, проблема не в том, что они не инициализированны при описании, а в том, что их дергают без обработки в конструкторе?
     
  17. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    В книжке по которой я занимался, Уолтер Савитч http://www.books.ru/books/yazyk-java-kurs-programmirovaniya ... nie-29564/ рекомендует инициализировать переменные при объявлении. потом прочитал книжку брюс эккель - философия ява тоже так же, в общем инициализация не мешат.

    Может уже что-то поменялось, я уже не занимаюсь java год с лишним.

    А вот мысль насчет инициализации, к примеру наша переменная будет использоваться как тип Int инициализировав заранее 0 мы говорим что это тип инт, может и не обязательно, но тот кто будет копаться в коде, уже сразу поймет что это будет тип int

    Добавлено спустя 10 минут 49 секунд:
    страшная перегрузка, и вообще они сами называют это "недоступные свойства" или "недоступные методы".
     
  18. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это не совсем то что приятно называть перегрузкой. в япах где она есть я могу сделать несколько одинаковых функций с разными списками аргументов. и каждая из них может по-своему работать да и должна раз там разный список аргументов. в пхп нет перегрузки. я не могу определить две функции с одним именем ибо это сыпанет статус 500. и если я хочу иметь возможность иметь разный интерфейс функции/метода то мне надо итерировать стек вызова. это не есть перегрузка.
     
  19. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
     
  20. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Кэп, спасибо, что ты есть :)
    Напомню, что этот момент уже был озвучен мною ранее:
    Более того, даже в документации пыха есть опус, прямо на странице про перегрузку:

    Такие дела.
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это не перегрузка. :p
     
  22. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Код (PHP):
    1. class test {
    2.     public function __construct() {
    3.         if($size=func_num_args()) {
    4.             switch($size) {
    5.                 case 1:
    6.                     /*
    7.                         code
    8.                     */
    9.                 break;
    10.                 case 2:
    11.                     /*
    12.                         code
    13.                     */
    14.                 break;
    15.             }
    16.         }
    17.     }
    18. } 
     
  23. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    rognorog, подобное проделывал, но это не то
     
  24. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    То - то. Просто ты инициализируй правильно.
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Можно передавать массив. Благо ассоциативные ключи в пхп делают это наглядным.