我有一个抽象类定义如下:
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的初学者,所以我做了一些根本错误的事情。有什么建议可以解决这个问题吗?如果我要将两个抽象方法定义为具有实现,然后在所有子项中覆盖这些方法(即,根本不处理抽象类),我将如何确保调用其中一个方法的父方法将调用相应的方法执行时的子方法?
修改
根据关于静态和抽象结合问题的各种评论,我重新定义了上面的类,带有一个新的错误,如上所示。
答案 0 :(得分:3)
静态方法不能使用$this
来引用自身,因为可以在不实例化类的情况下使用静态函数,因此无法保证$this
存在。
self
关键字可用于引用类树中的方法。你想要像这样实现它:
public static function newEntry($post) {
$t1 = self::funcA($post);
$t2 = self::funcB();
}
但请注意,Late Static Binding类结构存在问题。对于这种范围分辨率,PHP 5.3可以与以前的版本不同地工作,因此请务必阅读它。如果父/子结构不能正常工作,您总是可以通过精确的类名引用静态方法,即。 Child::funcA
。
答案 1 :(得分:1)
要解决当前对象的方法,您需要$this
:
$t1 = $this->funcA($post);
$t2 = $this->funcB();
单独调用funcA()
会查找全局定义的函数,而不是方法。
如果要从对象外部调用方法,请使用
$objectname->methodname()
答案 2 :(得分:1)
您将函数声明为静态,因此不能将它们与$ this一起使用。可以使用self ::或classname ::
引用静态方法在非静态方法的类实例上使用$ this。