"PHP" / Говнокод #25809 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Stallman, (Updated )

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

  • 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 или более хитрым способом, но только не будет работать: всё распидорасит, потому что у чужого класса поля расположены по другим смещениям. Хотя можно что-нибудь провернуть, если один класс является наследником другого (тогда смещения нескольких первых полей будут совпадать).
        Ответить
        • в жопа скрипте можно байднуть метод к другму зысу
          Ответить
        • Надо быть полным долбоебом, чтобы кастовать объект к тому типу, коим он не является.
          Ответить
          • >Надо быть полным долбоебом,
            то-есть тобой?
            Ответить
  • Перевёл:
    {$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 вторым параметром, которого нет в доке.
        Ответить
          • Если бы упоминался, я бы об этом знал. Перегруженная 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
                        Именно по этому
                        Ответить
                            • Уже нагуглил. У «Кокококотлина» неплохо организована документация.

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

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

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

                                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 хитрым кастом.
        Ответить
  • Простой публичный метод вызывается как статический.
    Именно поэтому я против "PHP"
    Ответить
    • Notice: Undefined offset: 0 in /home/g/guestinho/govnokod.xyz/public_html/wp-includes/class-wp-query.php on line 3149
      Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8