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

搜索
博主信息
博文 29
粉絲 0
評(píng)論 0
訪問量 18982
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
1. 類的靜態(tài)成員、類引用self:: 2. 接口、抽象類、trait 3. 后期靜態(tài)綁定 static:: 4.USE在命名空間中的使用
尹輝
原創(chuàng)
515人瀏覽過

4.8.10 類的靜態(tài)成員、類常量

靜態(tài)成員、類常量是屬于類本身,不需要實(shí)例化就可以被訪問到,直接使用類名訪問,減少實(shí)例化對象所占內(nèi)存。

  1. static 標(biāo)識(shí)靜態(tài)成員(默認(rèn)為 public,可以不寫)

  2. const 類常量(不能用 define ),通常在類內(nèi)部使用,不建議在類外部使用

  3. 在類內(nèi)部,使用 self::訪問靜態(tài)成員(需要加$)、類常量(不需要加$),(不能使用 $this)

  4. __callStatic 當(dāng)調(diào)用不存在或者沒有權(quán)限訪問的靜態(tài)方法時(shí),此魔術(shù)方法會(huì)被調(diào)用

  5. :: 范圍解析符 self::用于類常量 靜態(tài)成員的訪問

  6. 類外部訪問:className::靜態(tài)成員(需要加$),className::類常量(不需要加$)
  1. class Teacher
  2. {
  3. // 類常量
  4. public const CATES = ['前端', '后端', '全棧'];
  5. // 靜態(tài)屬性
  6. public static $uname;
  7. private static $salary;
  8. // 不加訪問控制,默認(rèn)為 public
  9. static $siteName = 'php中文網(wǎng)';
  10. static $count = 0;
  11. // 構(gòu)造方法,創(chuàng)建對象時(shí)初始化屬性
  12. public function __construct($uname, $salary)
  13. {
  14. //靜態(tài)成員與類的實(shí)例無關(guān) 不能使用$this來訪問 使用self::訪問靜態(tài)成員 類常量
  15. self::$salary = $salary;
  16. self::$uname = $uname;
  17. self::$count++;
  18. }
  19. static function getBK()
  20. {
  21. // 非靜態(tài)成員是對象級(jí)別的存在,靜態(tài)成員是類級(jí)別的存在,隨著類的加載而加載,優(yōu)先于對象存在的,在靜態(tài)方法中無法訪問非靜態(tài)成員(此時(shí)還不存在對象)
  22. return self::$uname . '來自' . self::$siteName . '可以勝任' . join(',', self::CATES) . '的相關(guān)課程';
  23. }
  24. }
  25. $mj = new Teacher('滅絕師妹', 2000);
  26. echo Teacher::$uname; // 滅絕師妹
  27. // 可以使用對象來訪問,但不建議
  28. echo $mj::$uname; // 滅絕師妹
  29. $mj1 = new Teacher('滅絕老師', 5000);
  30. // 實(shí)例化對象會(huì)改變靜態(tài)屬性的值,值為最后一次實(shí)例化的值,也會(huì)改變之前實(shí)例化的對象
  31. echo Teacher::$uname; // 滅絕老師
  32. echo $mj::$uname; // 滅絕老師
  33. //類常量不建議在類外訪問
  34. print_r(Teacher::CATES); // Array ( [0] => 前端 [1] => 后端 [2] => 全棧 )
  35. // 訪問靜態(tài)方法
  36. echo Teacher::getBK(); // 滅絕老師來自php中文網(wǎng)可以勝任前端,后端,全棧的相關(guān)課程
  37. // 訪問次數(shù)
  38. echo Teacher::$count; // 2

4.8.11 接口、抽象類、trait

