子最佳实践中来自父级的PHP调用函数

子最佳实践中来自父级的PHP调用函数,php,Php,我有一个关于PHP在子类中从父类调用函数的技巧性问题。 我们有三种情况,我要正反两方面 <?php class test{ private $var ; public function __construct(){ $this->var = 'Hello world'; } public function output(){ echo $var.'<br>'; } } //scenario 1 class test1 e

我有一个关于PHP在子类中从父类调用函数的技巧性问题。 我们有三种情况,我要正反两方面

<?php
class test{
   private $var ;
   public function __construct(){
    $this->var = 'Hello world';
   }

   public function output(){
      echo $var.'<br>';
   }
}
//scenario 1
class test1 extends test{
   public function __construct(){
    parent::__construct();
   }
   public function say(){
    parent::output();
   }
}
//scenario 2
class test2 extends test{
   public function __construct(){
    test::__construct();
   }
   public function say(){
    test::output();
   }
}
//scenario 3
class test3 extends test{
    private $handle ;
    public function __construct(){
     $this->handle = new test();
    }
    public function say(){
     $this->handle->output();
    }
}
//finally I can call any 3 cases by one of the below codes
$test1 = new test1();
$test1->say();
//or
$test2 = new test2();
$test2->say();
//or
$test3 = new test3();
$test3->say();
?>

是否有最佳实践或三种方案中有哪一种比其他方案更好

提前谢谢你。

1)是正确的

2) 不正确,请像静态方法一样调用该方法

3) 它在构造函数中没有任何意义扩展和创建。

1) 这是正确的,因为它从其方法调用父对象

class test1 extends test{
   public function __construct(){
    parent::__construct();
   }
   public function say(){
    parent::output();
   }
}
(二) 这里的继承是不必要的。 如果您选择此实现,则必须将
输出
和construct方法都更改为static

//scenario 2
class test2 extends test{
   public function __construct(){
    test::__construct();
   }
   public function say(){
    test::output();
   }
}
(三) 从这里继承也是不必要的。 注意这里您使用的是“组件重于继承”模式,这是一个很好的实践,因为它提供了更多的灵活性,但是您必须删除“扩展测试”


使用家长是一种很好的做法。谢谢。所有3个都做同样的事情,无论它们是否不正确,都是如此。3)被称为decorator模式,实际上有很好的用例。唯一不好的是,在本例中,要装饰的对象安装在装饰器内部,而不是从外部传递到装饰器中。因此,这个装饰器对于不同的Object.Sven及其自身扩展的类是不可用的。我不认为这是错误的。我说extend+构造没有意义
//scenario 3
class test3 extends test{
    private $handle ;
    public function __construct(){
     $this->handle = new test();
    }
    public function say(){
     $this->handle->output();
    }
}