PHP抽象方法解析

PHP抽象方法解析,php,Php,我有一个抽象类,定义如下: 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->f

我有一个抽象类,定义如下:

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;
    }
}
子类定义了两个抽象方法,如下所示:

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的初学者,所以我在做一些根本错误的事情。有什么建议可以帮助我解决这个问题吗?如果我将这两个抽象方法定义为具有实现,然后在所有子级中重写这些方法(即,根本不处理抽象类),我如何确保调用其中一个方法的父级在执行时调用相应的子方法

编辑


根据关于合并静态和抽象问题的各种评论,我如上所述重新定义了类,并出现了一个新的错误,如上所示。

要解决当前对象的方法,您需要
$this

    $t1 = $this->funcA($post);
    $t2 = $this->funcB();
单独调用
funcA()
查找全局定义的函数,而不是方法

如果要从对象外部调用该方法,请使用

$objectname->methodname()

要寻址当前对象的方法,您需要
$this

    $t1 = $this->funcA($post);
    $t2 = $this->funcB();
单独调用
funcA()
查找全局定义的函数,而不是方法

如果要从对象外部调用该方法,请使用

$objectname->methodname()

您将函数声明为静态函数,因此不能将它们与$this一起使用。静态方法可以通过self::或通过类名引用:


在非静态方法的类实例上使用$this。

您将函数声明为静态函数,因此不能将它们与$this一起使用。静态方法可以通过self::或通过类名引用:


在非静态方法的类实例上使用$this。

静态方法不能使用
$this
引用自身,因为静态函数可以在不实例化类的情况下使用,因此
$this
不能保证存在

self
关键字可用于引用类树中的方法。您可能希望这样实现它:

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

但是,请注意,在类结构方面存在一些问题。对于这种范围解析,PHP5.3的工作方式可能不同于以前的版本,因此请务必仔细阅读。如果父/子结构不适合您,您也可以始终使用准确的类名引用静态方法,即
child::funcA
静态方法不能使用
$this
引用自身,因为静态函数可以在不实例化类的情况下使用,因此,
$this
不能保证存在

self
关键字可用于引用类树中的方法。您可能希望这样实现它:

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

但是,请注意,在类结构方面存在一些问题。对于这种范围解析,PHP5.3的工作方式可能不同于以前的版本,因此请务必仔细阅读。如果父/子结构不能正常工作,您也可以通过准确的类名引用静态方法,即
child::funcA

,但是我得到了错误:“致命错误:在/var/www/../abstractparent.php第27行的对象上下文中不使用$this”aaaaah,我忽略了
static
。然后试试classname::methodname(),这是调用方法的静态方式。但是我不能从父级调用它,对吗?因为然后它将解析为父实现,这是抽象的……但是我得到了一个错误:“致命错误:在/var/www/../abstractparent.php第27行的对象上下文中不使用$this”aaaah,我忽略了
静态
。然后试试classname::methodname(),这是调用方法的静态方式。但是我不能从父级调用它,对吗?因为它将解析为父实现,它是抽象的…一个方法既抽象又静态是没有意义的。除了它是-该方法在实现类的上下文中是静态的。该值始终相同,并且不取决于类的状态。除非从编译器的角度来看这是无效的。。。忘记了导致最新错误的$。我以前觉得自己很笨,现在更糟了!谢谢大家的帮助@埃利:“鉴于各种评论……”-请不要这样做。论坛的存在不仅仅是为了解决你的问题。人们所评论和回答的问题现在已经不复存在,他们的答案变得毫无意义。如果您有更多问题,请创建不同的问题-不要更改现有问题以删除您所询问的错误。方法既抽象又静态是没有意义的。除此之外-该方法在实现类的上下文中是静态的。该值始终相同,并且不取决于类的状态。除非从编译器的角度来看这是无效的。。。忘记了导致最新错误的$。我以前觉得自己很笨,现在更糟了!谢谢大家的帮助@埃利:“鉴于各种评论……”-请不要这样做。论坛的存在不仅仅是为了解决你的问题。人们所评论和回答的问题现在已经不复存在,他们的答案变得毫无意义。如果您有更多问题,请创建不同的问题-不要更改现有问题以删除您所询问的错误。我尝试使用self::并在abstractparent.php中使用该选项时出错,使用此->会导致上面显示的错误。我尝试使用self::并在abstractparent.php中使用此->时出错,使用此->会导致上面显示的错误。我暂时删除了所有静态引用,导致