2012-08-08 93 views
0
abstract class User 
{ 
    protected $content; // $content object will be assigned here 


} 

class Member extends User 
{ 

} 


abstract class Content 
{ 
function create() 
{ 
    //create some content 
} 
} 

class Text extends Content 
{ 

} 

class Image extends Content 
{ 
} 

Abstract User可以根據可自定義的班級擴展到其他班級。每個卷具有使用Content類的不同權限,並且它是子類方法。我可以手動爲每個方法編寫每個權限,但我想動態執行此操作。從另一個班級撥打電話時限制班級的方法

我該怎麼做?

回答

1

UPDATE

在閱讀您的問題第二次,我剛剛想到了另一種方式,是你需要的東西更適合。儘管php不支持多繼承,並且特性需要php> = 5.4,但您可能需要考慮添加第二代「代」(另一層兒童)。抽象類僅包含所有可用的方法,最好使用final關鍵字,或者只在該行的某個位置有1個變體(在這種情況下,放棄final關鍵字並覆蓋成員函數)。

正如我以前說過的,我不解釋這個東西,不錯,所以我提前去上你的課怎麼可能看起來像一個放在一起的例子:

abstract class User 
{ 
    public function __construct() 
    { 
     echo get_class($this).'<br/>'; 
    } 
    final function forAll() 
    { 
     echo 'access for all'; 
    } 
} 
class TxtGroup extends User 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
    public function abstr() 
    { 
     echo 'TxtGroup specific'; 
    } 
} 
class ImgGroup extends User 
{ 
    public function __construct() 
    { 
     echo 'Same, but different for ImgGroup<br/>'; 
     parent::__construct(); 
    } 
    public function abstr() 
    { 
     echo 'ImgGroup specific'; 
    } 
} 
class inst1 extends TxtGroup 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     if ($this instanceof TxtGroup) 
     { 
      echo 'Child member of: TxtGroup<br/>'; 
     } 
     if ($this instanceof inst1) 
     { 
      echo 'Child instance of inst1 (itself)<br/>'; 
     } 
     if ($this instanceof User) 
     { 
      echo 'grand-Child of User<br/>'; 
     } 
    } 
    public function objSpecific() 
    { 
     echo 'self explanatory<br/>'; 
    } 
} 
class inst2 extends ImgGroup 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     if ($this instanceof ImgGroup) 
     { 
      echo 'Child member of: ImgGroup<br/>'; 
     } 
     if ($this instanceof inst2) 
     { 
      echo 'Child insance of inst2 (itself)<br/>'; 
     } 
     if ($this instanceof User) 
     { 
      echo 'grand-Child of User<br/>'; 
     } 
    } 
} 
$foo = new inst1(); 
$bar = new inst2(); 

看看我意思?輸出:

INST1
子成員的:TxtGroup用戶
相同的INST1的
兒童實例(本身)
盛大孩子,但不同的ImgGroup
INST2
的 子成員:ImgGroup
INST1的兒童insance(本身)
用戶的盛大孩子


如果您使用的是最新版本的PHP,那麼您就有這種特質。有很多方法可以檢查哪個類正在調用成員函數。最簡單的,海事組織,是通過檢查get_class($this);值開始你的方法:

abstract class Foo 
{ 
    public function who() 
    { 
     echo get_class($this); 
    } 
} 
class bar extends Foo 
{ 
    public function __construct() 
    { 
     $this->who(); 
    } 
} 
$f = new bar(); 

回聲的bar,這樣你就可以改變的抽象方法,並在必要時拋出異常。

同樣的結構可用於重載某些方法,像這樣的(可怕的)例子(試圖展示/)顯示:

abstract class Foo 
{ 
    public function who() 
    { 
     $child = explode('_',get_class($this)); 
     if (end($child) === 'whoExec') 
     { 
      return $this->whoExec(); 
     } 
     echo 'this isn\'t for bar the bar instance'; 
     return $this; 
    } 
    private function whoExec() 
    { 
     if(!strstr('whoExec',get_class($this))) 
     { 
      return $this->who(); 
     } 
     echo 'This methods mimics overloading -sort of'; 
     return $this; 
    } 
} 
class bar_whoExec extends Foo 
{ 
    public function __construct() 
    { 
     $this->who(); 
    } 
} 
$f = new bar(); 
+0

我不知道如何使用特點,但我檢查了在手冊。我有從c + +/java的背景,所以不確定實際使用的特徵。感謝這個想法。 – varuog 2012-08-10 08:13:55

+0

@ user1538127:我剛剛添加了一個更簡單的替代方案,它適用於5.4之前的版本。 PS:如果你在C++/java中有背景,可以把特徵看作是部分繼承 – 2012-08-10 09:47:14

相關問題