<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # PHP 中的面向對象編程 II > 原文: [https://zetcode.com/lang/php/oopii/](https://zetcode.com/lang/php/oopii/) 在 PHP 教程的這一章中,我們將繼續描述 PHP 中的 OOP。 ## PHP `static`關鍵字 我們可以將類屬性和方法聲明為`static`。 `static`屬性和方法不屬于該類的實例。 他們屬于階級本身。 可通過范圍解析運算符`::`訪問它們。 `staticmethod.php` ```php <?php class Sys { public static function println($string) { echo "$string\n"; } } Sys::println("PHP"); Sys::println("PERL"); Sys::println("Python"); Sys::println("Pike"); ``` 在上面的 PHP 腳本中,我們有一個靜態的`println()`方法。 它打印一個字符串并開始新的一行。 此示例受 Java 語言啟發。 ```php Sys::println("PHP"); ``` 我們不需要對象來調用`println()`方法。 我們通過指定類名稱,后跟雙冒號運算符和方法名稱來調用`static`方法。 ```php $ php static1.php PHP PERL Python Pike ``` 這是腳本的輸出。 `staticvariable.php` ```php <?php class Math { public static $PI = 3.14159265359; } echo Math::$PI . "\n"; ``` 現在,我們有一個帶有`static`變量的示例。 ```php echo Math::$PI . "\n"; ``` 我們通過指定類名,范圍解析運算符和變量名來訪問變量。 ## PHP `final`關鍵字 最終方法不能被覆蓋,最終類不能被擴展。 `final`關鍵字取決于應用的設計。 某些類不應擴展,某些方法不應重寫。 此行為由`final`關鍵字強制執行。 `finalmethod.php` ```php <?php class Base { final function say() { echo "Base class"; } } class Derived extends Base { function say() { echo "Derived class"; } } ``` 該 PHP 腳本無法編譯。 我們收到一個錯誤“無法覆蓋最終方法`Base::say()`”。 `finalclass.php` ```php <?php final class Math { static function getPI() { return 3.141592; } } class DerivedMath extends Math { function say() { echo "DerivedMath class"; } } ``` 在先前的 PHP 腳本中,我們有一個原型基礎`Math`類。 該類的唯一目的是為程序員提供一些有用的方法和常量。 (出于簡單起見,在我們的例子中,我們只有一種方法。)它不是為了擴展而創建的。 為了防止不知情的其他程序員從此類中派生,創建者創建了`final`類。 如果您嘗試運行此 PHP 腳本,則會出現以下錯誤:“致命錯誤:類`DerivedMath`可能不會從最終類(`Math`)繼承”。 ## PHP 深拷貝與淺拷貝 數據復制是編程中的重要任務。 對象是 OOP 中的復合數據類型。 對象中的成員字段可以按值或按引用存儲。 可以以兩種方式執行復制。 淺表副本將所有值和引用復制到新實例中。 引用所指向的數據不會被復制; 僅指針被復制。 新的引用指向原始對象。 對引用成員的任何更改都會影響兩個對象。 深拷貝將所有值復制到新實例中。 如果成員存儲為引用,則深層副本將對正在引用的數據執行深層副本。 創建引用對象的新副本,并存儲指向新創建的對象的指針。 對這些引用對象的任何更改都不會影響該對象的其他副本。 深拷貝是完全復制的對象。 在 PHP 中,我們有一個`copy`關鍵字,默認情況下會執行淺表復制。 它調用對象的`__clone()`方法。 我們可以實現創建自定義深層副本的方法。 在 PHP 中,所有對象都是通過引用分配的。 接下來的兩個示例對對象執行淺復制和深復制。 `shallowcopy.php` ```php <?php class Object { public $id; public $size; public $color; function __construct($id, $size, $color) { $this->id = $id; $this->size = $size; $this->color = $color; } } class Color { public $red; public $green; public $blue; function __construct($red, $green, $blue) { $this->red = $red; $this->green = $green; $this->blue = $blue; } } $color = new Color(23, 42, 223); $object1 = new Object(23, "small", $color); $object2 = clone $object1; $object2->id++; $object2->color->red = 255; $object2->size = "big"; print_r($object1); print_r($object2); ``` 在上面的 PHP 腳本中,我們定義了兩個自定義對象:`Object`和`Color`。 `Object`對象將具有對`Color`對象的引用。 ```php $color = new Color(23, 42, 223); ``` 我們創建`Color`對象的實例。 ```php $object1 = new Object(23, "small", $color); ``` 創建對象對象的實例。 它將`Color`對象的實例傳遞給其構造器。 ```php $object2 = clone $object1; ``` 我們執行`Object`對象的淺表副本。 ```php $object2->id++; $object2->color->red = 255; $object2->size = "big"; ``` 在這里,我們修改克隆對象的成員字段。 我們增加 id,更改顏色對象的紅色部分,并將大小更改為`big`。 ```php print_r($object1); print_r($object2); ``` 我們使用`print_r()`函數比較結果。 ```php $ php shallowcopy.php Object Object ( [id] => 23 [size] => small [color] => Color Object ( [red] => 255 [green] => 42 [blue] => 223 ) ) Object Object ( [id] => 24 [size] => big [color] => Color Object ( [red] => 255 [green] => 42 [blue] => 223 ) ) ``` 我們可以看到 ID 不同:23 與 24。大小不同:`small`與`big`。 但是,這兩個實例的顏色對象的紅色部分相同:255。更改克隆對象的成員值不會影響原始對象。 更改引用對象的成員也影響了原始對象。 換句話說,兩個對象都引用內存中的同一顏色對象。 要更改此行為,我們接下來將做一個深層復制。 `deepcopy.php` ```php <?php class Object { public $id; public $size; public $color; function __construct($id, $size, $color) { $this->id = $id; $this->size = $size; $this->color = $color; } function __clone() { $red = $this->color->red; $green = $this->color->green; $blue = $this->color->blue; $this->color = new Color($red, $green, $blue); } } class Color { public $red; public $green; public $blue; function __construct($red, $green, $blue) { $this->red = $red; $this->green = $green; $this->blue = $blue; } } $color = new Color(23, 42, 223); $object1 = new Object(23, "small", $color); $object2 = clone $object1; $object2->id++; $object2->color->red = 255; $object2->size = "big"; print_r($object1); print_r($object2); ``` 在此 PHP 腳本中,我們實現了`__clone()`方法。 ```php function __clone() { $red = $this->color->red; $green = $this->color->green; $blue = $this->color->blue; $this->color = new Color($red, $green, $blue); } ``` 在`__clone()`方法內部,我們復制紅色,綠色和藍色成員字段并創建一個新的`Color`對象。 現在,`$color`字段指向另一個`Color`對象。 ```php $ php deepcopy.php Object Object ( [id] => 23 [size] => small [color] => Color Object ( [red] => 23 [green] => 42 [blue] => 223 ) ) Object Object ( [id] => 24 [size] => big [color] => Color Object ( [red] => 255 [green] => 42 [blue] => 223 ) ) ``` 現在,引用的`Color`對象的紅色部分不相同。 原始對象保留了其先前的 23 值。 ## PHP 異常 異常是為處理異常的發生而設計的,這些特殊情況會改變程序執行的正常流程。 引發或引發異常并引發異常。 在執行應用期間,許多事情可能出錯。 磁盤可能已滿,我們無法保存文件。 互聯網連接可能斷開,我們的應用嘗試連接到站點。 所有這些都可能導致我們的應用崩潰。 為避免發生這種情況,我們必須應對可能發生的所有可能的錯誤。 為此,我們可以使用異常處理。 從 PHP 5 開始,可以使用異常。大多數 PHP 錯誤仍然使用舊的錯誤報告,而不是異常。 使用`set_error_handler()`,我們可以解決此問題。 `zerodiv.php` ```php <?php set_error_handler("error_handler"); function error_handler($errno, $errstring, $errfile, $line, $trace) { throw new ErrorException($errstring, $errno, 0, $errfile, $line); } try { $a = 0; $b = 32; $c = $b / $a; } catch(ErrorException $e) { echo "Error occurred\n"; echo $e->getMessage(), "\n"; } ``` 在上面的 PHP 腳本中,我們有意將數字除以零。 這會導致錯誤。 該錯誤也不是異常,并且不會被`catch`關鍵字捕獲。 ```php set_error_handler("error_handler"); ``` `set_error_handler()`函數設置用戶定義的錯誤處理器函數。 ```php function error_handler($errno, $errstring, $errfile, $line, $trace) { throw new ErrorException($errstring, $errno, 0, $errfile, $line); } ``` 在`set_error_handler()`函數內部,我們拋出了`ErrorException`。 稍后,此異常由`catch`關鍵字捕獲。 ```php try { $a = 0; $b = 32; $c = $b / $a; } ``` 我們正在檢查錯誤的代碼放在`try`關鍵字之后的塊中。 ```php } catch(Exception $e) { echo $e->getMessage(); } ``` `catch`關鍵字用于捕獲異常。 要了解更多信息,我們在異常對象上調用`getMessage()`方法。 ```php $ php zerodiv.php Error occurred Division by zero ``` 這是我們的 PHP 腳本的輸出。 `Exception`是所有異常的基類。 我們可以創建派生自該基類的異常。 `myexception.php` ```php <?php define("LIMIT", 333); class BigValueException extends Exception { public function __construct($message) { parent::__construct($message); } } $a = 34325; try { if ($a > LIMIT) { throw new BigValueException("Exceeded the maximum value allowed\n"); } } catch (BigValueException $e) { echo $e->getMessage(); } ``` 假設我們處于無法處理大量數字的情況。 ```php define("LIMIT", 333); ``` 大于此常量的數字在我們的 PHP 腳本中被視為`big`。 ```php class BigValueException extends Exception { ``` 我們有一個`BigValueException`類。 此類通過`extends`關鍵字從`Exception`類派生。 ```php public function __construct($message) { parent::__construct($message); } ``` 在構造器內部,我們稱為父級的構造器。 ```php if ($a > LIMIT) { throw new BigValueException("Exceeded the maximum value allowed\n"); } ``` 如果該值大于限制,則拋出自定義異常。 我們給異常消息`"Exceeded the maximum value allowed\n"`。 ```php } catch (BigValueException $e) { echo $e->getMessage(); } ``` 我們捕獲到異常并將其消息打印到控制臺。 ## PHP 構造器重載 PHP 不支持直接的構造器重載。 換句話說,每個類只能定義一個構造器。 許多已經知道 Java 或 C# 語言的程序員都在尋找 PHP 中的類似功能。 我們有兩種方法可以處理此問題。 第一種解決方案基于`func_get_args()`函數。 第二種解決方案使用工廠模式。 `constructors.php` ```php <?php class Book { private $author = "not specified"; private $title = "not specified"; private $year = "not specified"; public function __construct() { $args = func_get_args(); foreach(["title", "author", "year"] as $item) { if(empty($args)) { break; } $this->$item = array_shift($args); } } public function __toString() { return "Author: $this->author\nTitle: $this->title\nPublished: $this->year\n\n"; } } $book1 = new Book("Stephen Prata", "C Primer Plus"); echo $book1; $book2 = new Book("Joshua Bloch", "Effective Java", 2008); echo $book2; ``` 在上面的腳本中,我們有一個`Book`類。 我們使用 2 和 3 參數實例化該類。 ```php private $author = "not specified"; private $title = "not specified"; private $year = "not specified"; ``` 我們定義了三個成員字段。 它們的初始值為`"not specified"`。 ```php $args = func_get_args(); ``` `func_get_args()`函數返回一個包含函數的參數列表的數組。 這樣的想法是:構造器中的代碼是動態的; 它取決于傳遞給它的參數。 ```php foreach(["title", "author", "year"] as $item) { ``` 我們使用`foreach`關鍵字瀏覽所有成員字段。 ```php $this->$item = array_shift($args); ``` 構造器中最基本的任務之一是初始化類的成員字段。 這是通過上面的代碼行完成的。 `array_shift()`函數從數組中刪除第一項并返回它。 ```php $book1 = new Book("Stephen Prata", "C Primer Plus"); ... $book2 = new Book("Joshua Bloch", "Effective Java", 2008); ``` 我們有兩個不同的構造器。 第一個帶有 2 個參數,第二個帶有 3 個參數。 ```php $ php constructors.php Author: C Primer Plus Title: Stephen Prata Published: not specified Author: Effective Java Title: Joshua Bloch Published: 2008 ``` 這是腳本的結果。 下一個代碼示例使用工廠模式模擬構造器重載。 它是 OOP 中的創建模式之一。 該模式創建對象時未指定要創建的對象的確切類。 更一般地,術語工廠方法通常用于指代主要目的是創建對象的任何方法。 `factory.php` ```php <?php class Cat { private $name = "unspecified"; private $age = "unspecified"; public static function withName($name) { $cat = new Cat(); $cat->name = $name; return $cat; } public static function withAge($age) { $cat = new Cat(); $cat->age = $age; return $cat; } public static function fullCat($name, $age) { $cat = new Cat(); $cat->name = $name; $cat->age = $age; return $cat; } public function __toString() { return "Name: $this->name, Age: $this->age\n"; } } $cici = Cat::withName("Cici"); echo $cici; $missy = Cat::withAge(6); echo $missy; $lucky = Cat::fullCat("Lucky", 4); echo $lucky; ``` 上面的 PHP 腳本中有一個`Cat`工廠類。 它具有三種不同的靜態函數。 它們每個都返回一個特定的`Cat`對象。 ```php private $name = "unspecified"; private $age = "unspecified"; ``` 我們有兩個成員字段。 它們的初始值為`"not specified"`。 ```php public static function withName($name) { $cat = new Cat(); $cat->name = $name; return $cat; } ``` 這是靜態的`withName()`函數。 此函數創建`Cat`類的實例。 它設置`name`成員字段并返回對象。 ```php $cici = Cat::withName("Cici"); echo $cici; ``` 我們使用其中一種工廠方法創建貓的實例。 我們回蕩對象。 即調用該類的`__toString()`方法。 ```php $ php factory.php Name: Cici, Age: unspecified Name: unspecified, Age: 6 Name: Lucky, Age: 4 ``` 腳本的輸出。 在 PHP 教程的這一部分中,我們繼續討論 PHP 中的面向對象編程。
                  <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>

                              哎呀哎呀视频在线观看