За последние 24 часа нас посетили 23362 программиста и 1550 роботов. Сейчас ищут 865 программистов ...

Расчехляю ООП))

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

  1. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Перелажу с процедурного стиля на ООП. Есть функция test(), которая выполняется в коде тыщу раз. Функция тяжелая и тупая, поэтому раньше при первом выполнении она записывала результат своей работы в глобальную переменную, а при втором уже смотрела если есть переменная, то просто возвращала её. Теперь мне нужно сделать нечто подобное в ООП стиле. Нужно чтобы функция test() при первом обращении писала результат своей работы в $butt класса testy_test. Подскажите баклану как это сделать, чот не гуглится.)

    Код (PHP):
    1. class testy_test {
    2. public $butt;
    3. function test() {
    4.     if (!$this->butt) {
    5.         echo '<p>Это типа очень сложная операция.</p>';
    6.         // Тут надо записать результат в $butt
    7.     } else {
    8.         echo '<p>Функция уже выполнялась, результат вот: '.$this->$butt.'</p>';
    9.     }
    10. }
    11. }
    12. $NYA = new testy_test();
    13. $NYA->test();
    14. $NYA->test();
    15. $NYA->test();
    16. $NYA->test();
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Код (PHP):
    1. public $butt= null;
    2. public function test() {
    3.     if (!$this->butt) {
    4.         echo '<p>Это типа очень сложная операция.</p>';
    5.         // Тут надо записать результат в $butt
    6.         $this->butt = 123456789;
    7.     } else {
    8.         echo '<p>Функция уже выполнялась, результат вот: '.$this->$butt.'</p>';
    9.     }
    10. }
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Freakmeister, следи за публичностью переменных. то, что не требуется доставать напрямую извне, не должно быть public! некоторые адепты считают, что public vars вообще не должно быть.

    я не смог понять твой тест в котором нет намека на реальное вычисление и использование результата. что пример должен был показать? (runcore успел пока я писал камент)
    обычно так:
    Код (PHP):
    1. class Foo
    2. {
    3.     private $bar;
    4.  
    5.     public function getBar()
    6.     {
    7.         if (!isset($this->bar)) {
    8.             //... 
    9.             $this->bar = 'some result';
    10.         }
    11.         return $this->bar;
    12.     }
    13. } 
    isset($var) подходит в 99.99% случаев, т.к. null обычно не является валидным результатом.

    Добавлено спустя 3 минуты 44 секунды:
    runcore
    - public не надо. переменная нужна для внутреннего использования
    - = null не надо, оно само null изначально
    - if (!$this->butt) подразумевает, что false или 0 не могут быть результатом. возможно, но я считаю null более удобным вариантом "пустого значения".
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    это решать не тебе и не мне. у ТС был паблик - я его и оставил. кто знает что он там собирается делать с ней дальше?
    пишу на разных языках поэтому у меня уже привычка, ВСЕГДА инициализировать переменную. это всегда Гарантирует что она будет иметь ТО значение - которое мне нужно. и тебе советую придерживаться этой полезной привычки.
    это вообще к чему? если в ней нулл, то сработает хоть так хоть так! то что ТЕБЕ так удобнее - не значит что так правильнее.
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Думаю, что здесь isset нафиг не нужен.
    Ибо переменная уже определена ранее и является null.
    Другое дело если бы ее не было или нам бы нужно было получать пустоту или 0 (другие), как в данном варианте нельзя
    Код (PHP):
    1. if($this->butt) { 
    Но у нас стоит " ! " - отрицание, а это все меняет, а значит что null, 0 , 0.0, '', нам не нужно, а значит и isset тоже.
    Потому, что это и так ничего собственно.
    В более точных результатах нам не следует их присваивать.
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    runcore, я тебя умоляю! не надо так бурно возмущаться. я высказал своё мнение, которое необязательно совпадает с твоим. я даже сам допускаю, что оно бывает неправильным )))

    смысл форума, помоему, в том, чтобы делиться СВОИМ опытом и размышлениями. если тебе показалось, что я придираюсь, добавь меня в "недруги" и не будешь видеть лишнего. на виду останутся только удобные высказывания.
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вот именно. я поделился своим. ты своим. это нормально.
    но потом ты зачемто доебался до моего. начал указывать мне как НАДО и как НЕ НАДО. я парировал.

    ps если чтото ненравится - сам добавляй меня в любые свои недруги и черные списки. мне это ненужно
     
  8. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Некоторые адепты забывают, что:
    1) Инкапсуляция переменных через геттеры и сеттеры в пхп реализована как гавно.
    2) Геттеры и сеттеры - это лишний вызов функции просто для того, чтобы присвоить переменную. В цикле на 100 итераций будет плюс 100 вызовов. А если там же она проверяется, то +200 вызовов. А переменных в коде почти всегда больше одной.
    3) Это все генерит тонну оверхедов.
    4) Тут серверное приложение, а не десктопная прорва. Корячить тру-оопе ради самого факта тру-оопе, чтобы выпендриться перед кем-то, не имеет смысла. От выпендривания приложение не будет производительнее. А серверу плевать на ЧСВ разработчика. Хочется потешиться тем, что можешь в тру-оопе, изучай С++.

    Святые указатели, как я тебя понимаю.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    я почти со всеми пунктами согласен, только не пойму чем был спровоцирован этот пост.
    тут кто-то "корячит тру ооп с бешеным оверхедом"? все твои тезисы проистекают из этого. а где отправная точка? в голове?
     
  10. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А это как напутствие автору, мол, главное не перегибать.
     
  11. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Спасибо, народ. Не знал что в классе можно делать так.
    Код (PHP):
    1. $this->butt = 123456789;
    А вне класса так можно делать?
    Код (PHP):
    1. class testy_test {
    2. public $butt;
    3. }
    4. $NYA = new testy_test();
    5. $NYA->$butt = 12345;
    Добавлено спустя 2 минуты 37 секунд:
    И ещё вопрос - зачем в классе перед функцией писать public? Разве она не является public по-умолчанию?
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    В чем вопрос-то? =)
     
  13. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    igordata, вопрос был чисто по синтаксису.) Я самоучка и могу не знать многих базовых вещей, которым обучают в институтах.
    Ещё кстати вот что выгуглил: http://stackoverflow.com/questions/6188994/static-keyword-inside-function
    Пишут, что функция помнит static var. Попробую потестить, так даже проще будет.
     
  14. Fell-x27

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

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

    По умлочанию все члены класса имеют модификатор доступа private.

    Тебе бы по-хорошему ООП надо учить не на пыхе, а не чем-то типа C# или Java. Они почти как близнецы. Если хочется хардкора, C++. Но там до того как изучить ООП, придется башкой удариться о сам С++. Так что лучше шарпы или жаба.

    Принципы ООП они везде одинаковые.
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    почему
    Код (Text):
    1. class a {
    2.  function b() {}
    3. }
    b() без модификаторов - публичная функция
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты почитай просто хоть ченить по пхп
     
  17. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Чеправда? Это вот было очень подло со стороны пыха. Нда.. Бро, не учи ООП по пыху, ой не учи. Потом, в случае чего убьешься о настоящие ооп-языки.

    /me ушел ставить private по классам.
     
  18. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    PSR-2 coding style guide
    https://github.com/getjump/fig-standards/blob/master/accept ... 0%B4%D1%8B
    Добавлено спустя 1 минуту 4 секунды:
    для ленивых есть php cs fixer, который многие вещи сделает за вас. ( например добавит багов ))) )
     
  19. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Дайте два!
     
  20. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Обоснуй чем тебе не нравится.

    Не ну че за фигня?

    ООП и все что с ним свзянно не направленно на увеличение производительности. Цель ООП структурировать код сделать его более читабельным упростить его поддержку и развитие. Гетер и сетер - попытка спрятать от кривруких часть информации что бы они ничего не испортили. Но многие давно научились обходить это припятствие :)
    Если тебя так волнует производительность до давай забросим все паттерны а еще лучше откажимся от ООП и перейдем на процедурный стиль.

    Эмм даже не знаю как прокомментировать.
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ООП нужно там, где оно нужно. И где оно нужно, без него оч хуёво.
     
  22. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Это да анти пример зенд.
    Но я абсолютно не согласен что ооп и его чать геттер сеттер это какой то оверхед.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну можно прописать переменные. если приходим к сеттерам и геттерам это потому что надо выполнить проверки. а проверки это один фиг код и функции и без них нельзя, то в таком свете не оверхед ни разу.
     
  24. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Не впадай в крайности. Просто надо думать, что делаешь, и что происходит в железе. А то будет как в джумле - по 10 метров страничка жрать, на которой только один материал выведен, да менюшка сбоку.

    Я же сказал, реализацией. Реализованы как говно. С рассчетом на неведомую телепатию. IDE нормально такие геттеры и сеттеры распарсить не в состоянии, потому что как говно. Обращаться к переменным, инкапсулированным ими, приходится по памяти. Потому что для всех переменных генерится один магический метод, в который сваливается все подряд. И в котором сначала надо разобраться, что тебе пришло, откуда, как, а то ли вообще пришло, а куда его деть и тд. И все ради присвоения одной сраной переменной. Посмотри, как изящно сделаны геттеры-сеттеры в тех же шарпах, поймешь о чем я.

    Я понимаю, что так все сделано ради снижения количества кода. Но только по факту кода меньше не становится. Вместо десятка крошечных методов имеем один, громоздкий, развороченный, с энтропичными проверками и тд.

    С перегрузками та же хрень. Хотели как лучше, создали велосипед, а колеса квадратные.
     
  25. mahmuzar

    mahmuzar Старожил

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