4.8.11.1 接口、抽象類

  • 接口(interface)是定義,類(class)是實(shí)現(xiàn)。

    • 接口(interface):定義方法(只有聲明,沒有實(shí)現(xiàn)),不能被實(shí)例化
    • 抽象類(abstract):繼承接口(interface),重寫并實(shí)現(xiàn)部分方法,不能被實(shí)例化,可以繼承多個(gè)接口
    • 類(class):繼承抽象類,實(shí)現(xiàn)全部方法,可以實(shí)例化,只能繼承一個(gè)父類(抽象類)
  1. // 接口(interface)
  2. interface iDemo
  3. {
  4. // 所有成員必須是公開的(public)
  5. public const gender = 'MALE';
  6. // 接口(interface)所有方法都是抽象方法 只有聲明 沒有實(shí)現(xiàn)
  7. public function sum($a, $b);
  8. public function sub($a, $b);
  9. public function mul($a, $b);
  10. public function div($a, $b);
  11. }
  12. interface test
  13. {
  14. public const T = 20;
  15. }
  16. // 抽象類(abstract):
  17. // 抽象類 可以存在 抽象方法和工作方法 不能被實(shí)例化
  18. // 抽象類可以繼承多個(gè)接口
  19. // 實(shí)現(xiàn)部分方法,剩余方法由類(class)完成
  20. abstract class aDemo implements iDemo, test
  21. {
  22. // 重寫接口 iDemo 中的 sum 方法
  23. public function sum($a, $b)
  24. {
  25. return $a + $b;
  26. }
  27. // 重寫接口 iDemo 中的 sub 方法
  28. public function sub($a, $b)
  29. {
  30. return $a - $b;
  31. }
  32. }
  33. // 類只能繼承一個(gè)父類(抽象類)
  34. // 類(class):實(shí)現(xiàn)全部方法,可以實(shí)例化
  35. class Work extends aDemo
  36. {
  37. // 重寫接口 iDemo 中的 mul 方法
  38. public function mul($a, $b)
  39. {
  40. // 調(diào)用接口 test 中的常量 T
  41. echo self::T;
  42. return $a * $b;
  43. }
  44. // 重寫接口 iDemo 中的 div 方法
  45. public function div($a, $b)
  46. {
  47. return $a / $b;
  48. }
  49. }
  50. $obj = new Work;
  51. $obj->mul(5,6); // 20 ( echo self::T; )
  52. echo $obj->sum(10, 20); // 30

4.8.11.2 trait

  • trait是基于類的語法,但是和接口一樣,不能被實(shí)例化 ,是對類功能的橫向擴(kuò)展。

  • php oop 默認(rèn)是單繼承 只能繼承一個(gè)父類->高耦合

  • 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,多態(tài)
  • trait 功能組合式地實(shí)現(xiàn)多繼承
  1. // 接上例的接口和抽象類
  2. // 定義 trait,擴(kuò)展類的功能
  3. // 斷點(diǎn)打印 t1
  4. trait t1
  5. {
  6. public function dd($data)
  7. {
  8. var_dump($data);
  9. die;
  10. }
  11. }
  12. // 擴(kuò)展 sum() 功能
  13. trait t2
  14. {
  15. public function sum($a, $b, ...$args)
  16. {
  17. return $a + $b + array_sum($args);
  18. }
  19. }
  20. class Work extends aDemo
  21. {
  22. // 同名方法優(yōu)先級(jí) 類同名方法(重寫)>trait>繼承成員方法
  23. //trait 功能組合式地實(shí)現(xiàn)多繼承
  24. use t1, t2;
  25. // 重寫接口 iDemo 中的 mul 方法
  26. public function mul($a, $b)
  27. {
  28. // 調(diào)用接口 test 中的常量 T
  29. echo self::T;
  30. return $a * $b;
  31. }
  32. // 重寫接口 iDemo 中的 div 方法
  33. public function div($a, $b)
  34. {
  35. return $a / $b;
  36. }
  37. // 類同名方法(重寫),優(yōu)先級(jí)最大
  38. // public function sum($a, $b)
  39. // {
  40. // return 'hello';
  41. // }
  42. }
  43. echo $obj->sum(10, 20, 30, 40, 200); // 300 (trait t2)
  44. $obj->dd('你好'); // 你好(trait t1)

4.8.12 后期靜態(tài)綁定

self:: 對當(dāng)前類的靜態(tài)引用是由限制的,self::取決于定義當(dāng)前方法所在的類, 定義類與調(diào)用類(實(shí)例化的對象)不能動(dòng)態(tài)綁定

  1. class Car
  2. {
  3. // 私有靜態(tài)方法 getName()
  4. private static function getName(): string
  5. {
  6. return 'car';
  7. }
  8. public static function run()
  9. {
  10. // self:: 指向當(dāng)前類,實(shí)例化的對象中依然指向當(dāng)前類 Car
  11. return self::getName();
  12. }
  13. }
  14. class Benz extends Car
  15. {
  16. // 重寫父類的靜態(tài)方法 getName()
  17. public static function getName()
  18. {
  19. return 'E300';
  20. }
  21. }
  22. echo Car::run(); // car
  23. // 調(diào)用類中 self::還是指向父類 Car,而不是指向調(diào)用類 Benz
  24. echo Benz::run(); // car

使用后期靜態(tài)綁定 static::,不再被解析為定義當(dāng)前方法所在的類,而是在調(diào)用類。

  1. class Car
  2. {
  3. private static function getName(): string
  4. {
  5. return 'car';
  6. }
  7. public static function run()
  8. {
  9. // self:: 改為 static::
  10. return static::getName();
  11. }
  12. }
  13. class Benz extends Car
  14. {
  15. public static function getName()
  16. {
  17. return 'E300';
  18. }
  19. }
  20. echo Car::run(); // car
  21. // 后期靜態(tài)綁定 static::,不再指向父類 Car,而是指向調(diào)用類 Benz
  22. echo Benz::run(); // E300

