1. PHP / Говнокод #25809

    −2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    <?php
    
    class A
    {
        public function TestFunc()
        {
            var_dump($this);
            return $this->test;
        }
    }
    
    class B
    {
        public $test;
    
        public function __construct()
        {
            $this->test = "Nice trick";
        }
    
        public function GetTest()
        {
            return A::TestFunc();
        }
    }
    
    $b = new B;
    echo $b->GetTest();

    object(B)#1 (1) {
    ["test"]=>
    string(10) "Nice trick"
    }
    Nice trick

    Именно поэтому я за "PHP 5.3"

    Запостил: Stallman, 06 Сентября 2019

    Комментарии (90) RSS

    • Хоть я и скриптовый петух, но считаю, что "PHP" не нужен.
      Ответить
      • "PHP" и не скриптовой, в отличии от "JavaScript".
        Ответить
        • "PHP" донный
          Ответить
          • Расмус задумывал "PHP" как апи к сишке. Но народ не хотел писать на си, а хотел всё писать на "PHP". Тут он был вынужден идти по пизде, и делать полноценный язык. Окончательным ахуем для него было то, что люди начали писать шаблонизаторы на шаблонизаторе. Какой багор )))
            Ответить
            • Именно поэтому я за «PHP».
              Ответить
              • Notice: Undefined offset: 0 in /home/g/guestinho/govnokod.xyz/public_html/wp-includes/class-wp-query.php on line 3149
                Ответить
            • Ну слушай, мелкомягкое же смогло похоронить свой асп классик с визуальными бейсиками, пушо поняло в 2001 году что C# в студии лучше

              Почему пыхеры не смогли?
              Ответить
              • Я ещё не могу понять, почему когда используешь «PHP» как апи к сишке, над тобой смеются; говорят, что нужно обязательно реализовать «MVC», паттерны и прочую объектно-ориентированную поебень, плюс ещё использовать «Composer» и прочие нахрен не нужные внешние утилиты.

                Зачем это всё?
                Ответить
                • Потому что тогд пизнесс-логику надо и писать а сишке, а пых нужен чтобы выводить результат
                  Пых это шобло-ёбло-низатор
                  Ответить
        • Ты не прав, петух.
          Ответить
    • Позднее связывание. Динамические методы.
      Ответить
    • class A:
          def test_func(self):
              return self.test
      
      class B:
          def __init__(self):
              self.test = "Nice trick"
      
          def get_test(self):
              return A.test_func(self)
      
      b = B()
      print(b.get_test()) # Nice trcik
      Ответить
      • в языкх с неявной передачей зыса хуй такое сделаешь
        Ответить
        • В статически типизированных ещё не сделаешь. В «C++» и в «Delphi» можно подсунуть чужой зыс/сэлф с помощью reinterpret_cast или более хитрым способом, но только не будет работать: всё распидорасит, потому что у чужого класса поля расположены по другим смещениям. Хотя можно что-нибудь провернуть, если один класс является наследником другого (тогда смещения нескольких первых полей будут совпадать).
          Ответить
          • в жопа скрипте можно байднуть метод к другму зысу
            Ответить
          • Надо быть полным долбоебом, чтобы кастовать объект к тому типу, коим он не является.
            Ответить
            • >Надо быть полным долбоебом,
              то-есть тобой?
              Ответить
      • Именно поэтому я за «Python».
        Ответить
    • https://pbs.twimg.com/media/ED1hB-7XkAAkYLe.jpg:large

      охранница в свободное время пишет на борланд паскале?
      Ответить
      • Параллельно учится на стертора поди.
        Ответить
        • Не надо пожалуйста BP -- нежные воспоминания моего детства -- ставить в одно предложение с этим ослоёбом
          Ответить
          • https://www.spr.ru/forum_img/34/2019-09/5158993/7285265.jpg
            Ответить
            • Вольная борьба
              Ответить
            • Ты обычный ишакоёб из Осетии.
              Ответить
            • Там чувак в рыцарских доспехах сражается с трехствольным хуем.
              Отсылка к сказке про Змея Горыныча?

              Минуточку, это не рыцарские доспехи. Конический шлем издревле был у славян, с него соскакивали лезвия. Хм. А меч напоминает греческий.
              Ответить
              • >, с него соскакивали лезвия.
                но соскочил-ли ты с хуя? думаю, что нет
                Ответить
          • При яньiке в верховной раде сидел?
            Ответить
    • Перевёл:
      {$APPTYPE CONSOLE}
      {$IFDEF FPC}
      {$MODE Delphi}
      {$ENDIF}
      
      type
      
      PB = ^B;
      B = object
          public
          test: string;
      
          constructor Init;
      
          function GetTest: string;
      end;
      
      PA = ^A;
      A = object(B)
          public
          function TestFunc: string;
      end;
      
      function A.TestFunc;
      begin
          Writeln('>> this.test = ', self.test);
          Result := self.test
      end;
      
      constructor B.init;
      begin
          self.test := 'Nice trick';
      end;
      
      function B.GetTest;
      begin
          Result := A(self).TestFunc;
      end;
      
      var theb: PB;
      begin
          theb := new(PB, Init);
          Writeln(theb^.GetTest())
      end.


      Совместимость: «Трубопаскакаль», «Дельфи», «Фрипаскаль».

      Всё работает, всё всем платится:
      http://ideone.com/VFOWMv

      К сожалению, пришлось наследовать A от B. Можно попытаться без наследования, но тогда код будет совсем царским и сможет в любой момент бабахнуть.
      Ответить
      • P.S. Тут методы невиртуальные, поэтому A(self).TestFunc прокатило: TestFunc — это просто функция, которой компилятор неявно передаёт self.

        С виртуальными была бы жопа: пришлось бы разыскивать метод TestFunc в VMT, а его там у объекта B быть не должно.
        Ответить
        • Поздравляю. Ты только что переизобрел объекты и использовал наигрязнейший хак, вызвав New c вторым параметром, которого нет в доке.
          Ответить
          • изобрел тебе в рот, проверь
            Ответить
          • Вот документация по «Фрипаскалю»:
            https://freepascal.org/docs-html/current/ref/refse31.html

            Then the following 3 calls are equivalent:
            pp := new (Pobj,Init);

            and
            new(pp,init);

            and also
            new (pp);
            pp^.init;


            В документации по «TP» и по «Delphi» второй параметр тоже упоминался.
            Ответить
            • Если бы упоминался, я бы об этом знал. Перегруженная New со вторым параметром пришла в Delphi прямо из TP, и оставлена только как память о былой славе. Сейчас вместо этого фабричный конструктор. Да и объекты в голом виде никто сто лет не юзает.
              Ответить
              • Смотри код: B = object. Ключевое слово «object», а не «class». Это и есть конструкция, оставленная для совместимости с TP.
                Ответить
                • Объекты в делфях - это ссылки на класс. Обычно объявляют и реализуют именно классы, а не объекты. Класс выступает в качестве фабрики.
                  Ответить
                  • вообще-то класс это и есть объект. Ты путаешься.
                    Ответить
                    • Повторяю еще раз: класс - это штамп для объектов.

                      type
                        TMyClass=class
                        end;


                      Каждый класс имеет фабричный метод Creatе, возвращающий ссылку на созданный экземпляр класса с типом TObject. Инициировать объекты как либо иначе запрещено. Если же ты откроешь модуль system.pas, то увидишь, что методы класса TObject "Create" и "Destroy" вообще не реализованы - это тупо сахар.
                      Ответить
                      • Повторяю еще раз: ты - это штамм венерического заболевания, и должен быть уничтожен
                        Ответить
                      • «Класс» и «объект» это всего лишь разные слова.

                        В «C++» есть только ключевое слово «class». В «Турбо Паскале» было только ключевое слово «object».

                        Некоторые программисты словом «класс» называют тип данных, а словом «объект» — конкретный экземпляр класса. Но полагаться на то, что собеседник использует именно такую терминологию, нельзя. Лучше явно уточнять, что имеется в виду тип или экземпляр.

                        *****

                        Теперь про слова «class» и «object» в языке «Object Pascal» («Delphi», «Free Pascal»).

                        Экземпляры объекта, описанного ключевым словом «object» можно создавать в стеке (в области локальных переменных функции), можно в секции данных (в области глобальных переменных) и можно в куче (в этом случае их можно явно уничтожать). Стандартных конструкторов и деструкторов нет, ты их должен объявлять явно. Такие экземпляры можно передавать по значению и по указателю.

                        Экземпляры объекта, описанного ключевым словом «class», создаются диспетчером памяти стандартной библиотеки (system.pas). Программист не может управлять местом их хранения. Такие объекты в числе своих предков обязательно имеют TObject, поэтому у них всегда есть методы Create и Destroy. Экземпляры же всегда передаются по ссылке — это сахар, который выглядит как значение, но на самом деле является указателем.
                        Ответить
                        • в котлине есть и class, и object
                          Именно по этому
                          Ответить
                          • Уже интересно. С этого места поподробнее, пожалуйста.
                            Ответить
                            • нагуглиш сам или подсказать?
                              https://kotlinlang.org/docs/reference/object-declarations.html
                              Ответить
                              • Уже нагуглил. У «Кокококотлина» неплохо организована документация.

                                Если я правильно понял, в нём объектом называется анонимный класс. Используется, когда нужно объявить и тут же получить экземпляр.
                                Ответить
                                • угу

                                  и также реализуеца сынглтон

                                  это как в джс написать

                                  let petuhObj = {}
                                  Ответить
                        • Мне похуй, что там под капотом.
                          Но мне интересно, зачем тебе столько петухов, ведь все знают, что за ними один ты.
                          Ответить
            • Дружище, зачем ты говоришь с этим бессмысленным ведром спущенки?
              Ответить
              • Ты РПЦ-шник? Перестань переманивать моих адептов, своих заимей.
                Ответить
                • У тебя один адепт -- твоя мама.
                  Остальных людей тошнит от тебя на вторую минуту общения.

                  Убей уже себя, сделай мир чище
                  Ответить
                  • Поначалу тошнит, потом привыкаешь. Попробуй сделать это ещё раз.
                    Просто сделай это.
                    Ответить
      • Зачем на говно мамонта переводить? Ты б ещё на фортран перевёл.
        Ответить
        • Почему гавно? Что не так с паскалем?
          Ответить
        • В «Фортране» нет вообще никакого «ООП». Именно поэтому я за «Фортран».
          Ответить
          • ы ф паскле нет
            и в перле
            Ответить
            • Блять, ну вы б хоть не палились так. Никакой интриги, одна голая жопа.
              Ответить
      • Этот петуч - инк-анус гей.
        Ответить
      • Избавился от наследования:
        {$APPTYPE CONSOLE}
        {$IFDEF FPC}
        {$MODE Delphi}
        {$ENDIF}
        
        type
        
        PB = ^B;
        B = object
            public
            test: string;
        
            constructor Init;
        
            function GetTest: string;
        end;
        
        PA = ^A;
        A = object
            public
            function TestFunc: string;
        end;
        
        function A.TestFunc;
        begin
            Writeln('>> this.test = ', PB(@self)^.test);
            Result := PB(@self)^.test
        end;
        
        constructor B.init;
        begin
            self.test := 'Nice trick';
        end;
        
        function B.GetTest;
        begin
            Result := PA(@self)^.TestFunc;
        end;
        
        var theb: PB;
        begin
            theb := new(PB, Init);
            Writeln(theb^.GetTest())
        end.


        Работает:
        http://ideone.com/W74P5V

        Осталось придумать, что делать, когда есть виртуальные методы.
        Ответить
        • Подводный камень: объектом A теперь нельзя пользоваться per se. Его методы теперь должны вызываться из методов объекта B хитрым кастом.
          Ответить
          • Ну, если нельзя per se, используй per rectum.
            Ответить
            • На мой взгляд вызов PA(@self)^.TestFunc как раз и является примером per rectum.
              Ответить
            • Вставил тебе бутылку из под шампанского пер ректум
              Убегай
              Ответить
    • Простой публичный метод вызывается как статический.
      Именно поэтому я против "PHP"
      Ответить
      • Notice: Undefined offset: 0 in /home/g/guestinho/govnokod.xyz/public_html/wp-includes/class-wp-query.php on line 3149
        Ответить

    Добавить комментарий