扩展 PHP 帮助程序方法


Extending PHP helper methods

对于deleteBarDocument(),我不希望实现

$this->getModel()->updateParentAudit($this->audit_table,$_POST['id']);

deleteDocumentHelper() 帮助程序方法中,但实现其他内容,例如

$this->bla($_POST['id']);
$this->blabla($_POST['id'],$_POST['doc_id']);

如何延长deleteDocumentHelper() deleteBarDocument(),但保持原样deleteFooDocument()

通常,我只会替换

$this->getModel()->updateParentAudit($this->audit_table,$_POST['id']);

$this->doSomething();

并使用所需的任何代码创建doSomething()方法。 这种方法可能会影响deleteFooDocument()deleteBarDocument()这是不希望的。

还是应该向帮助程序方法传递匿名函数? 我对此持谨慎态度,因为我被警告说应该谨慎使用匿名功能。

<?php
class parentController
{
    protected function deleteDocumentHelper($type){
        if(isset($_POST['id'],$_POST['doc_id'])){
            if(documents::removeDocument($type,$_POST['doc_id'],$_POST['id']))
            {
                $success=1;
                //Ability to replace the following line with one or more lines
                $this->getModel()->updateParentAudit($this->audit_table,$_POST['id']);
            }
            else {$success=0;}
            header('Content-Type: application/json;');
            $this->dontCache();
            echo(json_encode(array('success'=>$success)));
        }
        else {exit($this->missingPage());}        
    }
}  
class childController extends parentController
{
    public function deleteFooDocument(){$this->deleteDocumentHelper('foo');}
    public function deleteBarDocument(){$this->deleteDocumentHelper('bar');}
}
//Application creates childController object, and evokes apprpropriate method based on GET/POST  
?>

你说:

通常,我只会替换

$this->getModel()->updateParentAudit($this->audit_table,$_POST['id']);

$this->doSomething();

并使用所需的任何代码创建 doSomething() 方法。这种方法可能会影响deleteFooDocument()deleteBarDocument()这是不希望的。

但是,为什么不遵循呢?

class parentController
{
    protected function doSomething()
    {
        $this->getModel()->updateParentAudit($this->audit_table,$_POST['id']);
    }
    protected function deleteDocumentHelper($type){
        if(isset($_POST['id'],$_POST['doc_id'])){
            if(documents::removeDocument($type,$_POST['doc_id'],$_POST['id']))
            {
                $success=1;
                //Ability to replace the following line with one or more lines
                $this->doSomething();
            }
            (...)
        }
        else {exit($this->missingPage());}        
    }
}  
class childController extends parentController
{
    private $somethingElse = False;
    protected function doSomething()
    {
        if( $this->somethingElse )
        {
            // Your deleteBar code 
        }
        else
        {
            parent::doSomething();
        }
    }
    protected function deleteDocumentHelper( $type, $somethingElse=False )
    {
        $this->somethingElse = $somethingElse;
        parent::deleteDocumentHelper( $type );
    }
    public function deleteFooDocument(){$this->deleteDocumentHelper('foo');}
    public function deleteBarDocument(){$this->$this->deleteDocumentHelper('bar',1);}
}

使用这种方法,您可以基本上保留父类,并仅在需要时应用不同的代码。