override — переопределение магического метода в переполнении стека

Я гуглил в течение часа и нашел варианты этой проблемы, но не эту точную версию проблемы, за исключением одного сообщения в блоге, которое не работало.

Я хочу переопределить метод в расширенном классе PHP и вызвать родителя внутри тела нового. Проблема в том, что родитель не имеет такого метода, но реализует __call() чтобы раскрыть эту функциональность.

Например:

class B extends A {
public function setParentId($new_id)
{
parent::setParentId($new_id);
$this->buildParentTreeCache();
return $this;
}

Это не работает На самом деле я получаю неприятную внутреннюю ошибку или неправильную конфигурацию Apache.

Я нашел это решение, которое не сработало:
(За исключением того, что я добавил array($new_id) часть. В примере используется NULL.)

class B extends A {
public function setParentId($new_id)
{
parent::__call('setParentId', array($new_id));
$this->buildParentTreeCache();
return $this;
}

Этот должен был сработать! Я не знаю, что я делаю не так.

Какой правильный способ сделать это?

Редактировать:

Я не уверен, что не так с моей конфигурацией, но сообщения об ошибках, которые я получаю, просто:

[Mon May 04 12:13:12.778136 2015] [fastcgi:error] [pid 30512] (104)Connection reset by peer: [client 127.0.0.1:54854] FastCGI: comm with server "/var/www/fastcgi/php5.fastcgi" aborted: read failed, referer: http://admin.mysite/index.php/category/index
[Mon May 04 12:13:12.779620 2015] [fastcgi:error] [pid 30512] [client 127.0.0.1:54854] FastCGI: incomplete headers (0 bytes) received from server "/var/www/fastcgi/php5.fastcgi", referer: http://admin.mysite/index.php/category/index

Изменить 2:

Базовый класс (класс A в этом примере) — это автоматически сгенерированный файл, в котором также нет кода, который я пытаюсь вызвать.

Фактически, это базовый класс модели Doctrine 1, называемый BaseCategory, который происходит от sfDoctrineRecord.

class Category extends BaseCategory // My class
class BaseCategory extends sfDoctrineRecord // Autogenerated, prone to be verwritten by the generator

Код для класса sfDoctrineRecord находится здесь:

http://trac.symfony-project.org/browser/branches/1.2/lib/plugins/sfDoctrinePlugin/lib/record/sfDoctrineRecord.class.php

3

Решение

Как и предположил moonwave99, вы должны посмотреть Вот

Позаботьтесь об использовании Родитель :: метод с не заявленным методом при использовании
__call, потому что в этом случае строковый метод будет в нижнем регистре:

<?php
class A {
function __call( $method, $args ) {
echo get_class( $this )  . ' ' . $method . "\n";
}
}

class B extends A {
function getTest() {
parent::getTest();
}
}

$a = new A();
$a->getTest();
$b = new B();
$b->getTest();

?>

output:

A getTest
B gettest

Это может быть причиной вашей ошибки, поэтому, когда вы делаете parent::setParentId($new_id); вероятно, что оно интерпретируется как:

Родитель :: наборпАрентяд ($ new_id);

Попробуйте также использовать строчные буквы в классе А

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]