亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
博主信息
博文 29
粉絲 0
評(píng)論 0
訪問(wèn)量 18906
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
OOP 面向?qū)ο缶幊蹋?):1,類(lèi)與對(duì)象、oop封裝性、構(gòu)造器 2,屬性重載與方法重載 3,類(lèi)的繼承與功能擴(kuò)展 4,類(lèi)的原生自動(dòng)加載
尹輝
原創(chuàng)
734人瀏覽過(guò)

4.8 OOP 面向?qū)ο缶幊?/h2>

面向?qū)ο缶褪前焉钪幸鉀Q的問(wèn)題都用對(duì)象的方式進(jìn)行存儲(chǔ):把所有的數(shù)據(jù)用屬性、方法表現(xiàn)出來(lái)。對(duì)象之間的互動(dòng)是通過(guò)方法的調(diào)用完成互動(dòng)。

4.8.1 類(lèi) class

  • 物以類(lèi)聚,把具有相似特性的對(duì)象對(duì)壘到一個(gè)類(lèi)中,類(lèi)定義了這些相似對(duì)象擁有的相同的屬性和方法
  • 類(lèi)是相似對(duì)象的描述,成為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或者原型
  • 類(lèi)的定義以關(guān)鍵字class開(kāi)始,后面跟著這個(gè)類(lèi)的名稱(chēng)。類(lèi)的命名通常每個(gè)單詞的第一個(gè)字母大寫(xiě),以中括號(hào)開(kāi)始和結(jié)束
  • 類(lèi)的屬性和方法統(tǒng)稱(chēng)為類(lèi)成員
  1. class User
  2. {
  3. // 成員屬性
  4. public $name;
  5. private $salary;
  6. protected $age;
  7. public function __construct($salary, $age)
  8. {
  9. // $this代表本對(duì)象
  10. $this->salary = $salary;
  11. $this->age = $age;
  12. }
  13. // 成員方法
  14. public function salary()
  15. {
  16. return $this->salary;
  17. }
  18. }

4.8.2 對(duì)象 object

  • 類(lèi)的實(shí)例化:通過(guò)類(lèi)定義創(chuàng)建一個(gè)類(lèi)的對(duì)象
  • 對(duì)象:一個(gè)類(lèi)的實(shí)例(Instance)

  • 類(lèi)的實(shí)例化為對(duì)象時(shí)使用關(guān)鍵字new,new之后緊跟類(lèi)的名稱(chēng)和一對(duì)圓括號(hào)

  • 類(lèi)的定義屬性值都是空或默認(rèn)值,而對(duì)象的屬性都有具體的值
  • 對(duì)象中得成員屬性和方法可以通過(guò) -> 符號(hào)來(lái)訪問(wèn)
  1. $name = '滅絕';
  2. $salary = 20000;
  3. $age = 18;
  4. // new 實(shí)例化 得到對(duì)象引用
  5. $mj = new User($salary, $age);
  6. // 訪問(wèn)對(duì)象的屬性和方法
  7. $mj->name = $name;
  8. echo $mj->name; // 滅絕
  9. echo $mj->salary(); // 20000

4.8.3 對(duì)象的組成

  • 屬性:用來(lái)描述對(duì)象的特定的值(組成元素),是對(duì)象的數(shù)據(jù)模型,用于描述對(duì)象的數(shù)據(jù),也成為對(duì)象的成員變量。
  • 方法:定義對(duì)象的行為,是對(duì)象的行為模型,用于描述對(duì)象能夠做什么事情,稱(chēng)為對(duì)象的成員方法

4.8.4 對(duì)象的特點(diǎn)

  • 每一個(gè)對(duì)象都是獨(dú)一無(wú)二的
  • 對(duì)象是一個(gè)特定的事物,他的職能是完成特定功能
  • 對(duì)象是可以重復(fù)使用,屬性和方法的復(fù)用。(變量是實(shí)現(xiàn)數(shù)據(jù)的復(fù)用,函數(shù)是實(shí)現(xiàn)了代碼塊的復(fù)用)

4.8.5 訪問(wèn)控制

