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();
我不知道如何使用特點,但我檢查了在手冊。我有從c + +/java的背景,所以不確定實際使用的特徵。感謝這個想法。 – varuog 2012-08-10 08:13:55
@ user1538127:我剛剛添加了一個更簡單的替代方案,它適用於5.4之前的版本。 PS:如果你在C++/java中有背景,可以把特徵看作是部分繼承 – 2012-08-10 09:47:14