<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # PHP 中的面向對象編程 > 原文: [https://zetcode.com/lang/php/oopi/](https://zetcode.com/lang/php/oopi/) 在 PHP 教程的這一部分中,我們將討論 PHP 中的面向對象編程。 那里有三種廣泛使用的編程范例:過程編程,函數編程和面向對象的編程。 PHP 5 支持過程式編程和面向對象的編程。 PHP 的早期版本對 OOP 的支持有限或不支持。 面向對象編程(OOP)是一種使用對象及其相互作用設計應用和計算機程序的編程范例。 OOP 中的基本編程概念是: * 抽象 * 多態 * 封裝 * 繼承 抽象通過建模適合該問題的類來簡化復雜的現實。 多態是將運算符或函數以不同方式用于不同數據輸入的過程。 封裝對其他對象隱藏了類的實現細節。 繼承是一種使用已經定義的類形成新類的方法。 ## PHP 對象 對象是 PHP OOP 程序的基本構建塊。 對象是數據和方法的組合。 在 OOP 程序中,我們創建對象。 這些對象通過方法進行通信。 每個對象都可以接收消息,發送消息和處理數據。 創建對象有兩個步驟。 首先,我們創建一個類。 類是對象的模板。 它是一個藍圖,描述了類對象共享的狀態和行為。 一個類可以用來創建許多對象。 在運行時從類創建的對象稱為該特定類的實例。 `simpleclass.php` ```php <?php class Simple {} $object = new Simple(); print_r($object); echo gettype($object), "\n"; ``` 在第一個示例中,我們創建一個簡單的對象。 ```php class Simple {} ``` 這是一個簡單的類定義。 模板的主體為空。 它沒有任何數據或方法。 ```php $object = new Simple(); ``` 我們創建`Simple`類的新實例。 為此,我們使用了`new`關鍵字。 `$object`變量是創建對象的句柄。 ```php print_r($object); echo gettype($object), "\n"; ``` 我們使用`print_r()`函數獲取有關對象的信息,并使用`gettype()`函數獲取變量的類型。 ```php $ php simpleclass.php Simple Object ( ) object ``` 由于類定義為空,因此我們沒有太多信息。 變量的類型為`object`。 ## PHP 對象屬性 對象屬性是捆綁在類實例中的數據。 對象屬性稱為實例變量或成員字段。 實例變量是在類中定義的變量,該類中的每個對象都有一個單獨的副本。 `memberfields.php` ```php <?php class Person { public $name = ""; } $p1 = new Person(); $p1->name = "Jane"; $p2 = new Person(); $p2->name = "Beky"; echo $p1->name . "\n"; echo $p2->name . "\n"; ``` 在上面的 PHP 腳本中,我們有一個帶有一個成員字段的`Person`類。 ```php $p1 = new Person(); $p1->name = "Jane"; ``` 我們創建一個`Person`類的實例,并將`$name`變量設置為`"Jane"`。 我們使用`->`運算符訪問對象的屬性。 ```php $p2 = new Person(); $p2->name = "Beky"; ``` 我們創建`Person`類的另一個實例。 在這里,我們將變量設置為`"Beky"`。 ```php echo $p1->name . "\n"; echo $p2->name . "\n"; ``` 我們將變量的內容打印到控制臺。 ```php $ php memberfields.php Jane Beky ``` 我們看到了腳本的輸出。 `Person`類的每個實例都有`$name`成員字段的單獨副本。 ## PHP 方法 方法是在類主體內定義的函數。 它們用于通過對象的屬性執行操作。 在 OOP 范式的封裝概念中,方法至關重要。 例如,我們的`AccessDatabase`類中可能有一個`connect()`方法。 我們無需知道方法`connect()`與數據庫的連接方式如何。 我們只知道它用于連接數據庫。 這對于劃分編程中的職責至關重要,尤其是在大型應用中。 `circle.php` ```php <?php class Circle { public $radius; function setRadius($radius) { $this->radius = $radius; } function area() { return $this->radius * $this->radius * M_PI; } } $c = new Circle(); $c->setRadius(5); echo $c->area(), "\n"; ``` 在代碼示例中,我們有一個`Circle`類。 我們定義了兩種方法。 ```php public $radius; ``` 我們只有一個成員字段。 它是圓的半徑。 `public`關鍵字是訪問說明符。 它表明該變量可以從外界完全訪問。 ```php function setRadius($radius) { $this->radius = $radius; } ``` 這是`setRadius()`方法。 這是一個正常的 PHP 函數。 我們將在類內定義的函數稱為方法。 `$this`變量是一個特殊變量,我們用它來訪問方法中的成員字段。 ```php function area() { return $this->radius * $this->radius * M_PI; } ``` `area()`方法返回圓的面積。 `M_PI`是內置常數。 ```php $ php circle.php 78.539816339745 ``` 運行示例將給出此輸出。 ## PHP 訪問修飾符 訪問修飾符設置方法和成員字段的可見性。 PHP 具有三個訪問修飾符:`public`,`protected`和`private`。 可以從任何地方訪問`public`成員。 `protected`成員只能在類本身內以及被繼承的和父類訪問。 `private`成員只能由定義該成員的類訪問。 訪問修飾符可防止意外修改數據。 它們使程序更強大。 `access1.php` ```php <?php class Person { public $name = ""; private $age; } $p = new Person(); $p->name = "Jane"; #$p->age = 17; echo $p->name . "\n"; ``` 在上面的 PHP 腳本中,我們有兩個成員字段; 一個被宣布為公開,另一個被宣布為私有。 ```php $p->name = "Jane"; #$p->age = 17; ``` 我們從外部訪問`$name`成員。 在外部世界,我們的意思是“不在類中”。 可以,因為`$name`變量被聲明為`public`。 無法訪問`$age`成員。 `private`修飾符禁止這樣做。 如果取消注釋代碼行,則將出現“致命錯誤:無法訪問私有屬性`Person::$age`”錯誤。 `access2.php` ```php <?php class Base { public $name = "Base"; protected $id = 6124; private $is_defined = "yes"; } class Derived extends Base { public function info() { echo "This is Derived class\n"; echo "Members inherited: \n"; echo $this->name . "\n"; echo $this->id . "\n"; echo $this->is_defined . "\n"; } } $derived = new Derived(); $derived->info(); ``` 在此 PHP 腳本中,我們有一個`Derived`類,該類擴展了`Base`類。 `Base`類具有三個成員字段,所有成員字段均具有不同的訪問修飾符。 `$is_defined`成員未繼承。 `private`修飾符可以防止這種情況。 ```php public function info() { ``` `info()`方法具有`public`訪問修飾符。 這意味著可以在類環境之外調用它。 ```php $ php access2.php This is Derived class Members inherited: Base 6124 ``` 運行 PHP 腳本,我們收到此輸出。 公共成員和受保護成員是繼承的,私有成員則不是。 `system.php` ```php <?php class SysInfo { private function get_date() { return date("Y/m/d"); } private function get_version() { return phpversion(); } public function getInfo() { $date = $this->get_date(); $version = $this->get_version(); echo "The date is: $date\n"; echo "The PHP version is: $version\n"; } } $sys = new SysInfo(); $sys->getInfo(); #$sys->get_date(); ``` 在此腳本中,我們有一個`SysInfo`類。 它將一些系統信息輸出到控制臺。 我們有兩個私有職能和一個公共職能。 這里的私有方法僅用于`SysInfo`類的內部工作。 他們不應該在類外被調用。 ```php $sys = new SysInfo(); $sys->getInfo(); #$sys->get_date(); ``` 我們創建`SysInfo`類的實例,并調用可公開使用的`getInfo()`方法。 `getInfo()`方法在內部使用私有方法來完成其工作。 取消注釋最后的代碼行會產生錯誤。 ## PHP 方法重載 方法重載允許創建多個具有相同名稱的方法,它們的輸入類型彼此不同。 方法重載有什么好處? Qt4 庫提供了一個很好的用法示例。 `QPainter`類具有三種繪制矩形的方法。 它們的名稱為`drawRect()`,其參數不同。 一個引用一個浮點矩形對象,另一個引用一個整數矩形對象,最后一個引用四個參數,`x`,`y`,`width`,`height`。 如果開發 Qt 的 C++ 語言沒有方法重載,則庫的創建者必須將其命名為`drawRectRectF()`,`drawRectRect()`和`drawRectXYWH()`之類的方法。 方法重載的解決方案更為優雅。 `overloading1.php` ```php <?php class Sum { public function getSum() { return 0; } public function getSum($x) { return $x; } public function getSum($x, $y) { return $x + $y; } } $s = new Sum(); echo $s->getSum() . "\n" ; echo $s->getSum(5) . "\n" ; echo $s->getSum(3, 4) . "\n" ; ``` 這是一種方法重載,我們從 C# ,Java 或 C++ 等語言知道。 但這在 PHP 中不起作用。 運行此示例,我們得到以下錯誤:“致命錯誤:無法重新聲明`Sum::getSum()`”。 PHP 函數默認可以接受任意數量的變量。 為了模擬 PHP 中的方法重載,我們使用`func_get_args()`函數。 `overloading2.php` ```php <?php class Sum { public function getSum() { $args = func_get_args(); if (empty($args)) return 0; foreach ($args as $arg) { $sum += $arg; } return $sum; } } $s = new Sum(); echo $s->getSum() . "\n" ; echo $s->getSum(5) . "\n" ; echo $s->getSum(3, 4) . "\n" ; echo $s->getSum(3, 4, 7) . "\n" ; ``` 這次,腳本將運行。 ```php $args = func_get_args(); ``` `func_get_args()`函數返回一個包含函數的參數列表的數組。 ```php foreach ($args as $arg) { $sum += $arg; } ``` 我們遍歷數組的所有成員,然后計算總和。 ```php echo $s->getSum() . "\n" ; echo $s->getSum(5) . "\n" ; echo $s->getSum(3, 4) . "\n" ; echo $s->getSum(3, 4, 7) . "\n" ; ``` 我們用不同數量的輸入調用相同的方法名稱。 ```php $ php overloading2.php 0 5 7 14 ``` 這是`overloading2.php`腳本的輸出。 ## PHP 構造器 構造器是一種特殊的方法。 創建對象時會自動調用它。 構造器的目的是初始化對象的狀態。 PHP 中的構造器名稱為`__construct()`(帶有兩個下劃線)。 `constructor.php` ```php <?php class Song { function __construct() { echo "Song object is created \n"; } } $song = new Song(); ``` 我們有一個`Song`類。 此類具有構造器,該構造器將消息輸出到控制臺。 ```php $song = new Song(); ``` 這是創建對象并調用構造器的時間。 我們在控制臺中收到一條消息。 ```php $ php constructor.php Song object is created ``` 這是腳本的輸出。 構造器經常會爭論。 `constructor2.php` ```php <?php class Song { function __construct($song) { echo "Song $song is created \n"; } } $song = new Song("Bad romance"); ``` 我們對前面的示例進行一些修改。 我們將一個值傳遞給構造器。 ```php function __construct($song) { echo "Song $song is created \n"; } ``` 傳遞的參數存儲在本地`$song`變量中。 ```php $ php constructor2.php Song Bad romance is created ``` 現在,我們有一條消息,其中的歌曲標題印在控制臺上。 在下一個示例中,我們初始化類的數據成員。 變量的初始化是構造器的典型工作。 `friend.php` ```php <?php class Friend { private $born; private $name; function __construct($name, $born) { $this->name = $name; $this->born = $born; } function getInfo() { echo "My friend $this->name was born in $this->born\n"; } } $friend = new Friend("Monika", 1990); $friend->getInfo(); ``` 我們有一個帶有數據成員和方法的`Friend`類。 ```php private $born; private $name; ``` 類定義中有兩個變量。 `private`關鍵字是訪問修飾符。 它是一種封裝。 `private`關鍵字是限制性最強的修飾符。 它僅允許有問題的對象訪問變量。 沒有子孫,沒有其他物件。 稍后會更多有關此主題的信息。 ```php function __construct($name, $born) { $this->name = $name; $this->born = $born; } ``` 在構造器中,我們啟動兩個數據成員。 `$this`變量是用于引用對象變量的處理器。 ```php $friend = new Friend("Monika", 1990); $friend->getInfo(); ``` 我們創建帶有兩個參數的`Friend`對象。 然后,我們調用對象的`getInfo()`方法。 要調用對象方法,我們使用`->`運算符。 ```php $ php friend.php My friend Monika was born in 1990 ``` ## PHP 類常量 PHP 可以創建類常量。 這些常量不屬于具體對象。 他們屬于階級。 按照約定,常量用大寫字母表示。 `constants.php` ```php <?php class Math { const PI = 3.14159265359; public function getPI() { echo self::PI; } } $math = new Math(); echo Math::PI, "\n"; echo $math->getPI(), "\n"; ``` 我們有一個帶有`PI`常數的`Math`類。 ```php const PI = 3.14159265359; ``` `const`關鍵字用于定義常數。 ```php public function getPI() { echo self::PI; } ``` 使用`self`關鍵字后接兩個冒號從方法內部訪問類常量。 ```php echo Math::PI, "\n"; echo $math->getPI(), "\n"; ``` 我們將`PI`常量打印到控制臺。 在第一種情況下,我們通過引用類名稱來獲得常量值,然后是兩個冒號和一個常量名稱。 請注意,不需要任何對象即可獲取類常量。 在第二種情況下,我們使用對象方法。 ## PHP `instanceof`關鍵字 `instanceof`關鍵字用于確定 PHP 變量是否是某個類的實例化對象。 `instanceof.php` ```php <?php class Cat {} class Dog {} class Bird {} $objects = [ new Cat(), new Dog(), new Cat(), new Bird(), new Bird(), new Dog(), new Dog(), new Cat(), new Bird() ]; shuffle($objects); foreach ($objects as $object) { if ($object instanceof Cat) { echo "It is a Cat\n"; } elseif ($object instanceof Dog) { echo "It is a Dog\n"; } else if ($object instanceof Bird) { echo "It is a Bird\n"; } } ``` 在上面的腳本中,我們有三個類:`Cat`,`Dog`和`Bird`。 我們遍歷數組并為每個數組值打印類。 ```php $objects = [ new Cat(), new Dog(), new Cat(), new Bird(), new Bird(), new Dog(), new Dog(), new Cat(), new Bird() ]; ``` 我們創建這些對象的數組。 ```php shuffle($objects); ``` 我們對數組進行混洗。 在這一點上,我們不知道數組值的類類型。 ```php if ($object instanceof Cat) { echo "It is a Cat\n"; } ``` 在這里,我們使用`instanceof`關鍵字找出類的類型。 ```php $ php instanceof.php It is a Bird It is a Cat It is a Cat It is a Dog It is a Dog It is a Cat It is a Dog It is a Bird It is a Bird ``` 我們可能會得到此輸出。 ## PHP `__toString`方法 當我們在對象實例中使用`print`或`echo`關鍵字時,將調用`__toString()`特殊方法。 我們將在下面的示例中對此進行演示。 `tostring.php` ```php <?php class Cat { public $name; public $age; function __construct($name, $age) { $this->age = $age; $this->name = $name; } function __toString() { return "Cat: $this->name, Age: $this->age \n"; } } $missy = new Cat("Missy", 6); $lucky = new Cat("Lucky", 4); print $missy; echo $lucky; ``` 我們有一個`Cat`類,其中定義了`__toString()`特殊方法。 ```php function __toString() { return "Cat: $this->name, Age: $this->age \n"; } ``` 該方法顯示有關對象的基本信息。 ```php $missy = new Cat("Missy", 6); $lucky = new Cat("Lucky", 4); ``` 我們創建`Cat`類的兩個對象。 ```php print $missy; echo $lucky; ``` 我們在它們上使用`print`或`echo`關鍵字。 ```php $ php tostring.php Cat: Missy, Age: 6 Cat: Lucky, Age: 4 ``` 這是我們運行腳本時得到的。 ## PHP 繼承 繼承是使用已經定義的類形成新類的方法。 新形成的類稱為派生的類,我們派生的類稱為基類。 繼承的重要好處是代碼重用和降低程序的復雜性。 派生類(后代)將覆蓋或擴展基類(祖先)的功能。 `derived.php` ```php <?php class Base { function __construct() { echo "Construction of Base class \n"; } } class Derived extends Base { function __construct() { parent::__construct(); echo "Construction of Derived class \n"; } } $obj1 = new Base(); $obj2 = new Derived(); ``` 在此 PHP 腳本中,我們有兩個類:`Base`類和`Derived`類。 `Derived`類繼承自`Base`類。 ```php class Derived extends Base { ``` 在 PHP 中,我們使用`extends`關鍵字創建繼承關系。 ```php function __construct() { parent::__construct(); echo "Construction of Derived class \n"; } ``` 在`Derived`類的構造器中,我們稱為父構造器。 我們使用`parent`關鍵字,后接兩個冒號和`__construct()`方法。 父類的構造器必須顯式調用。 ```php $obj1 = new Base(); $obj2 = new Derived(); ``` 我們實例化了`Base`和`Derived`類。 ```php $ php derived.php Construction of Base class Construction of Base class Construction of Derived class ``` 這是 PHP 腳本的輸出。 接下來是一個更復雜的示例。 `inheritance.php` ```php <?php abstract class Being { protected $isAlive = true; public function isAlive() { if ($this->isAlive) { echo "Being is alive\n"; } else { echo "Being is not alive\n"; } } public function kill() { $this->isAlive = false; } } abstract class Animal extends Being { protected $age; public function __construct($age) { $this->age = $age; } protected function setAge($age) { $this->age = $age; } public function getAge() { return $this->age; } } class Cat extends Animal { private $name; public function __construct($name, $age) { $this->name = $name; parent::__construct($age); } public function getName() { return $this->name; } } $cat = new Cat("Cici", 4); $cat->isAlive(); echo $cat->getName() . " is " . $cat->getAge() . " years old\n"; $cat->kill(); $cat->isAlive(); ``` 我們在這里使用了幾個新概念。 在代碼示例中,我們有三個類:`Being`,`Animal`和`Cat`。 `Animal`類繼承自`Being`類。 `Cat`類繼承自`Animal`類。 類繼承未聲明為私有的方法和數據成員。 ```php abstract class Being { ``` `Being`類聲明為`abstract`。 `abstract`關鍵字禁止類的實例化。 創建類`Being`的實例沒有多大意義。 ```php protected $isAlive = true; ``` 聲明`$isAlive`數據成員為`protected`。 此類成員只能由定義它們的類及其子孫訪問。 ```php abstract class Animal extends Being { ``` `Animal`類也被聲明為抽象的。 它繼承自`Being`類。 為此,我們使用`extends`關鍵字。 `Animal`是后代。 它繼承了`Being`基類的方法和變量。 ```php class Cat extends Animal { ``` `Cat`類繼承自`Animal`類。 它繼承自`Animal`類,也間接繼承自`Being`類。 它沒有聲明為抽象,這意味著我們可以實例化它。 ```php parent::__construct($age); ``` 在`Cat`類的構造器中,我們使用`parent`關鍵字,后跟兩個冒號和`__construct()`方法來調用父構造器。 父類的構造器必須顯式調用。 ```php $cat = new Cat("Cici", 4); $cat->isAlive(); echo $cat->getName() . " is " . $cat->getAge() . " years old\n"; $cat->kill(); $cat->isAlive(); ``` 我們創建了 4 歲的新貓:Cici。 然后,我們在 cici 對象上調用函數。 請注意,不是在`Cat`類中創建而是從父類繼承的方法的用法。 ```php $ php inheritance.php Being is alive Cici is 4 years old Being is not alive ``` 腳本的輸出。 ## PHP 抽象類和方法 PHP 5 引入了抽象類和方法。 抽象類無法實例化。 如果一個類至少包含一個抽象方法,則也必須將其聲明為抽象方法。 抽象方法無法實現,它們僅聲明方法的簽名。 當我們從抽象類繼承時,所有抽象方法都必須由派生類實現。 此外,必須以相同或較少受限制的可見性聲明這些方法。 與接口不同,抽象類可能具有完全實現的方法,也可能具有定義的成員字段。 因此,抽象類可以提供部分實現。 程序員經常將一些通用功能放入抽象類中。 這些抽象類隨后會被子類化以提供更具體的實現。 例如,Qt 圖形庫具有`QAbstractButton`,它是按鈕小部件的抽象基類,提供按鈕所共有的功能。 按鈕`Q3Button`,`QCheckBox`,`QPushButton`,`QRadioButton`和`QToolButton`都從此基本抽象類繼承。 正式地說,抽象類用于強制執行協議。 協議是所有實現對象都必須支持的一組操作。 `abstract.php` ```php <?php abstract class Drawing { protected $x = 0; protected $y = 0; public abstract function area(); public function getCoordinates() { echo "\$x is $this->x\n"; echo "\$y is $this->y\n"; } } class Circle extends Drawing { private $radius; public function __construct($x, $y, $r) { $this->radius = $r; $this->x = $x; $this->y = $y; } public function area() { return $this->radius * $this->radius * pi(); } public function __toString() { return "Circle, at x: $this->x, y: $this->y, radius: $this->radius"; } } $o = new Circle(12, 45, 22); echo "$o \n"; echo "Area of the circle: " . $o->area() . "\n"; echo $o->getCoordinates(); ``` 在我們的 PHP 腳本中,我們有一個抽象基`Drawing`類。 該類定義兩個成員字段,定義一個方法并聲明一個方法。 一種方法是抽象的,另一種是完全實現的。 `Drawing`類是抽象的,因為我們無法繪制它。 我們可以畫一個圓,一個點或一個正方形。 `Drawing`類對我們可以繪制的對象具有一些通用功能。 ```php class Circle extends Drawing { ``` `Circle`是`Drawing`類的子類。 它必須實現抽象區域方法。 ```php $ php abstract.php Circle, at x: 12, y: 45, radius: 22 Area of the circle: 1520.53084434 $x is 12 $y is 45 ``` Output of the script. ## PHP 接口 遙控器是觀眾和電視之間的接口。 它是此電子設備的接口。 外交禮儀指導外交領域的所有活動。 道路規則是駕車者,騎自行車者和行人必須遵守的規則。 編程中的接口類似于前面的示例。 接口是: * API * 合約 對象通過其公開的方法與外界交互。 實際的實現對程序員而言并不重要,或者也可能是秘密的。 公司可能會出售圖書館,但它不想透露實際的實現情況。 程序員可能會在 GUI 工具箱的窗口上調用`maximize()`方法,但對如何實現此方法一無所知。 從這個角度來看,接口是對象與外界交互而不暴露其內部工作過多的方法。 從第二個角度來看,接口就是契約。 如果達成協議,則必須遵循。 它們用于設計應用的架構,并有助于組織代碼。 接口是完全抽象的類型。 它們使用`interface`關鍵字聲明。 接口只能具有方法簽名和常量。 接口中聲明的所有方法簽名必須是公共的。 他們不能具有完全實現的方法,也不能具有成員字段。 一個 PHP 類可以實現任何數量的接口。 一個接口還可以擴展任何數量的接口。 實現接口的類必須實現接口的所有方法簽名。 接口用于模擬多重繼承。 一個 PHP 類只能擴展一個類。 一個 PHP 類可以實現多個接口。 使用接口的多重繼承與繼承方法和變量無關。 它是關于繼承想法或合同的,這些想法或合同由接口描述。 接口和抽象類之間有一個重要的區別。 抽象類為繼承層次結構中相關的類提供部分實現。 另一方面,可以通過彼此不相關的類來實現接口。 例如,我們有兩個按鈕:經典按鈕和圓形按鈕。 兩者都繼承自抽象按鈕類,該類為所有按鈕提供了一些通用功能。 實現類是相關的,因為它們都是按鈕。 另一個示例可能具有類`Database`和`SignIn`。 它們彼此無關。 我們可以應用`ILoggable`接口,該接口將迫使他們創建執行日志記錄的方法。 `simpleinterface.php` ```php <?php interface IInfo { public function do_inform(); } class Some implements IInfo { public function do_inform() { echo "This is a Some class\n"; } } $sm = new Some(); $sm->do_inform(); ``` 這是演示接口的簡單 PHP 腳本。 ```php interface IInfo { public function do_inform(); } ``` 這是接口`IInfo`。 它具有`do_inform()`方法簽名。 ```php class Some implements IInfo { ``` 我們使用`implements`從接口實現。 ```php public function do_inform() { echo "This is a Some class\n"; } ``` 該類提供了`do_inform()`方法的實現。 下一個示例顯示了一個類如何實現多個接口。 `interface.php` ```php <?php interface Device { public function switch_on(); public function switch_off(); } interface Volume { public function volume_up(); public function volume_down(); } interface Pluggable { public function plug_in(); public function plug_off(); } class CellPhone implements Device, Volume, Pluggable { public function switch_on() { echo "Switching on\n"; } public function switch_off() { echo "Switching off\n"; } public function volume_up() { echo "Volume up\n"; } public function volume_down() { echo "Volume down\n"; } public function plug_in() { echo "Plugging in\n"; } public function plug_off() { echo "Plugging off\n"; } } $o = new CellPhone(); $o->switch_on(); $o->volume_up(); $o->plug_in(); ``` 我們有一個`CellPhone`類,它從三個接口繼承。 ```php class CellPhone implements Device, Volume, Pluggable { ``` 該類實現所有三個接口,并用逗號分隔。 `CellPhone`類必須實現來自所有三個接口的所有方法簽名。 ```php $ php interface.php Switching on Volume up Plugging in ``` 運行 PHP 腳本。 下一個示例顯示接口如何從多個其他接口擴展。 `extendinginterfaces.php` ```php <?php interface IInfo { public function do_inform(); } interface IVersion { public function get_version(); } interface ILog extends IInfo, IVersion { public function do_log(); } class DBConnect implements ILog { public function do_inform() { echo "This is a DBConnect class\n"; } public function get_version() { echo "Version 1.02\n"; } public function do_log() { echo "Logging\n"; } public function connect() { echo "Connecting to the database\n"; } } $db = new DBConnect(); $db->do_inform(); $db->get_version(); $db->do_log(); $db->connect(); ``` 在此 PHP 腳本中,我們定義了三個接口。 擴展接口使我們可以組織它們。 ```php interface ILog extends IInfo, IVersion { public function do_log(); } ``` `ILog`接口擴展了其他兩個接口。 ```php public function do_inform() { echo "This is a DBConnect class\n"; } ``` `DBConnect`類實現`do_inform()`方法。 該方法由該類實現的`ILog`接口繼承。 ## PHP 多態 多態是以不同方式將運算符或函數用于不同數據輸入的過程。 實際上,多態意味著如果類 B 從類 A 繼承,那么它不必繼承關于類 A 的所有內容。 它可以完成 A 類所做的某些事情。 通常,多態是以不同形式出現的能力。 從技術上講,它是重新定義派生類的方法的能力。 多態與將特定實現應用于接口或更通用的基類有關。 `polymorphism.php` ```php <?php abstract class Shape { private $x = 0; private $y = 0; public abstract function area(); } class Rectangle extends Shape { function __construct($x, $y) { $this->x = $x; $this->y = $y; } function area() { return $this->x * $this->y; } } class Square extends Shape { function __construct($x) { $this->x = $x; } function area() { return $this->x * $this->x; } } $shapes = [ new Square(5), new Rectangle(12, 4), new Square(8) ]; foreach ($shapes as $shape) { echo $shape->area() . "\n"; } ``` 在上面的 PHP 腳本中,我們有一個抽象的`Shape`類。 此類演變為兩個后代類別:`Rectangle`和`Square`。 兩者都提供了自己的`area()`方法實現。 多態為 OOP 系統帶來了靈活性和可伸縮性。 這是 PHP 中 OOP 描述的第一部分。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看