我試圖隱藏使用函式來使用類的舊代碼。一些舊代碼只有在設定了高級選項時才可用。在基類中,我放置了所有函式(方法)。如果該功能可作為高級選項使用,它會在第二類中被覆寫。如果沒有,它應該說在基類中不可用。問題是我不知道如何呼叫一個類或另一個類,當然,除了放入一堆 if 之外。
原始函式看起來像這樣
function Testclass() {
if (advanced_enabled)
return 'Do advacned stuff<br>';
else
return 'Do base stuff<br>';
}
這是我的課程:
class A {
public function Testclass() {
return 'in base class<br>';
}
public function SomeBaseCode() {
}
}
class B {
public function Testclass() {
return 'in advanced class<br>';
}
}
如果我這樣做:
$a = new A();
echo 'base '.$a->Testclass();
$b = new B();
echo 'base '.$b->Testclass();
輸出是
in base class
in advanced class
我想要做的是使用高級課程(如果存在)。但是基類必須存在,因為它的方法總是可用的。我可以做這個
$a = new A();
echo 'base '.$a->Testclass();
if (advanced_enabled) {
$b = new B();
echo 'base '.$b->Testclass();
}
但這給了我兩個不同的類變數,我必須編輯很多代碼來檢查每個變數。我對課程還很陌生,所以也許我缺少一些基本的想法。有沒有辦法做到這一點?
uj5u.com熱心網友回復:
您的高級 B 類需要從基類 A 擴展。
class A {
public function Testclass() {
return 'in base class<br>';
}
public function SomeBaseCode() {
}
}
class B extends A {
public function Testclass() {
return 'in advanced class<br>';
}
}
實體化基于 advanced_enabled 標志。
$a = advanced_enabled ? new A() : new B();
$a->SomeBaseCode();
$a->Testclass();
uj5u.com熱心網友回復:
不要使用 直接創建類new,而是使用工廠為您執行此操作。這個工廠可以是一個不同的類,也可以是一個簡單的函式。如果您使用任何 PHP 框架,您可能正在使用依賴注入,它可以為您解決這個問題。
如果您不想重新定義所有方法(即 B 中的某些方法應該與 A 中的完全相同),您可以使用extend關鍵字讓 B 類繼承您未覆寫的 A 類的所有方法。這個原則稱為物件繼承。
在偽 PHP 中,它看起來有點像這樣:
// Define classes (interface is optional, but recommended)
interface someInterface {
public function testClass();
public function someOtherFunction();
}
class simpleVersion implements someInterface {
public function testClass() { /* ... */ }
public function someOtherFunction() { /* ... */ }
}
class advancedVersion extends simpleVersion {
public function testClass() { /* ... */ }
// someOtherFunction is not defined here. but is still usable!
}
// Create the factory responsible for instantiating the class
function createVersion() {
return $advancedEnabled ? new advancedVersion(); : new simpleVersion();
}
// Create the class instance (dynamically) and use it
$class = createVersion(); // $class is now either simpleVersion or advancedVersion.
$class->testClass();
此外,如果您希望 B 類方法執行“高級”操作,同時保留A 類的功能,您可以使用特殊parent::something();呼叫來“復制”基類的功能:
class Shouter() {
public function shout($text) {
return strtoupper($text);
}
}
class LoudShouter() extends Shouter {
public function shout($text) {
return parent::shout($text) . '!!!';
}
}
$text = 'Hello World';
$shouter1 = new Shouter();
$shouter2 = new LoudShouter();
var_dump(
$text,
$shouter1->shout($text),
$shouter2->shout($text)
);
// Output:
// -> Hello World
// -> HELLO WORLD
// -> HELLO WORLD!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/498105.html
