Задолбался гуглить - нигде ответа нет (( Что нужно дописать что б пользоваться функциями внутри класса? Код (Text): class classtest{ static $path = array(1,2,3,4,5,6,7,8); static $res=count($path); //Ошибка синтаксиса }
ахаха.... гуглил он... в документации что написано? что при декларации свойств нельзя использовать выражения.
переменные класса (свойства) не могут быть функциями (анонимными функция), по крайне мере статические переменные точно. Проверено горьким опытом можно тупо сделать в виде обыкновенной переменной Код (PHP): class cls { public function fns() { $in = function() { echo 'hello'; }; } }
вы невнимательны. человек пишет "статическое свойство а=массив(тра-та-та)" и у него все ок. а потом он пишет "статическое свойство б = результат выполнения функции подсчета кол-ва элементов массива в переменной паф" и анализатор его шлет нахер потому что массив(тра-та-та) это конструкция а каунт(паф) это выражение. так же не сработает b=1+2 и подобная хрень. потому что array() не является выражением и допустимо при объявлении свойства. об этом сказано в мануале. и более того мне удивительно что в конструкции $res = count($path) вы видите объявление анонимной функции... то есть вам тоже в мануал?
)) А говорят классы - расширенные функции. Получается наоборот раз тут такие ограничения. Ну ок буду зубрить. Спс, парни.
вы просто назначение классов не понимаете)))) поищите примеры нет, ограничения только на этапе декларации. вы можете дать значение статического метода выполнив желаемое выражение в любом из методов (внутри или снаружи класса не суть важно)
или же в методе, созданном внутри класса))) Добавлено спустя 1 минуту 40 секунд: Код (PHP): к примеру function setRes(){ $this->res = count($this->path); }
а конструктор это не метод класса? и что именно подразумевает формулировка "созданном внутри класса"?
так и есть. метод который принадлежит классу, в данном случае "classtest". Добавлено спустя 1 минуту 29 секунд: конструктор вызывается по умолчанию, при создании объекта класса, а вдруг надо произвести инициализацию после). Жалко что тут нельзя создавать несколько конструкторов с разными параметрами конструктора
многие сидят на статических классах. там конструктор не нужен. об этом я уже написал выше - то есть мы не ограничиваемся "внутренностью" класса так как свойство не объявлено как защищенное/приватное следовательно кастуется как публичное. это называется перегрузка и хорошо что ее нет в пхп (имхо). впрочем кто хочет тот всегда может реализовать через обработку стека вызова а не списка аргументов.
да я не против статических параметров. Показал другой вариант тоже. да, называется так, не назвал так, потому что такого определения в php нету. я бы не отказался, если бы тут была перегрузка Добавлено спустя 4 минуты 28 секунд: можно. Но когда есть перегрузка, можно в стек не лезть. Может и работает медленнее функция при перегрузке, но все таки, в некоторых случаях она была бы кстати
Сначала надо читать, потом применять. Классы не являются расширенными функциями. Это классы. Они не лучше процедурного программирования. Они не хуже процедурного программирования. Они иначе. В ООП нет понятия "декларации". Более того, сразу присваивать значения описываемым полям - дурной тон и грязь. В ООП есть понятие "инициализация". Инициализация проводится либо на этапе создания объекта, в его конструкторе, либо после, если мусье знает толк. "Сидение на статических классах" - это, имхо, суррогат ООП. Когда объектный подход человеку нахрен не нужен, но, по каким-то внутренним причинам, он считает, что процедурный код - это унизительно, не тру, и вообще лучше из окна прыгнуть. 1) В пхп ЕСТЬ перегрузка. Но сделана она через нереальный анус. Просто нереальный. 2) Перегрузка всегда хорошо, в любом языке. Присутствие любого инструмента - всегда хорошо. Использовать его или нет - твой выбор. 3) Вместо перегруженных функций в пыхе можно жить, используя параметры по умолчанию. В большинстве случаев они заменяют перегрузку на отлично. Был очень рад, в свое время, когда обнаружил, что в пыхе этот механизм реализован.
странно, ни разу не сталкивался с упоминанием перезагрузки в php. А где можно про это прочитать? Добавлено спустя 5 минут 42 секунды: ну чем то инициализировать стоит. Тут не знаю, у меня с java это осталось, чтобы компилятор не ругался. ) не мешает же загнать туда null? Добавлено спустя 1 минуту 45 секунд: может в интерпретируемых языках это считается так
Эх... Зачем? Хоть одну причину назови, зачем в пхп, в ООП, или проще, зачем в ООП в любом языке что-либо инициализировать до вызова конструктора? Присваивай значения в конструкторе класса. Все равно до этого момента эти поля не будут использоваться. Он на то и конструктор. Это его прямое назначение. Даже в Си++, где, по умолчанию, объявление переменной не означает очистку памяти, которую она занимает, что, в итоге, приводит к тому, что она, на момент рождения, забита рандомным мусором, не надо заниматься инициализацией до создания объекта. Копилятор JAVA ругается на то, что в описании класса есть неинициализированные переменные? И давно? Или, может, проблема не в том, что они не инициализированны при описании, а в том, что их дергают без обработки в конструкторе?
В книжке по которой я занимался, Уолтер Савитч http://www.books.ru/books/yazyk-java-kurs-programmirovaniya ... nie-29564/ рекомендует инициализировать переменные при объявлении. потом прочитал книжку брюс эккель - философия ява тоже так же, в общем инициализация не мешат. Может уже что-то поменялось, я уже не занимаюсь java год с лишним. А вот мысль насчет инициализации, к примеру наша переменная будет использоваться как тип Int инициализировав заранее 0 мы говорим что это тип инт, может и не обязательно, но тот кто будет копаться в коде, уже сразу поймет что это будет тип int Добавлено спустя 10 минут 49 секунд: страшная перегрузка, и вообще они сами называют это "недоступные свойства" или "недоступные методы".
это не совсем то что приятно называть перегрузкой. в япах где она есть я могу сделать несколько одинаковых функций с разными списками аргументов. и каждая из них может по-своему работать да и должна раз там разный список аргументов. в пхп нет перегрузки. я не могу определить две функции с одним именем ибо это сыпанет статус 500. и если я хочу иметь возможность иметь разный интерфейс функции/метода то мне надо итерировать стек вызова. это не есть перегрузка.
Кэп, спасибо, что ты есть Напомню, что этот момент уже был озвучен мною ранее: Более того, даже в документации пыха есть опус, прямо на странице про перегрузку: Такие дела.
Код (PHP): class test { public function __construct() { if($size=func_num_args()) { switch($size) { case 1: /* code */ break; case 2: /* code */ break; } } } }