Разрешение абстрактного метода PHP - PullRequest
0 голосов
/ 15 декабря 2009

У меня есть абстрактный класс, определенный следующим образом:

abstract class Abstract Parent extends Zend_Db_Table_Abstract { 
    abstract function funcA($post);
    abstract function funcB();

    public function newEntry($post) {  
        $t1 = $this->funcA($post);
        $t2 = $this->funcB();
    }
}

Дочерний класс определяет два абстрактных метода следующим образом:

require_once 'atablemodel.php';

class Child extends AbstractParent {    
    public function funcB() 
    {
        return 'Some Value';
    }

    public function funcA($post) 
    {
        $data = array(
            'v1'    => htmlentities($post['v1'])
        );
        return $data;
    }
}

Однако, когда я пытаюсь это сделать, я получаю сообщение об ошибке:

Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /var/www/.../abstractparent.php on line 27

это строка, в которой абстрактный родительский объект вызывает один из абстрактных методов. Я хочу, чтобы эта строка вызывала дочерний метод, который определен.

Теперь я предполагаю, что есть способ сделать это, и, поскольку я новичок в PHP, я делаю что-то в корне неправильно. Любые предложения относительно того, что я мог бы сделать, чтобы решить эту проблему? Если бы я определил два абстрактных метода как имеющие реализации, а затем переопределил эти методы во всех дочерних элементах (то есть вообще не имел дело с абстрактными классами), как бы я гарантировал, что родитель, вызывающий один из этих методов, вызовет соответствующий дочерний метод во время выполнения?

EDIT

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

Ответы [ 3 ]

3 голосов
/ 15 декабря 2009

Статический метод не может использовать $this для ссылки на себя, поскольку статическая функция может использоваться без создания экземпляра класса, и поэтому $this нельзя гарантировать существование.

Ключевое слово self может использоваться для ссылки на методы в дереве классов. Вы хотели бы реализовать это так:

public static function newEntry($post)      {  
    $t1 = self::funcA($post);
    $t2 = self::funcB();
}

Однако учтите, что существуют проблемы, связанные с Поздним статическим связыванием структур классов. PHP 5.3 может работать не так, как предыдущие версии для такого рода разрешения области, поэтому обязательно прочтите его. Если родительская / дочерняя структура не работает для вас должным образом, вы всегда можете ссылаться на статический метод по точному имени класса, т.е. Child::funcA.

1 голос
/ 15 декабря 2009

Вы объявили функции как статические, поэтому вы не можете использовать их с $ this. На статические методы можно ссылаться с помощью self :: или с помощью имени класса ::

Вы используете $ this для экземпляра класса в нестатических методах.

1 голос
/ 15 декабря 2009

Чтобы обратиться к методу текущего объекта, вам нужно $this:

    $t1 = $this->funcA($post);
    $t2 = $this->funcB();

вызов funcA() сам ищет глобально определенную функцию, а не метод.

Если вы хотите вызвать метод извне объекта, используйте

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