4.8.13 命名空間

  • 全局成員: 常量、命名函數(shù)、類(接口),不受作用域限制,重名的話會(huì)沖突

  • 命名空間:可以解決全局成員命名沖突的問題

    1. namespace ns1;
    2. class test
    3. {
    4. public static function show()
    5. {
    6. // __FUNCTION__ 只是返回方法(或者函數(shù))的名字
    7. // __METHOD__ 返回類名和方法的名字(包括命名空間,如有)
    8. return __METHOD__;
    9. }
    10. }
    11. namespace ns2;
    12. class test
    13. {
    14. public static function show()
    15. {
    16. return __METHOD__;
    17. }
    18. }
    19. // 當(dāng)前在命名空間 ns2,可以直接調(diào)用本空間下的類
    20. echo test::show(); // ns2\test::show
    21. // call_user_func() 回調(diào),是異步,脫離了當(dāng)前線程,不能直接調(diào)用,需要加上命名空間
    22. echo call_user_func(['test', 'show']); // 報(bào)錯(cuò)找不到test類
    23. echo call_user_func(['ns2\test', 'show']); // ns2\test::show
    24. // 從非全局命名空間(當(dāng)前為 ns2)訪問別的空間中的類 先回到root: \
    25. // 注意:這里的反斜杠(\)是空間分隔符,不是目錄分隔符
    26. echo \ns1\test::show(); // ns1\test::show
  • 命名空間下的函數(shù),優(yōu)先級(jí)高于系統(tǒng)同名函數(shù) (系統(tǒng)函數(shù)默認(rèn)在全局命名空間)

    1. namespace demo;
    2. function var_dump($data)
    3. {
    4. echo 'var_dump' . $data;
    5. }
    6. var_dump('你好'); // var_dump你好

4.8.14 use 在命名空間中的使用

目錄結(jié)構(gòu):

  • tp6
    • app
      • controller
        • Index.php
        • Login.php
    • autoload.php
    • index.php

app\controller 下面的兩個(gè)類(命名空間設(shè)置為類所在的目錄)

  • Index.php

    1. namespace app\controller;
    2. class Index
    3. {
    4. static function index()
    5. {
    6. return __METHOD__ . "<br />";
    7. }
    8. }
  • Login.php

    1. namespace app\controller;
    2. class Login
    3. {
    4. static function index()
    5. {
    6. return __METHOD__ . "<br />";
    7. }
    8. }

autoload.php:類的自動(dòng)加載器

  1. spl_autoload_register(function ($className) {
  2. // 自動(dòng)加載器引入的類名 $className 是帶有命名空間的(app\controller\Index)
  3. // 命名空間名稱與目錄樹對應(yīng),可以參與類文件所在位置的拼接
  4. // 命名空間的反斜杠(\)是空間分隔符,不是目錄分隔符,需要轉(zhuǎn)換為目錄分割符
  5. // "\\":第一個(gè) \ 是轉(zhuǎn)義符,第二個(gè) \ 是空間分隔符
  6. $file = str_replace("\\", DIRECTORY_SEPARATOR, $className) . '.php';
  7. if (is_file($file) && file_exists($file)) require $file;
  8. });

index.php:入口文件,使用 use 引入其他命名空間中的類

  1. // 入口文件
  2. // 注意:入口文件不能放在類所在的目錄,否則無法引入
  3. require __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';
  4. // 1. 直接調(diào)用其他命名空間中的類,需加上命名空間
  5. // 無需 use app\controller;
  6. // 當(dāng)前為全局命名空間,無需加 root:\
  7. echo app\controller\Index::index(); // app\controller\Index::index
  8. // 如果需要給命名空間起別名,則需要 use as
  9. use app\controller as ac;
  10. echo ac\login::index(); // app\controller\Login::index
  11. // 2. use 引入其他命名空間中的類,然后可以直接調(diào)用改類
  12. use app\controller\Index;
  13. use app\controller\Login;
  14. echo Index::index(); // app\controller\Index::index
  15. echo Login::index(); // app\controller\Login::index
  16. // 給引入的類起別名: use as
  17. // 不起別名,默認(rèn)為Index
  18. use app\controller\Index as in;
  19. echo in::index(); // app\controller\Index::index
批改老師:PHPzPHPz

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

老師批語:
本博文版權(quán)歸博主所有,轉(zhuǎn)載請注明地址!如有侵權(quán)、違法,請聯(lián)系admin@php.cn舉報(bào)處理!
全部評(píng)論 文明上網(wǎng)理性發(fā)言,請遵守新聞評(píng)論服務(wù)協(xié)議
0條評(píng)論
作者最新博文
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(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é)