Статические объекты PHP, приводящие к фатальной ошибке - PullRequest
0 голосов
/ 05 мая 2010

У меня есть следующий код PHP;

<?php

component_customer_init();
component_customer_go();


function component_customer_init()
{
    $customer = Customer::getInstance();
    $customer->set(1);
}
function component_customer_go()
{
    $customer = Customer::getInstance();
    $customer->get();
}

class Customer
{
    public $id;
    static $class = false;
    static function getInstance()
    {
        if(self::$class == false)
        {
                self::$class = new Customer;
        }
        else
        {
                return self::$class;
        }
    }


    public function set($id)
    {
        $this->id = $id;
    }

    public function get()
    {
        print $this->id;
    }

}
?>

Я получаю следующую ошибку;

Неустранимая ошибка: вызов функции-члена set () для необъекта в /.../classes/customer.php в строке 9

Может кто-нибудь сказать мне, почему я получаю эту ошибку? Я знаю, что этот код может выглядеть странно, но он основан на системе компонентов, которую я пишу для CMS. Цель состоит в том, чтобы иметь возможность заменить HTML-теги в шаблоне, например;

<!-- component:customer-login -->

с *; 1013 *

<?php component_customer_login(); ?>

Мне также нужно вызывать методы предварительного рендеринга класса "Customer" для проверки форм перед выполнением вывода и т. Д.

Если кто-нибудь может придумать лучший способ, пожалуйста, дайте мне знать, но прежде всего я хотел бы знать, почему я получаю упомянутую выше «фатальную ошибку».

Ответы [ 2 ]

3 голосов
/ 05 мая 2010

Ну, я думаю, что ваш Customer::getInstance() метод некорректен. Это должно выглядеть так:

...
static function getInstance()
{
    if(self::$class == false)
    {
            self::$class = new Customer;
            return self::$class; // ADDED!!
    }
    else
    {
            return self::$class;
    }
}
....

В ветви if(self::$class == false) вы создаете экземпляр класса, но не возвращаете его.

Вы также можете переписать его так:

static function getInstance()
{
    if(self::$class == false)
    {
        self::$class = new Customer; 
    }

    return self::$class;
}

Чтобы сделать его немного короче.

1 голос
/ 05 мая 2010

СУХОЙ: не повторяйся

static function getInstance()
{
    if(self::$class == false)
    {
        self::$class = new Customer;
    }
    return self::$class;
}

А для Sinlgetons также важно предотвратить использование __clone (). Сделав его закрытым, нужно решить эту проблему:

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