Перелажу с процедурного стиля на ООП. Есть функция test(), которая выполняется в коде тыщу раз. Функция тяжелая и тупая, поэтому раньше при первом выполнении она записывала результат своей работы в глобальную переменную, а при втором уже смотрела если есть переменная, то просто возвращала её. Теперь мне нужно сделать нечто подобное в ООП стиле. Нужно чтобы функция test() при первом обращении писала результат своей работы в $butt класса testy_test. Подскажите баклану как это сделать, чот не гуглится.) Код (PHP): class testy_test { public $butt; function test() { if (!$this->butt) { echo '<p>Это типа очень сложная операция.</p>'; // Тут надо записать результат в $butt } else { echo '<p>Функция уже выполнялась, результат вот: '.$this->$butt.'</p>'; } } } $NYA = new testy_test(); $NYA->test(); $NYA->test(); $NYA->test(); $NYA->test();
Код (PHP): public $butt= null; public function test() { if (!$this->butt) { echo '<p>Это типа очень сложная операция.</p>'; // Тут надо записать результат в $butt $this->butt = 123456789; } else { echo '<p>Функция уже выполнялась, результат вот: '.$this->$butt.'</p>'; } }
Freakmeister, следи за публичностью переменных. то, что не требуется доставать напрямую извне, не должно быть public! некоторые адепты считают, что public vars вообще не должно быть. я не смог понять твой тест в котором нет намека на реальное вычисление и использование результата. что пример должен был показать? (runcore успел пока я писал камент) обычно так: Код (PHP): class Foo { private $bar; public function getBar() { if (!isset($this->bar)) { //... $this->bar = 'some result'; } return $this->bar; } } isset($var) подходит в 99.99% случаев, т.к. null обычно не является валидным результатом. Добавлено спустя 3 минуты 44 секунды: runcore - public не надо. переменная нужна для внутреннего использования - = null не надо, оно само null изначально - if (!$this->butt) подразумевает, что false или 0 не могут быть результатом. возможно, но я считаю null более удобным вариантом "пустого значения".
это решать не тебе и не мне. у ТС был паблик - я его и оставил. кто знает что он там собирается делать с ней дальше? пишу на разных языках поэтому у меня уже привычка, ВСЕГДА инициализировать переменную. это всегда Гарантирует что она будет иметь ТО значение - которое мне нужно. и тебе советую придерживаться этой полезной привычки. это вообще к чему? если в ней нулл, то сработает хоть так хоть так! то что ТЕБЕ так удобнее - не значит что так правильнее.
Думаю, что здесь isset нафиг не нужен. Ибо переменная уже определена ранее и является null. Другое дело если бы ее не было или нам бы нужно было получать пустоту или 0 (другие), как в данном варианте нельзя Код (PHP): if($this->butt) { Но у нас стоит " ! " - отрицание, а это все меняет, а значит что null, 0 , 0.0, '', нам не нужно, а значит и isset тоже. Потому, что это и так ничего собственно. В более точных результатах нам не следует их присваивать.
runcore, я тебя умоляю! не надо так бурно возмущаться. я высказал своё мнение, которое необязательно совпадает с твоим. я даже сам допускаю, что оно бывает неправильным ))) смысл форума, помоему, в том, чтобы делиться СВОИМ опытом и размышлениями. если тебе показалось, что я придираюсь, добавь меня в "недруги" и не будешь видеть лишнего. на виду останутся только удобные высказывания.
вот именно. я поделился своим. ты своим. это нормально. но потом ты зачемто доебался до моего. начал указывать мне как НАДО и как НЕ НАДО. я парировал. ps если чтото ненравится - сам добавляй меня в любые свои недруги и черные списки. мне это ненужно
Некоторые адепты забывают, что: 1) Инкапсуляция переменных через геттеры и сеттеры в пхп реализована как гавно. 2) Геттеры и сеттеры - это лишний вызов функции просто для того, чтобы присвоить переменную. В цикле на 100 итераций будет плюс 100 вызовов. А если там же она проверяется, то +200 вызовов. А переменных в коде почти всегда больше одной. 3) Это все генерит тонну оверхедов. 4) Тут серверное приложение, а не десктопная прорва. Корячить тру-оопе ради самого факта тру-оопе, чтобы выпендриться перед кем-то, не имеет смысла. От выпендривания приложение не будет производительнее. А серверу плевать на ЧСВ разработчика. Хочется потешиться тем, что можешь в тру-оопе, изучай С++. Святые указатели, как я тебя понимаю.
я почти со всеми пунктами согласен, только не пойму чем был спровоцирован этот пост. тут кто-то "корячит тру ооп с бешеным оверхедом"? все твои тезисы проистекают из этого. а где отправная точка? в голове?
Спасибо, народ. Не знал что в классе можно делать так. Код (PHP): $this->butt = 123456789; А вне класса так можно делать? Код (PHP): class testy_test { public $butt; } $NYA = new testy_test(); $NYA->$butt = 12345; Добавлено спустя 2 минуты 37 секунд: И ещё вопрос - зачем в классе перед функцией писать public? Разве она не является public по-умолчанию?
igordata, вопрос был чисто по синтаксису.) Я самоучка и могу не знать многих базовых вещей, которым обучают в институтах. Ещё кстати вот что выгуглил: http://stackoverflow.com/questions/6188994/static-keyword-inside-function Пишут, что функция помнит static var. Попробую потестить, так даже проще будет.
Статичные классы доступны без создания экземпляра. Статичные члены класса, соответственно тоже. В пыхе можно пихать статические члены в нестатические классы, но это, имхо, багота и говнокод. Сам себя запутаешь. По умлочанию все члены класса имеют модификатор доступа private. Тебе бы по-хорошему ООП надо учить не на пыхе, а не чем-то типа C# или Java. Они почти как близнецы. Если хочется хардкора, C++. Но там до того как изучить ООП, придется башкой удариться о сам С++. Так что лучше шарпы или жаба. Принципы ООП они везде одинаковые.
Чеправда? Это вот было очень подло со стороны пыха. Нда.. Бро, не учи ООП по пыху, ой не учи. Потом, в случае чего убьешься о настоящие ооп-языки. /me ушел ставить private по классам.
PSR-2 coding style guide https://github.com/getjump/fig-standards/blob/master/accept ... 0%B4%D1%8B Добавлено спустя 1 минуту 4 секунды: для ленивых есть php cs fixer, который многие вещи сделает за вас. ( например добавит багов ))) )
Обоснуй чем тебе не нравится. Не ну че за фигня? ООП и все что с ним свзянно не направленно на увеличение производительности. Цель ООП структурировать код сделать его более читабельным упростить его поддержку и развитие. Гетер и сетер - попытка спрятать от кривруких часть информации что бы они ничего не испортили. Но многие давно научились обходить это припятствие Если тебя так волнует производительность до давай забросим все паттерны а еще лучше откажимся от ООП и перейдем на процедурный стиль. Эмм даже не знаю как прокомментировать.
Это да анти пример зенд. Но я абсолютно не согласен что ооп и его чать геттер сеттер это какой то оверхед.
ну можно прописать переменные. если приходим к сеттерам и геттерам это потому что надо выполнить проверки. а проверки это один фиг код и функции и без них нельзя, то в таком свете не оверхед ни разу.
Не впадай в крайности. Просто надо думать, что делаешь, и что происходит в железе. А то будет как в джумле - по 10 метров страничка жрать, на которой только один материал выведен, да менюшка сбоку. Я же сказал, реализацией. Реализованы как говно. С рассчетом на неведомую телепатию. IDE нормально такие геттеры и сеттеры распарсить не в состоянии, потому что как говно. Обращаться к переменным, инкапсулированным ими, приходится по памяти. Потому что для всех переменных генерится один магический метод, в который сваливается все подряд. И в котором сначала надо разобраться, что тебе пришло, откуда, как, а то ли вообще пришло, а куда его деть и тд. И все ради присвоения одной сраной переменной. Посмотри, как изящно сделаны геттеры-сеттеры в тех же шарпах, поймешь о чем я. Я понимаю, что так все сделано ради снижения количества кода. Но только по факту кода меньше не становится. Вместо десятка крошечных методов имеем один, громоздкий, развороченный, с энтропичными проверками и тд. С перегрузками та же хрень. Хотели как лучше, создали велосипед, а колеса квадратные.