PHP父类方法继承问题

有几个类的很相似,只是其方法对数据处理的逻辑和最后数据输出的结果有些差别,可以通过这样的思路实现吗?

1.思路一,通过修改抽象函数逻辑实现返回值不同

abstract class parents{
    protected $data = array();
    public function get_content(
        $this->data = sql_get_content();
        return data_function($this->data);
    );
    protected sql_get_content(){
    //DB功能
    }
    abstract protected function data_function();
}
class child extends parents{ 
    abstract protected function data_function($data){
    //不同类对$data的处理逻辑不一样,使得get_content()返回的结果不一样
    };
}

2.思路二,继承父类的函数,不同子类在后面加不同的逻辑处理,最后返回不同结果。很想知道这个方法能不能行得通

abstract class parents{
    protected $data = array();
    public $result;
    public function get_content(
        $this->data = sql_get_content();
    );
    protected sql_get_content(){
    //DB功能
    }
}
class child extends parents{ 
    public function get_content(
        parent::get_content();
        //不同类对$data的处理逻辑不一样,使得get_content()返回的结果不一样
        return $this->result;
    );
}


_NULL_NULL
浏览 1345回答 1
1回答

思君满月

通过继承和复写是实现多态的一个手段:其实你这两种思路,本质上都是一样的。你的思路一对外只提供了一个接口,get_content,因为data_function()是保护的,所以你没打算让外界访问这个方法,只是用于类内部使用。子类通过复写这个方法既可以实现不同的处理逻辑。也许你会发现data_function其实只能在类内部访问,而且只被get_content访问,所以不如直接把它实现到get_function中,这时候子类必须复写get_content方法,并且增加处理逻辑。个人感觉思路一会好点,原因有2:思路一把处理逻辑抽象出来,一旦将来需求变化,处理逻辑需要在其他地方使用,思路1会很方便。我们通常是复写抽象方法,或实现接口方法,而不是复写一个已经实现的方法。其实思路一还可以进一步优化:因为我们的类只要是提供内容,数据的处理逻辑更像是一种工具,所以不如把处理逻辑抽象成一个接口,想这样:// 抽象工具 interface DataTool{    public function date_function($data); } // 具体工具 class DataTool1 implements DataTool{    public function data_function($data){        //处理逻辑        return $data;    } } // 内容提供者 class Parent{    private DataTool $dataTool;    public Parent(DataTool $dataTool){        $this->dataTool = $dataTool;    }    protected get_sql_content(){       // sql_content    }    public get_content(){       $sql_content = $this->get_sql_content();       $data        = $this->dataTool->data_function($sql_content);       return $data;    } }好处你可以自己思考,写太多了。
打开App,查看更多内容
随时随地看视频慕课网APP