[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ООП, наследование, preg_replace_callback...
wolfandman
Краткое описание:

в методе text класса А объявляется объект класс B, который в свою очередь пытается использовать некоторые методы класса A, что в итоге пораждает ошибку.

Тут всё не так страшно как кажется с начала:

// Главный класс. Имеет все средства обработки

class A {

public $word = 'Слово';

// Поиск идентификатора скрипта и вызов метода замены идентификатора на скрипт

public function callback($item){

return preg_replace_callback("/{SCRIPT_(.+?);}/ui", array('A', 'code_replacement'), $code);

}

// Собственно, замена.

private function code_replacement($matches)
{

return $this->word; // Тут на самом деле происходит замена и нщё дополнительные действия, но для примера я просто возвращаю слово

}

// B - класс поиска записей в БД

public function text()
{

$text = new B(); // Объявляем объект
$text->getDBRecord(); // Ищем и достаём запись. По плану в объекте B произойдёт вызов A::callback()

}

}


class B {

public function getDBRecord()
{

// ...Выборка из БД
$row[0] = 'Вот последние 5 статей: {SCRIPT_GET_LAST_ARTICLES}'; // Например, достали вот такой текст.
return A::callback($row[0]); // ВОТ на этом месте и ошибка

}

}


$a = new A;
echo $a->text();


Итог работы программы:

Fatal error: Using $this when not in object context in ........ Речь идёт об ошибке в классе A. Ругает вызов $this->word;


Что я делаю не так? Расчитываю на вашу помощь. Спасибо



Спустя 2 часа, 31 минута, 27 секунд (14.01.2011 - 07:11) Hoodzon написал(а):
Посмотри эту работу, много чего для себя нового откроешь, а также исправишь свою ошибку.
http://phpforum.ru/index.php?showtopic=37524

Спустя 2 часа, 5 минут, 7 секунд (14.01.2011 - 09:16) linker написал(а):
Ну во-первых, метод callback() класса A не является статическим, поэтому вызов A::callback() неправомерен. Во-вторых, либо делать так
$text->getDBRecord($this);
...

public function getDBRecord(A $Reference)
{
...
return $Reference->callback($row[0]);
}
либо так
class A
{
...
public function text()
{
$text = new B($this);
$text->getDBRecord();
}
}

class B
{
protected $Reference = null;
public function __construct(A $Ref)
{
$this->Reference = $Ref;
}

public function getDBRecord()
{
...
return $this->Reference->callback($row[0]);
}
}

Спустя 1 день, 18 часов, 56 минут, 55 секунд (16.01.2011 - 04:13) wolfandman написал(а):
Hoodzon, спасибо, посмотрю

linker, большое спасибо! Работает.


_____________
Лучше быть, чем казаться
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.