Помогите понять ошибку PHP5

Короче... вопрос... "Что сказать?" Чтобы расширить... "Я не получаю ошибку"

Строгие стандарты: нестатический метод Pyro\Template::preLoad() не должен вызываться статически, предполагая, что $this из несовместимого контекста в /opt/lampp/htdocs/dc/pyro/app/controllers/admin/courses.php в режиме онлайн 14

public function actionIndex() {
    $this->data->users = $this->DB->query("SELECT id, name, description FROM :@courses")->getAll();
    $this->data->title = 'Courses';
    $this->data->content_area = \Pyro\Template::preLoad('admin/courses/index', $this->data); // Line 14
}

Шаблон... он неполный...

<?php
namespace Pyro;

class Template {

    // Stores default master template
    public static $defaultTemplate = 'template.php';

    public function preLoad($template, $page) {
        ob_start();

        include( VIEWS . "{$template}.php");

        $buffer = ob_get_contents();
        @ob_end_clean();
        return $buffer;
    }

    public function load($page) {
        include( VIEWS . self::$defaultTemplate);
    }
}

Почему появляется эта ошибка? Ваше здоровье


person John    schedule 01.03.2011    source источник


Ответы (4)


Что ж, функция preLoad не статична. Это означает, что только объект класса Template может использовать этот метод. Статический метод существует независимо от любого объекта класса.

Template::preLoad — это статический вызов: вы не создали объект Template, а затем вызвали метод preLoad. Итак, в основном у вас есть два решения:

  • Делаем preLoad статическим;
  • Создание объекта Template, а затем вызов его функции preLoad.
person Raveline    schedule 01.03.2011

preLoad функция должна быть статической

public static function preLoad($template, $page) {
person soju    schedule 01.03.2011

Функция preLoad не статична. ти должен выглядеть так:

public static function preLoad($template, $page) {
        ob_start();

        include( VIEWS . "{$template}.php");

        $buffer = ob_get_contents();
        @ob_end_clean();
        return $buffer;
    }
person Adrian Serafin    schedule 01.03.2011

Как все говорили, вы вызвали функцию как статический метод:

Template::preLoad(xxx)

:: означает статический в PHP. Функции обычно вызываются как статические :: или объектные -> вызовы.

Определение функции одно или другое:

public static function preLoad($template, $page)

Вызывается как: Template::preLoad('admin/courses/index', $this->data);

ИЛИ

public function preLoad($template, $page)

Вызывается как Template->preLoad('admin/courses/index', $this->data);

Для справки: статическую функцию можно вызывать без создания экземпляра объекта. Если вашей функции не нужен объект для запуска, вы можете сделать его статическим. По сути, это означает, что вы не можете ссылаться на $this в статическом методе. Он будет работать с заданными входными данными без необходимости создавать объект.

person dobrien    schedule 01.03.2011