0

我有一个关于 PHP 从子类中的父级调用函数的技巧问题。我们有 3 个场景,我想要优点和缺点。

<?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();
?>

是否有最佳实践,或者这 3 种方案中是否有任何一种比其他方案更好?

先感谢您。

4

2 回答 2

1

1) 是正确的

2)像静态方法一样调用方法是不正确的。

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

于 2013-04-06T08:54:47.377 回答
0

1)这个是正确的,因为它从其方法中调用父级。

class test1 extends test{
   public function __construct(){
    parent::__construct();
   }
   public function say(){
    parent::output();
   }
}

2)这里的继承是不必要的。如果选择此实现,则必须将两者output和构造方法都更改为静态。

//scenario 2
class test2 extends test{
   public function __construct(){
    test::__construct();
   }
   public function say(){
    test::output();
   }
}

3)从这里继承也是不必要的。请注意,您使用的是“组件优于继承”模式,这是一种很好的做法,因为它提供了更大的灵活性,但您必须删除“扩展测试”。

//scenario 3
class test3 extends test{
    private $handle ;
    public function __construct(){
     $this->handle = new test();
    }
    public function say(){
     $this->handle->output();
    }
}
于 2013-04-06T09:13:56.820 回答