2013-04-06 64 views
0

我有一個關於PHP從子類中的父級調用函數的技巧問題。 我們有3個場景,我想要優點和缺點。父母在兒童最佳實踐中的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(); 
?> 

是否有最佳做法還是比其他方案更好?

預先感謝您。

+0

這是使用家長的好習慣。 – Ares 2013-04-06 08:55:19

回答

1

1)是正確的

2)不正確調用像一個靜態方法的方法。

3)它沒有任何意義上的擴展,並在構造函數中創建。

+0

謝謝。如果不正確的做出反應,所有3個人都會做同樣的事情。 :) – BogdanD 2013-04-06 08:57:21

+0

3)被稱爲修飾器模式,並且實際上有很好的用例。唯一不好的是,在這個例子中,被裝飾的對象是在裝飾器內部安裝的,而不是從外部傳入的。所以這個裝飾器對於不同的對象是不可用的。 – Sven 2013-04-06 09:53:14

+0

斯文和它自己擴展的類。我不說它是不正確的。我說擴展+構造沒有意義 – Maks3w 2013-04-06 17:48:11

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