Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 让子类调用父类_Php_Oop - Fatal编程技术网

Php 让子类调用父类

Php 让子类调用父类,php,oop,Php,Oop,我有时发现自己在各种不同的相关事物上执行类似的任务。例如,我可能有“书籍”、“电影”和“歌曲”,我可能有任务“addNote”,它从客户机获取注释文本,将其添加到数据库,将其与适当的父记录关联,并将一些数据返回给客户机。我已经按如下所示实现了它,虽然它可以工作,但它似乎是错的。有没有更好的方法来做到这一点,如果有,如何做到?谢谢 class parentClass { protected function someTask($table) { //do the t

我有时发现自己在各种不同的相关事物上执行类似的任务。例如,我可能有“书籍”、“电影”和“歌曲”,我可能有任务“addNote”,它从客户机获取注释文本,将其添加到数据库,将其与适当的父记录关联,并将一些数据返回给客户机。我已经按如下所示实现了它,虽然它可以工作,但它似乎是错的。有没有更好的方法来做到这一点,如果有,如何做到?谢谢

class parentClass
{
    protected function someTask($table)
    {
        //do the task which is common to child1/2/3Class using $table
    }
}

class child1Class extends parentClass
{
    public function someTask($dummy=NULL){parent::someTask('class1_table');}
}
class child2Class extends parentClass
{
    public function someTask($dummy=NULL){parent::someTask('class2_table');}
}
class child3Class extends parentClass
{
    public function someTask($dummy=NULL){parent::someTask('class3_table');}
}

$ajax=new child1Class(); //specific childClass based on MVC
$ajax->someTask();

你的方式是正确的。您唯一的其他选择是将父方法设置为“public”

  • Public使方法可以通过对象直接访问
  • Protected使该方法可以通过子类访问
  • Private使方法只能通过其自己的类访问

为什么看起来不对?我觉得很体面。有什么特别困扰你的吗?@Raidenace我想这似乎是倒退了。通常,我从子对象创建一个对象,它附带了父功能。每个子对象必须根据发送给它的$table值实现parent::someTask()。这样不行。是的,现在可以了。最初创建子类并启动该方法的应用程序无法添加参数。您可以创建对象并使用其自己的参数对该对象调用该方法。它应该会起作用。我稍微修改了这个例子以反映不同的情况。虽然您现在只需要一个子类就可以获得相同的结果,但我的应用程序从客户端获取控制器和任务,并基于控制器创建对象,并基于任务执行方法。任何其他所需数据由特定任务获得。我想我一开始是对的,但对我来说总是很奇怪。谢谢你的帮助。
class parentClass
{
    public function someTask($table)
    {
        echo "hello " . $table;
    }
}

class child1Class extends parentClass
{
  // no needed method here
}
 class child2Class extends parentClass
{
  // no needed method here
}

$obj1 = new child1Class();
$obj1->someTask('class1_table');
$obj2 = new child1Class();
$obj2->someTask('class2_table');
$obj3 = new child2Class();
$obj3->someTask('class3_table');

result with obj1: "hello class1_table"
result with obj2: "hello class2_table"
result with obj3: "hello class3_table"