PHP get_instance / Понимание шаблона Singleton - PullRequest
1 голос
/ 24 марта 2011

Я поигрался с CodeIgniter и, чтобы расширить свои знания PHP, я пытаюсь создать свой собственный фреймворк.

У меня проблема в том, что я хочу эквивалент функции CodeIgniter get_instance ().Но через все мои поиски я просто не могу понять это, и при этом я не знаю, использую ли я это даже в правильном контексте ..

Я верю, что я ищу, это шаблон синглтона, ноЯ просто не могу понять, как это реализовать, поэтому кто-нибудь может мне помочь?

Я хочу иметь возможность доступа к переменной $ page для каркаса из функции содержимого.

[Я хочу сказать, что это упрощенная версия, и моя кодировка обычно лучше, чем эта ..]

До редактирования:

  <?php

    class Framework {
        // Variables
        public $page;

        function __construct()
        {

            // For simplicity's sake..
            $this->page->title = 'Page title';
            $this->page->content->h1 = 'This is a heading';
            $this->page->content->body = '<p>Lorem ipsum dolor sit amet..</p>';

            $this->output();

        }

        function output()
        {

            function content($id)
            {

                // I want to get an instance of $this
                // To read and edit variables
                echo $this->page->content->$id;
            }

            ?>
    <html>
    <head>
        <title><?php echo $this->page->title ?></title>
    </head>

    <body>
        <h1><?php content('h1') ?></h1>
        <?php content('body') ?>
    </body>
    </html>
            <?php
        }

    }

    new Framework;

После редактирования:

<?php

class Framework {
    // Variables
    public $page;

    public static function get_instance()
    {
        static $instance;
        $class = __CLASS__;
        if( ! $instance instanceof $class) {
            $instance = new $class;
        }
        return $instance;
    }

    function __construct()
    {

        // For simplicity's sake..
        $this->page->title = 'Page title';
        $this->page->content->h1 = 'This is a heading';
        $this->page->content->body = '<p>Lorem ipsum dolor sit amet..</p>';

        $this->output();

    }

    function output()
    {

        function content($id)
        {
            $FW = Framework::get_instance();
            // I want to get an instance of $this
            // To read and edit variables
            echo $FW->page->content->$id;
        }

        ?>
<html>
<head>
    <title><?php echo $this->page->title ?></title>
</head>

<body>
    <h1><?php content('h1') ?></h1>
    <?php content('body') ?>
</body>
</html>
        <?php
    }

}

new Framework;

Ответы [ 2 ]

4 голосов
/ 24 марта 2011

A get instance Метод обычно работает следующим образом ....

public static function getInstance() {
  static $instance;
  $class = __CLASS__;

  if ( ! $instance instanceof $class) {
     $instance = new $class;
  }

  return $instance;
}
  1. Настройка статической переменной, состояние которой сохраняется с ключевым словом static.
  2. Установите переменную, которая указывает на класс (немного облегчает обслуживание).
  3. Проверьте, является ли $instance экземплярным объектом из этого класса.
  4. Если это не так, то мы создаем новый объект из этого класса.
  5. Вернуть либо новый объект, который мы только что создали, либо существующий объект.

Так, вызов Class::getInstance() вернет новый объект при первом вызове, а последующие вызовы вернут существующий объект .

Синглтоны часто осуждаются по нескольким причинам, и Википедия довольно хорошо их охватывает ...

Этот шаблон делает модульное тестирование далеко сложнее, так как вводит глобальное состояние в приложении.

It Также следует отметить, что эта модель уменьшает потенциал для параллелизма в рамках программы, потому что доступ к синглтон в многопоточном контекст должен быть сериализован, например, блокировка.

Защитники зависимости инъекция будет рассматривать это как анти-шаблон, в основном за счет его использования частные и статические методы.

Некоторые имеют предложенные способы сломать синглтон с использованием таких методов как отражение в таких языках, как Java или PHP.

0 голосов
/ 23 апреля 2011

Нашел довольно хорошую статью по шаблону синглтона с PHP. Парень довольно хорошо объясняет это: http://phpadvocate.com/blog/?p=211

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...