對(duì)象的屬性和方法有三種訪問(wèn)權(quán)限:

  • public是公有的類(lèi)成員,可以在任何地方被訪問(wèn),可以被類(lèi)以及子類(lèi)或者對(duì)象都可以訪問(wèn)

    1. class User1
    2. {
    3. public $name;
    4. public function sayHello()
    5. {
    6. echo "Hello " . $this->name;
    7. }
    8. }
    9. $mj = new User1();
    10. $mj->name = '滅絕';
    11. echo $mj->name; // 滅絕
    12. echo $mj->sayHello(); //Hello 滅絕

    注意:盡量不要使用公共屬性,因?yàn)橹苯釉L問(wèn)公共屬性不能強(qiáng)制性地檢驗(yàn)數(shù)據(jù)有效性。例如,無(wú)法阻止用戶給 name 這樣賦值:$mj->name = ‘12345’;,解決方法:將屬性設(shè)為私有屬性,然后定義公共方法來(lái)調(diào)用是由屬性。

  • private私有的類(lèi)成員,只能被自身訪問(wèn),不能被子類(lèi)繼承,也不能被對(duì)象訪問(wèn),只能在自身通過(guò)封裝讓外界訪問(wèn)(例如在類(lèi)里面定義一個(gè)公開(kāi)方法來(lái)調(diào)用私有屬性);

    1. class User
    2. {
    3. private $name;
    4. public function setName($name)
    5. {
    6. if ($this->validateName($name)){
    7. $this->name = $name;
    8. } else {
    9. echo "name 格式有誤!";
    10. }
    11. }
    12. public function getName(){
    13. echo $this->name;
    14. }
    15. // 數(shù)據(jù)驗(yàn)證方法,僅對(duì)象內(nèi)部可見(jiàn),外部無(wú)法訪問(wèn)
    16. private function validateName($name){
    17. if ($name == '' || is_numeric($name)){
    18. return false;
    19. } else if (strlen($name) < 2 || strlen($name) > 8){
    20. return false;
    21. } else {
    22. return true;
    23. }
    24. }
    25. }
    26. $mj = new User();
    27. $mj->setName('滅絕');
    28. $mj->getName(); // 滅絕
  • protected 受保護(hù)的類(lèi)成員,與 private 類(lèi)似,區(qū)別是可以被子類(lèi)繼承,可以被其自身以及繼承的子類(lèi)訪問(wèn),但是不能被對(duì)象訪問(wèn),只能通過(guò)封裝的方式讓對(duì)象訪問(wèn)

4.8.6 構(gòu)造方法

構(gòu)造方法可以在對(duì)象實(shí)例化時(shí)自動(dòng)運(yùn)行,作用是:1,創(chuàng)建實(shí)例的初始化狀態(tài);2,可以給私有/受保護(hù)的屬性初始化賦值。

構(gòu)造方法必須是公共方法(public)。

定義構(gòu)造方法關(guān)鍵字:__construct

  1. class User
  2. {
  3. // 成員屬性
  4. public $name;
  5. private $salary;
  6. protected $age;
  7. public function __construct($salary, $age)
  8. {
  9. // $this代表本對(duì)象
  10. $this->salary = $salary;
  11. $this->age = $age;
  12. }
  13. // 成員方法
  14. public function salary()
  15. {
  16. return $this->salary;
  17. }
  18. }
  19. // 實(shí)例化時(shí)自動(dòng)調(diào)用構(gòu)造方法,將傳入的參數(shù)賦值給屬性 $salary, $age
  20. $mj = new User($salary, $age);
  21. // 屬性 $name 沒(méi)有在構(gòu)造方法中賦值,需要手動(dòng)賦值
  22. $mj->name = $name;

4.8.7 對(duì)象的繼承

繼承的好處:

  • 父類(lèi)里面定義的類(lèi)成員可以不用在子類(lèi)中重復(fù)定義,節(jié)約了編程的時(shí)間和代價(jià);
  • 同一個(gè)父類(lèi)的子類(lèi)擁有相同的父類(lèi)定義的類(lèi)成員,因此外部代碼調(diào)用他們的時(shí)候可以一視同仁;
  • 子類(lèi)可以修改和調(diào)用父類(lèi)定義的類(lèi)成員我們稱(chēng)為重寫(xiě)(Overwrite), 一旦子類(lèi)修改了,就按照子類(lèi)修改之后的功能執(zhí)行;

