Ответы пользователя по тегу ООП
  • Зачем нужен ООП?

    @m-haritonov
    В PHP ООП нужен, когда нескольким функциям требуется обращаться к общим переменным.

    Без ООП пришлось бы писать код вида:
    <?php
    namespace something1 {
        function set($value) {
            $GLOBALS['something1']['someVariable'] = $value;
        }
    
        function get() {
            return $GLOBALS['something1']['someVariable'];
        }
    }
    
    namespace something2 {
        function set($value) {
            $GLOBALS['something2']['someVariable'] = $value;
        }
    
        function get() {
            return $GLOBALS['something2']['someVariable'];
        }
    }
    
    namespace {
        \something1\set(1);
        \something2\set(2);
    
        print \something1\get();
        print \something2\get();
    }

    и:
    <?php
    namespace something {
        function set($instanceName, $value) {
            $GLOBALS[$instanceName]['someVariable'] = $value;
        }
    
        function get($instanceName) {
            return $GLOBALS[$instanceName]['someVariable'];
        }
    }
    
    namespace {
        \something\set('instance1', 1);
        \something\set('instance2', 2);
    
        print \something\get('instance1');
        print \something\get('instance2');
    }


    С ООП можно написать:
    <?php
    class Something1 {
        private $someVariable;
    
        function set($value) {
            $this->someVariable = $value;
        }
    
        function get() {
            return $this->someVariable;
        }
    }
    
    class Something2 {
        private $someVariable;
    
        function set($value) {
            $this->someVariable = $value;
        }
    
        function get() {
            return $this->someVariable;
        }
    }
    
    $something1 = new Something1();
    $something1->set(1);
    
    $something2 = new Something2();
    $something2->set(2);
    
    print $something1->get();
    print $something2->get();

    и:
    <?php
    class Something {
        private $someVariable;
    
        function set($value) {
            $this->someVariable = $value;
        }
    
        function get() {
            return $this->someVariable;
        }
    }
    
    $something1 = new Something();
    $something1->set(1);
    
    $something2 = new Something();
    $something2->set(2);
    
    print $something1->get();
    print $something2->get();


    Если брать web приложение на php, задача которого состоит в том, чтобы сгенерировать html код (который будет отправлен браузеру) и предоставить возможность разделения приложения на модули, то ООП в качестве основы такого приложения может быть излишен, т.к. все модули будут выполнять лишь одно действие (возвращать html код) и им не потребуется сохнанять состояние между вызовами, т.к. результат работы модуля не будет больше изменяться во время вызова web приложения (модуль сгенерирует html и отправит его браузеру, а в браузере, где в javascript применяется ООП, этот html код уже будет изменяться во время работы).

    Без ООП серверная часть web приложения может выглядеть так:
    <?php
    namespace modules {
        function layout($title, $contentHtml, $footerHtml) {
            return '<!doctype html>
                <html>
                <head>
                    <meta charset="utf-8">
                    <title>' . htmlspecialchars($title) .'</title>
                </head>
                <body>
                    <div class="content">
                        ' . $contentHtml . '
                    </div>
    
                    <div class="footer">
                        ' . $footerHtml . '
                    </div>
                </body>
                </html>
            ';
        }
    
        function contacts() {
            return 'Адрес: ..., телефон: ...';
        }
    
        function copyright() {
            return '© Моя фирма';
        }
    }
    
    namespace {
        if (strtok($_SERVER['REQUEST_URI'], '?') === '/contacts') {
            print \modules\layout('Контакты', \modules\contacts(), \modules\copyright());
        }
    }

    А с ООП так (как можно заметить, модули реализовалы в виде классов, которые содержат только 1 метод, т.е. класс здесь излишен):
    <?php
    namespace modules {
        class Layout {
            public $title;
            public $contentHtml;
            public $footerHtml;
    
            public function execute() {
                return '<!doctype html>
                    <html>
                    <head>
                        <meta charset="utf-8">
                        <title>' . htmlspecialchars($this->title) .'</title>
                    </head>
                    <body>
                        <div class="content">
                            ' . $this->contentHtml . '
                        </div>
    
                        <div class="footer">
                            ' . $this->footerHtml . '
                        </div>
                    </body>
                    </html>
                ';
            }
        }
    
        class Contacts {
            public function execute() {
                return 'Адрес: ..., телефон: ...';
            }
        }
    
        class Copyright {
            public function execute() {
                return '© Моя фирма';
            }
        }
    }
    
    namespace {
        if (strtok($_SERVER['REQUEST_URI'], '?') === '/contacts') {
            $layout = new \modules\Layout();
            $layout->title = 'Контакты';
            $layout->contentHtml = (new \modules\Contacts())->execute();
            $layout->footerHtml = (new \modules\Copyright())->execute();
    
            print $layout->execute();
        }
    }


    Но если бы PHP использовался для разработки не серверного, а клиентского приложения, где сгенерированная визуальная часть сохранялась бы в оперативной памяти долгое время и пользовательские действия изменяли бы её, то использование ООП может быть удобным. Но опять же, ООП - это просто способ организации кода, в основе которого лежат всё те же подпрограммы (методы) и этот способ организации не всем может понравиться.
    Ответ написан
    Комментировать
  • Как решить проблему с ооп сеттер?

    @m-haritonov
    Необходимо исправить код либо на вариант, предложенный @victorvsk, либо на такой вариант:
    class sys{
      static public $log = "<br />";
    
        static function log($newval)
        {static::$log.=$newval."<br />";}
    
        static function getlog()
        { return static::$log . "<br />";}
    }
    
    sys::log("установка");
    sys::getlog();


    Статические переменные и методы — это методы и переменные класса, а не объекта, поэтому обращение к ним происходит либо через имя класса (sys::$log), либо через ключевое слово self (self::$log; если происходит обращение к члену класса из самого класса), либо через ключевое слово static (static::$log; отличается от "self" лишь тем, что преобразуется в имя класса на стадии исполнения скрипта и потому подходит для использования при вызове метода из дочернего класса). Можно обращаться из методов объекта к статическим членам класса, но не наоборот (т.к. у объекта один класс и он известен объекту, а у класса может быть либо много объектов либо вообще ни одного).
    Ответ написан
    Комментировать