首頁  >  文章  >  後端開發  >  歸納總結PHP物件基礎

歸納總結PHP物件基礎

WBOY
WBOY轉載
2022-03-09 18:11:595378瀏覽

本篇文章為大家帶來了關於PHP中的相關知識,其中主要介紹了物件導向的相關問題,物件導向程式設計的本質是增加資料和功能的操作主體即對象,希望對大家有幫助。

歸納總結PHP物件基礎

推薦學習:《PHP教程

實作學習php,thinkphp,Redis,vue,uni-app等技術,推薦開源電商系統likeshop,可以藉鏡思路,可去版權免費商用,gitee下載地址:
點擊進項目地址

面向對象:OOP(objected oriented programming)編程

面向過程是一種程式設計思想

物件導向程式設計的本質是增加資料和功能的操作主體,即物件

物件導向中的所有的資料和功能多是由主體(對象)來呼叫和操作

物件導向基礎

面向過程和物件導向區別

歸納總結PHP物件基礎

物件導向關鍵字

類別:class,定義物件導向主體的最外層結構,用來包裹主體的資料和功能(函數)
  • 物件:object,某一類別事務的具體代表,又稱為實例
  • 實例化:new,類別產生物件的過程
  • 類別成員:member
方法:method,本質是在類別class結構中建立的函數,稱之為成員方法或成員函數

屬性:property,本質是在類別class結構中創建的變量,稱為成員變數

類別常數:const,本質是在類別class結構中創建的常數

    建立物件
  • <?phpclass  People{}$man=new People();# 实例化类,man就是对象var_dump($man);?>
        # 输出object(People)#1 (0) { }
        #1表示:对象编号,与类无关,是整个脚本中对象的序号(0)表示:成员变量(属性)个数{}表示:具体成员变量信息(键值对)
  • 類別物件
  • <?phpclass  Buyer{
        # 常量声明
        const BIG_NAME=&#39;BUYER&#39;;
        # 常量不需要加 $
    
        # 属性声明
        # $name;
        # 错误的,类内部属性必须使用访问修饰限定符
        public $name;
        public $money=0;
        
        # 方法声明
        function display(){
            echo __CLASS__;
            # 魔术常量,输出类名
            # 方法内部变量属于局部变量
        }}# 实例化$a = new Buyer();# 属性操作,增删改查echo $a->money;$a->money='20';$a->sex='male';unset($a->name);echo '<br>';# 方法操作$a->display();echo '<br>';var_dump($a);?>
        # 输出0Buyerobject(Buyer)#1 (2) { ["money"]=> string(2) "20" ["sex"]=> string(4) "male" }
  • 注意:類別常數不是由物件進行存取

#存取修飾限定符

在屬性或方法前的修飾關鍵字,用來控制屬性或方法的存取位置歸納總結PHP物件基礎

public:公有,類別內和類別外都可以存取歸納總結PHP物件基礎

protected:受保護,只允許在相關類別內部存取

歸納總結PHP物件基礎private:私有,只允許在定義類別內部存取

屬性必須有存取修飾限定符,方法可以沒有存取修飾限定符,預設就是public
  • 類別內部物件

    $this,方法內部內建的一個對象,會自動指向來呼叫的方法的物件
  • $this 存在於方法內部(僅限內部使用),所以相當於在類別的結構內部

  • 可以存取任意存取修飾限定符修飾的成員
  • #私有成員都是透過公有方法來實現存取(公有方法可以在類別外部存取)