子類(lèi):

  • 子類(lèi)可以通過(guò)$this訪問(wèn)父類(lèi)的屬性
  • 子類(lèi)的對(duì)象可以直接調(diào)用父類(lèi)的方法和屬性
  • PHP的單繼承特性:類(lèi)不允許同時(shí)繼承多個(gè)父類(lèi)(extends后面只能跟一個(gè)父類(lèi)名稱(chēng))
  • 子類(lèi)可以擴(kuò)展自己的屬性和方法
  • 通過(guò) extends 關(guān)鍵字實(shí)現(xiàn)類(lèi)的繼承
  1. // 父類(lèi)
  2. class Product
  3. {
  4. public $name;
  5. protected $price;
  6. protected $num;
  7. public function __construct($name, $price, $num)
  8. {
  9. $this->name = $name;
  10. $this->price = $price;
  11. $this->num = $num;
  12. }
  13. // 普通方法
  14. public function show()
  15. {
  16. // 特殊的對(duì)象引用 完成對(duì)象成員間的互相訪問(wèn)
  17. // 注意:界定符結(jié)尾標(biāo)記必須頂行寫(xiě),前面不能有任何輸出,否則出錯(cuò)!
  18. // 界定符結(jié)尾標(biāo)記后面也不能有注釋
  19. return <<<SHOW
  20. 1. 品名:$this->name
  21. 2. 價(jià)格:$this->price
  22. 3. 數(shù)量:$this->num
  23. SHOW;
  24. }
  25. }
  26. // 子類(lèi)
  27. class Son extends Product
  28. {
  29. // 擴(kuò)展
  30. public $brand;
  31. // overwrite 重寫(xiě)
  32. public function __construct($name, $price, $num, $brand)
  33. {
  34. // parent:: 調(diào)用父類(lèi)成員
  35. parent::__construct($name, $price, $num);
  36. $this->brand = $brand;
  37. }
  38. // 重寫(xiě)show方法
  39. public function show()
  40. {
  41. return <<<SHOW
  42. 1. 品名:$this->name
  43. 2. 價(jià)格:$this->price
  44. 3. 數(shù)量:$this->num
  45. 4. 品牌:$this->brand
  46. SHOW;
  47. }
  48. // 功能擴(kuò)展
  49. public function total()
  50. {
  51. return "$this->name,數(shù)量為{$this->num},總計(jì)" . ($this->price * $this->num) . '元';
  52. }
  53. }
  54. // 子類(lèi)實(shí)例化及調(diào)用成員
  55. $son1 = new Son('四件套', 289, 400, '法系');
  56. echo $son1->brand; // 法系
  57. echo $son1->show(); // 1. 品名:四件套 2. 價(jià)格:289 3. 數(shù)量:400 4. 品牌:法系
  58. echo $son1->total(); // 四件套,數(shù)量為400,總計(jì)115600元