<?phpclass  Article{
    protected $name = &#39;a&#39;;
    private $type = &#39;art&#39;;

    public function get_name()
    {
        var_dump($this);
    }}$a = new Article();var_dump($a);?>
    # 输出object(Article)#1 (2) { ["name:protected"]=> string(1) "a" ["type:private"]=> string(3) "art" }
  • $this 代表的是對象,而$this 所在環境為類別內部的方法內部,所以$ this 物件是在類別內部訪問,因此所有的屬性和方法,不受訪問修飾限定符限制

      1. #建構方法
      2. __construct() 是一種系統內建的魔術方法,該方法的特性是在物件實例化之後,物件立即自動呼叫
    • 建構方法的目的就是為了初始化資源,包括物件屬性和其他資源

    #一旦建構方法定義好後,且建構方法自帶參數,那麼就只能使用new 類別名稱(參數列表) 方式才能正確實例化

    魔術方法也可以透過物件直接調用的方式調用,不過沒有實際用處

    <?phpclass  Article{
        public $name=&#39;xiaoli&#39;;
        private $sex="male";
    
        public function __construct($name,$sex)
        {
            $this->name = $name;
            $this->sex = $sex;
        }}$a = new Article('xiaowang', 'famale');var_dump($a);?>

    析構方法

    __destruct(),物件在被銷毀時自動調用,釋放資源
    • 物件銷毀

      物件無變量指向(變數指向其他資料)
    • 物件被主動銷毀(unset銷毀物件變數)

      腳本執行結束(自動釋放資源)
    • PHP腳本執行結束會釋放所有資源,所以一般較少用析構方法
    <?phpclass  Article{
        protected $name = &#39;xiaoli&#39;;
        private $sex = &#39;famale&#39;;
    
        public function __destruct()
        {
            // TODO: Implement __destruct() method.
            echo __FUNCTION__;
        }}$a=new Article();# 销毁对象$a=1;unset($a);# __destructendecho &#39;end&#39;;?>
        # 不销毁对象,php在运行结束也会释放资源# end__destruct

    物件傳值

    ###定義:將保存物件的變數賦值給另一個變數### ###在PHP 中,物件的傳值是引用傳遞:即一個物件變數賦值給另外一個變量,兩個變數指向同一個物件位址,即只有一個物件###
    <?phpclass  Article{
        public $name = &#39;xiaoli&#39;;
        public $sex = &#39;famale&#39;;}$a=new Article();$b=$a;var_dump($a,$b);echo &#39;<br>';$a->name="wangxiaohu";var_dump($a,$b);echo '<br>';?>
        # 输出object(Article)#1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" } object(Article)
        #1 (2) { ["name"]=> string(6) "xiaoli" ["sex"]=> string(6) "famale" }object(Article)
        #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" } object(Article)
        #1 (2) { ["name"]=> string(10) "wangxiaohu" ["sex"]=> string(6) "famale" }
    ###範圍解析運算子(類別常數存取)######有兩個冒號組成「::」 ,專門用於###類別實現類別成員操作###,可以實現類別直接存取類別成員######## ####範圍解析運算子是用來給類別(類別名稱)存取類別成員使用的###
    类名::类成员
    #########範圍解析運算子也可以被物件用來當作類別使用(不建議)###
    $对象名::类成员
    #########類別常數只能被類別存取#########
    <?phpclass  Article{
        const  NAME=&#39;ocean&#39;;}echo Article::NAME;
        # 常量是不能通过 Article->NAME 来进行访问的$a=new Article();echo $a::NAME;
        # 范围解析操作符兼容对象,找到对象所属类最终进行访问,效率降低,灵活性提高?>
    ###類別常數是固定的,而物件的屬性是不同物件不同的###

    歸納總結PHP物件基礎

    静态成员

    定义:使用 static 关键字修饰的类成员,表示该成员属于类访问

    • 静态成员
      • 静态属性
      • 静态方法
    • 静态成员是明确用来给类访问的,而不是对象
    • 静态成员只是多了一个 static 关键字修饰,本身也可以被对象访问
    • 静态成员同样可以使用不同的访问修饰限定符限定,效果一致

    歸納總結PHP物件基礎

    <?phpclass  Article{
        public static $name = &#39;hlm&#39;;
        public static $type = &#39;art&#39;;
    
        public static function getName()
        {
            return self::$name;
        }}# 静态属性$a = new Article();echo Article::$name;# 静态方法echo Article::getName();?>

    self关键字

    • 在类的内部(方法里面)使用,代替类名的写法
    • self 如同 $this 代表内部对象一样,能够在方法内部代替当前类名
    • 能够保障用户方便修改类名字
    • self 关键字是代替类名,所以需要配合范围解析操作符 ::
    <?phpclass  Article{
        public static function getInstance1()
        {
            return new self();
        }
    
        public static function getInstance2()
        {
            return new Article();
        }}$a = Article::getInstance1();$b = Article::getInstance2();var_dump($a,$b);?>
        # 输出object(Article)
        #1 (0) { } object(Article)
        #2 (0) { }

    类加载

    类的访问必须保证类在内存中已经存在,所以需要再用类之前将类所在的 PHP 文件加载到内存中

    • 类的加载分为两种

      • 手动加载:在需要使用类之间通过 include 将包含类的文件引入到内存
      • 自动加载:提前定义好类结构和位置,写好引入类文件代码,在系统需要类而内存不存在的时候想办法让写好的加载类的代码执行(自动加载是自动运行写好的加载类的代码)
    • 自动加载两种方式

      • 魔术函数 __autoload:系统自动调用,需要传入类名,在函数内部实现类的手动加载(PHP7及之后不建议使用此方法)
      function __autoload($classname){
          # 找到对应的文件路径和命名规范,手动加载}
       
      • 自定义函数:自己定义类的加载实现,然后通过 spl_autoload_register 注册到自动加载机制(可注册多个自动加载)
      # 自定义类加载函数function 自定义函数($classname){
          # 找到对应的文件和命名规范,手动加载}#注册自动加载sql_autoload_register('自定义函数名字')

    自动加载要求在声明类的时候有良好的规范

    • 类名与文件名一致:类名.php 或者 类名.class.php
    • 类文件分类放好

    歸納總結PHP物件基礎

    例:手动加载

    歸納總結PHP物件基礎

    Article.php

    <?phpclass  Article{
        public function getName(){
            return __METHOD__;
        }}

    mian.php

    <?php # include &#39;Article.php&#39;;# 直接加载比较消耗资源,而且如果类已经在内存中存在,直接include会报错,建议判断后再加载if(!class_exists(&#39;Article&#39;)){
        include &#39;Article.php&#39;;}$a=new Article();var_dump($a->getName());
        # outputstring(16) "Article::getName"

    自动加载

    • __autoload(不建议使用)

    一个系统中,可能类文件会放到不同的路径下,因此一个完整的自动加载函数,应该要进行文件判定功能

    <?php function __autoload($classname){
        # 形参代指 类名
        #组织文件路径,假设当前路径下,有两个文件夹下都有类c和类m
        $c_file = &#39;c/&#39; . $classname . &#39;.php&#39;;
        if (file_exists($c_file)) {
            include_once($c_file);
            return true;
        } 
        //if 语句如果只有一行不需要加 {}
        //include_once 只加载一次
    
        $m_file = &#39;m/&#39; . $classname . &#39;.php&#39;;
        if (file_exists($m_file)) {
            include_once($m_file);
            return true;
        }
    }
    
    
    $a=new Article();
    $b=new Article();
    • spl_autoload_register
    <?phpfunction  autoload01($classname){
        if(!class_exists($classname)){
            $file_name=$classname.&#39;.php&#39;;
            if(file_exists($file_name)) include_once $file_name;
        }}spl_autoload_register(&#39;autoload01&#39;);$a=new Article();

    对象克隆

    通过已有的对象复制一个新的同样的对象,但两者之间并非同一个对象

    歸納總結PHP物件基礎

    歸納總結PHP物件基礎

    面向对象高级

    面向对象三大特性

    封装、继承、多态

    类的封装

    歸納總結PHP物件基礎

    类的继承

    inherit,子类合法拥有父类的某些权限

    • 继承必须满足继承关系:即存在合理的包含关系
    • 继承的本质是子类通过继承可以直接使用父类已经存在的数据和数据操作
    • PHP 使用 extends 关键字表示继承

    子类也称派生类

    父类也称基类

    # 父类class Human{}# 子类继承class Man extends Human{}

    类的多态

    多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果

    • 需要发生类的继承,同时出现方法的重写(override),即子类拥有与父类同名的方法
    • 在实例化对象的时候让父类对象指向子类对象(强制类型,PHP不支持,PHP 弱类型很灵活)
    • 结果:父类对象表现的子类对象的特点

    歸納總結PHP物件基礎

    —PHP继承—

    <?phpclass  Human{
        public function show(){
            echo __METHOD__;
        }}class Man extends Human{}$m=new Man;$m->show();

    有限继承

    子类在继承父类的成员时,并非继承所有内容,而是继承并使用父类部分内容

    • PHP 中繼承的本質是物件繼承
    • PHP 中繼承的內容:父類別所有公有成員、受保護成員和私有屬性,私有方法不能繼承
    • 受保護(protected)成員專於繼承,可以在父類別或子類別內部存取
    • 私有成員的存取只能在所屬類別中設定公有或受保護方法實作存取
    • 構造方法和析構方法可以被子類別繼承,

    重寫Override

    #override,子類別中定義了與父類別重名的成員

    歸納總結PHP物件基礎

    parent 關鍵字

    一種明確存取父類別成員的表達方式

    歸納總結PHP物件基礎

    #方法重寫後,存取呼叫的是子類別方法,如果想要存取父類別方法,可以透過在子類別方法中使用parent 來強制存取父類別方法

    parent 不能用於存取父類別的屬性(靜態屬性可以)

    PHP 繼承特點

    • PHP 只能單繼承,只有一個父類(若繼承多個類,可以使用鍊式繼承)
    • PHP 繼承中,只有私有方法不能繼承
    • PHP 允許繼承父類別中的建構方法和析構方法

    #靜態延遲綁定

    歸納總結PHP物件基礎

    歸納總結PHP物件基礎

    ##最終類別Final

    使用final 關鍵字修飾類別名,表示此類不可以被繼承

    final 關鍵字還能修飾方法,表示方法不能被重寫(通常此時類別不會使用final 關鍵字)

    歸納總結PHP物件基礎

    抽象類別Abstract

    使用abstract 關鍵字修飾的類,表示該類別只能被繼承,不能被實例化

    abstract 關鍵字可以修飾方法,表示方法為抽象方法,抽象方法沒有方法體(沒有{})

    抽象方法存在的類必須為抽象類別

    繼承抽象類別的類別要麼為抽象類,要麼實作抽象類別裡所有的抽象方法

    trait 程式碼複用

    歸納總結PHP物件基礎

    適用於,不同類別之間有公用程式碼,但類別彼此關係不存在繼承關係,此時可以將公用程式碼儲存到trait 中

    trait 內部可以擁有一個類別能擁有的成員屬性(包括靜態),成員方法(包括靜態和抽象方法),但不能有類別常數

    trait 用來程式碼重複使用,不能被實例化,不能被繼承

    trait 同名

    一個類別中可能需要引入多個trait ,而不同trait 中可能出現同名

    歸納總結PHP物件基礎

    #介面

    Interface,專門用來規範一些共性類別必須實作的方法

      介面不是類,但是與類別有類似的結構
    • 介面不能實例化,類別可以實作介面
    interface 介面名字{}

    class 類別名稱implements 介面名稱{}

    歸納總結PHP物件基礎

    介面成員

    介面成員只能有兩類

      介面常數:const
    • 共有的介面方法(普通方法與靜態方法)

    歸納總結PHP物件基礎

    PHP 重載

    overload,指在一個類別中可以出現多個同名方法,彼此之間的參數數量和型別不一樣

    歸納總結PHP物件基礎

    用來容錯

    屬性重載

    當物件存取不存在的或權限不夠的屬性的時候,自動觸發魔術方法讓程式碼不出錯

    屬性重載魔術方法

      __get(屬性名稱):存取不存在或權限不夠的屬性時觸發
    • ##__set(屬性名稱,屬性值) :設定不存在或權限不夠的屬性時觸發
    • __isset(屬性名):判定不存在或權限不夠的屬性是觸發
    • __unset(屬性名):刪除不存在或權限不夠的屬性時觸發
    • __tostring(): 當當作字串
    方法重載

    物件或類別存取不存在或者權限不夠的方法,自動觸發的魔術方法讓程式碼不出錯

    • __cal(方法名,方法参数列表):调用不存在或者权限不够的方法时触发
    • __callStatic(方法名,方法参数列表):调用不存在或者权限不够的静态方法时触发

    对象遍历

    将对象中的所有属性以键值对的形式取出并进行访问

    • 对象是一种复合数据类型,对象中真正保存的内容是属性

    • 对象的属性本质也是一种键值对关系:名字 = 值

    • 对象遍历就是利用 foreach 对对象中的属性进行取出解析

    • 对象遍历遵循访问修饰限定符的限定:即类外只能遍历所有共有属性

      foreach(对象变量 as [属性名变量 =>] 属性值变量){
          #属性名变量代表取出的每个属性的名字
          #属性值变量代表取出的每个属性的值}

      歸納總結PHP物件基礎

    Iterator 迭代器

    歸納總結PHP物件基礎

    生成器

    歸納總結PHP物件基礎

    歸納總結PHP物件基礎

    yield 关键字

    设计模式

    design pattern,是软件开发人员在软件开发过程中问题的解决方法

    单例模式

    singleton,是一种类的设计只会最多产生一个对象的设计思想歸納總結PHP物件基礎

    保证资源唯一性

    工厂模式

    。。。。。。

    命名空间

    namespace,指人为的将内存进行分隔,让不同内存区域的同名结构共存,从而解决在大型项目能出现重名结构问题

    歸納總結PHP物件基礎

    基础语法:

    namespace 关键字定义空间

    命名规则

    字母、数字、下划线,不能以数字开头

    命名空间必须写在所有代码之前,定义了一个,之后可以定义多个

    歸納總結PHP物件基礎

    子空间

    subspace,即在已有空间之上,再在内部进行空间划分

    子空间直接通过 namespace+路径符号 \ 实现

    非限定名称

    直接访问元素本身,代表当前所属空间(当前目录)

    限定名称

    使用空间名+原名,代表访问当前空间子空间(当前目录子目录)

    完全限定名称

    从根目录(全局空间)开始访问,使用 \ 作为全局空间开始符号(根目录)

    全局空间元素访问:使用完全限定名称访问

    歸納總結PHP物件基礎

    命名空间引入

    歸納總結PHP物件基礎

    推荐学习:《PHP视频教程

    以上是歸納總結PHP物件基礎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除