4.8.8 屬性重載和方法重載

  • PHP所提供的”重載”(overloading)是指動(dòng)態(tài)地”創(chuàng)建”類(lèi)屬性和方法。我們是通過(guò)魔術(shù)方法(magic methods)來(lái)實(shí)現(xiàn)的。
  • 當(dāng)調(diào)用當(dāng)前環(huán)境下未定義或不可訪問(wèn)的類(lèi)屬性或方法時(shí),重載方法會(huì)被調(diào)用。
  • 所有的重載方法都必須被聲明為 public
  • 注意: PHP中的”重載”與其它絕大多數(shù)面向?qū)ο笳Z(yǔ)言不同。傳統(tǒng)的”重載”是用于提供多個(gè)同名的類(lèi)方法,但各方法的參數(shù)類(lèi)型和個(gè)數(shù)不同。
  1. class View
  2. {
  3. /**
  4. * 模板變量
  5. */
  6. protected $data = [];
  7. // !當(dāng)訪問(wèn)當(dāng)前環(huán)境下未定義或不可訪問(wèn)的類(lèi)屬性時(shí) ,重載方法__get會(huì)被調(diào)用。
  8. public function __get($name)
  9. {
  10. return $this->data[$name];
  11. }
  12. // !當(dāng)給當(dāng)前環(huán)境下未定義或不可訪問(wèn)的類(lèi)屬性賦值時(shí) ,重載方法__set會(huì)被調(diào)用。
  13. public function __set($name, $value)
  14. {
  15. $this->data[$name] = $value;
  16. }
  17. // 自定義的賦值方法優(yōu)先級(jí)大于 __set
  18. public function assign($name, $value = null)
  19. {
  20. if (is_array($name)) {
  21. // array_merge() 將一個(gè)或多個(gè)數(shù)組中的值附加在前一個(gè)數(shù)組的后面。返回作為結(jié)果的數(shù)組
  22. $this->data = array_merge($this->data, $name);
  23. } else {
  24. $this->data[$name] = $value;
  25. }
  26. return $this;
  27. }
  28. // !當(dāng)訪問(wèn)當(dāng)前環(huán)境下未定義或不可訪問(wèn)的類(lèi)普通方法時(shí) ,重載方法__call會(huì)被調(diào)用。
  29. public function __call($name, $args)
  30. {
  31. if ($name == 'show') {
  32. var_dump($this->data);
  33. } else if ($name == 'sum') {
  34. return array_sum($args);
  35. } else {
  36. echo '沒(méi)有這個(gè)方法';
  37. }
  38. }
  39. }
  40. $v = new View;
  41. // 調(diào)用 __set 方法,給未定義屬性賦值
  42. $v->username = 'peter';
  43. // 調(diào)用 __get 方法,訪問(wèn)未定義屬性
  44. echo $v->username; // peter
  45. // 自定義的賦值方法優(yōu)先級(jí)大于 __set
  46. $v->assign('username', 'admin');
  47. echo $v->username; // admin
  48. // 調(diào)用 __call 方法,訪問(wèn)未定義方法
  49. $v->hello(); // 沒(méi)有這個(gè)方法
  50. // show()、sum() 方法不可以直接訪問(wèn),通過(guò) __call 方法訪問(wèn)
  51. $v->show(); // array(1) { ["username"]=> string(5) "admin" }
  52. echo $v->sum(10, 20, 60); // 90
  53. // 通過(guò)回調(diào)方法訪問(wèn) __call 方法
  54. echo call_user_func([$v, 'sum'], 10, 20, 40); // 70
  55. echo call_user_func_array([$v, 'sum'], [10, 20, 80]); // 110

4.8.9 類(lèi)的自動(dòng)加載器

定義類(lèi)加載器文件 autoload.php

  1. // autoload.php
  2. spl_autoload_register(function ($className) {
  3. $classFile = __DIR__ . DS . 'class' . DS . $className . '.php';
  4. if (is_file($classFile) && file_exists($classFile)) require $classFile;
  5. });

在頁(yè)面引入加載器,不用一個(gè)一個(gè) require 所需的 class 文件

  1. const DS = DIRECTORY_SEPARATOR;
  2. require __DIR__ . DS . 'autoload.php';
  3. // 接下來(lái)用到的類(lèi)都會(huì)自動(dòng)加載
  4. $mj = new User($salary, $age);
  5. $i = new Product('iphone 12 promax', 6000, 12);
  6. $son1 = new Son('四件套', 289, 400, '法系');
批改老師:PHPzPHPz

批改狀態(tài):合格

老師批語(yǔ):
本博文版權(quán)歸博主所有,轉(zhuǎn)載請(qǐng)注明地址!如有侵權(quán)、違法,請(qǐng)聯(lián)系admin@php.cn舉報(bào)處理!
全部評(píng)論 文明上網(wǎng)理性發(fā)言,請(qǐng)遵守新聞評(píng)論服務(wù)協(xié)議
0條評(píng)論
作者最新博文
關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)

  • 登錄PHP中文網(wǎng),和優(yōu)秀的人一起學(xué)習(xí)!
    全站2000+教程免費(fèi)學(xué)