IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP面向对象 -> 正文阅读

[PHP知识库]PHP面向对象

类的声明

  1. 定义类

    <?php  
           权限修饰符 class 类名{
                    类体;
    }
    ?>
    
    • 权限修饰符是可选项,可以使用public,protected,private或者省略这三者
    • class是创建类的关键字
    • 类名是所要创建类的名称,必须写在class关键字之后,类名称之后必须有大括号
    • 类体是类的成员,类体必须放在类名后面的大括号内部
  2. 成员属性

    • 在类中直接声明的变量成为成员属性,可以在类中声明多个变量,即对象有多个成员属性

    • 成员属性的类型可以是PHP中的标量两类型和复合类型,但是使用资源和空类型是没有意义的

    • 成员属性的声明必须用关键字来修饰,如public,protected,private等,如果不需要特殊的定义就用var关键字修饰

      <?php
      class conndb{
              var $dbtype
              var $host;
              var $user;
              var $pwd;
      }
      ?>
      
  3. 成员常量

    在类中定义常量

    <?php
    class conn{
        const pi=3.1415926;
    }
    ?>
    

    常量的输出不需要实例化对象,直接由类名+常量名调用

    ? 类名::常量名(::成为作用域操作符)

  4. 成员方法

    在类中声明的函数称为成员方法,一个类中可以声明多个函数,即对象可以有多个成员方法

    <?php
    class student{
        function gets(){
        }
    }
    ?>
    

    在类中的成员属性和成员方法的声明都是可选的,可以同时存在,也可以单独存在

    类的实例化

    1. 对象的创建

      $变量名=new类名称([参数]);

      • 变量名:类实例化返回的对象名称,用于引用类中的方法
      • new:关键字,表明要创建一个新的对象
      • 类名称:表示新对象的类型
      • 参数:指定类的构造方法用于初始化对象的值
    2. <?php
      class conn{
      function conn{
      }
      }
      $ct=new conn();
      $ct2=new conn();
      ?>
      

      一个类可以实例化多个对象,且每个对象都是独立的,互不联系

    3. 访问类中的成员

      对类进行实力化后可以通过对象的应用来访问类中的公有属性和公有方法,即被关键字public修饰的属性和方法,访问格式如下

      ? $变量名=new 类名称([参数]);

      ? $变量名->成员属性=值;

      ? $变量名->成员属性;

      ? $变量名->成员方法;

      "$this"操作符

      类内调用成员属性,一般用于成员方法内部调用类的成员属性

      <?php
        class saler{
           public $count=100;
           protected $discount=80;
           private $money=100;
           public function getall(){
             var_dump($this);
             echo $this->count,$this->discount,$this->money;
             }
        }
        $s=new saler();
        $s->getall();
        ?>
      

      面向对象开发规范

      1. 构造方法

        构造方法的实现:在类中增加一个方法__construct()即可

        <?php
        class saler{
        public $count;
        private $money;
        public function __construct(){
        echo __CLASS__;
        }
        }
        new saler;
        $=new saler();
        ?>
        

? 构造方法也是一个普通方法,不普通的地方在于,类实例化得到的对象会马上自动调用,构造方法的意义:

? 构造方法是对象实例化的时候用来初始化对象的资源的,所以通常是用来初始化对象或则其他资源初始化

2.析构方法

  • 析构方法的实现:在类中增加一个__destruct(){

? //方法体,通常完成一些在对象销毁前的清理任务 }

  • 析构方法属于类中的可选内容

    3.对象传值

    • 对象传值是引用传递,不管给多少给对象赋值,内存中只有一个对象
  • 对象传值就是保存对象中的变量赋值给另一个对象

面向对象的封装

  1. 公有成员关键字public

    公有成员可以在程序的任何地点(类内,类外)被其他的类和对象调用。子类可以继承和使用父类中所有的公有成员,所有方法在默认状态下也是公有的

  2. 私有成员关键字private

    被private关键字修饰的变量和方法,只能在所属类的内部被调用和修改,不能在类外被访问,即使是子类也不可以

    <?php
    class book{
         private $bookname="PHP从入门到实践";
         public function setname($bookname){
         $this->bookname=$bookname;
         }
         public function getname(){
         return $this->bookname;
         }
    }
    $book=new book();
     $book->setname("PHP自学视频教程");
    echo $book->getname;
     echo $book->bookname;//直接访问私有成员,错误使用
    ?>
    

3. ## 保护成员关键字protected

  private关键字可以将数据完全隐藏起来,除了在本类以外,其他地方都不可以调用,子类也不可以,protected修饰的类成员,可以在本类和子类中被调用,其他地方则不可以被调用

  ```php
  <?php
      class car{
          protected $carname="奥迪系列":
      }
      class smallcar extends car{
            public function say(){
                echo "调用父类中的属性:".$this->carname;
            }
      }
    $car=new smallcar();
      $car->say();
      echo $car->carname;
      ?>
 PHP中虽然没有对修饰变量的关键词做要求,但从面向对象的封装而言,一般使用private或protected关键字修饰变量

面向对象的继承

  1. 继承关键字extends

    <?php
        class fruit{
        var $apple="苹果";
        var $banana="香蕉";
        var $orange="橘子";
    }
    class fruitType extends fruit{
      var $grape="葡萄";
    }
    $fruit=new fruitType();
    echo $fruit->apple.",".$fruit->banana.",".$fruit->orange.",".$fruit->grape;
    ?>
    
  2. "::"操作符

    • $this只能在类的内部使用,而操作符"::"可以在没有声明任何实例的情况下访问类中的成员

    • "::"的语法格式:关键字::变量名、常量名、方法名

    • 关键字分为三个:

      1. parent关键字:可以调用父类中的成员变量,成员方法和常量

      2. self关键字:可以调用当前类中的静态成员和常量

      3. 类名:可以调用本类中的变量常量和方法

        <?php
            class car{
            const name="别克系列";
            public function bigType(){
                echo "父类:".car::name;
            }
        }
        class smallcar extends car{
            const name="别克君威";
            public function smallType(){
                echo parent::bigType()."\t";
                echo "子类:".self::name;
            }
        }
        $car=new smallcar();
        $car->smallType();
        ?>
        

覆盖父类方法

  1. 覆盖父类方法,也就是使用子类中的方法将从父类中继承的方法进行替换,也叫方法的重写

  2. 覆盖父类方法的关键就是在子类中创建与父类中相同的方法,包括方法名称、参数和返回值类型

  3. 如果父类和子类都定义了构造方法,当子类的对象被创建后,将调用子类的构造方法,而不会调用父类的构造方法

    
    

    static关键字

    静态属性和静态方法

    <?php
        class web{
        static $num="1";
        static function change(){
            echo "您是本站第".self::$num."位访客";//self调用本类的静态成员和常量
            self::$num++;
        }
    }
    $web=new web();
    echo "第一次通过对象调用:<br>";
    $web->change();
    $web->change();
    $web->change();
    echo "<br>第二次通过类名调用:<br>";
    web::change();
    web::change();
    ?>
    
    

    抽象类和接口

    1. 抽象类

      抽象类是一种不能被实例化的类,只能作为其他类的父类使用,抽象类使用abstract关键字来声明

      ?

      abstract class 抽象类名称{
      
                          abstract function 成员方法(参数);
      
                          abstract function 成员方法2(参数);
      
      }
      

      抽象类和普通类相似,包含成员变量,成员方法,两者的区别在于,抽象类至少要包含一个抽象方法,抽象方法没有方法体,其功能的实现只能在子类中完成,抽象方法也是使用abstract关键字来修饰的

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8F8kJZmm-1636982295287)(C:\Users\25892\Desktop\isl实验室\面向对象abstract.png)]

    2. 接口

      PHP只支持单继承,使用接口可以实现多重继承,PHP可以实现多个接口

      • 接口的声明

        通过关键字interface来声明,接口中声明的方法必须是抽象方法,接口中不能声明变量,只能用const关键字声明位常量的成员属性,并且接口中的所有成员都必须具备public的访问权限

      • interface 接口名称{
                //常量成员
                //抽象方法(成员方法必须是抽象方法)
        

      }

      
      - 不要用public以外的关键字修饰接口中的类成员,对于方法,不屑关键字也可以,这是由接口类自身的天性决定的
      
      - 接口和抽象类相同,都不能惊醒实例化的操作,也需要通过子类来实现,但是接口可以直接使用接口名称在接口外获取常量成员的值,接口类也可以用关键字extends继承
      
      - 接口的应用
      
      既然通过子类继承了接口中的方法,那么接口中的所有方法必须都在子类中实现,否则PHP将会报错
      
      ```php
      <?php
          interface person{
          public function say();
      }
          interface popedom{
              public function money();
      }
      class member implements person,popedom{
          public function asy(){
              echo "我只是一名普通员工,";
          }
          public function money(){
              echo "我一个月的薪水是10000员";
          }
      }
      $man=new member();
      $man->say();
      $man->money();
      ?>
      

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtkruzGx-1636982295289)(C:\Users\25892\Desktop\isl实验室\接口.png)]

面向对象实现多态

  1. 通过继承实现多态

    <?php
        abstract class type{
        abstract function go_type();
    }
    class type_car extends type(){
        public function go_type(){
            echo "我开着小轿车去拉萨";
        }
    }
    class type_bus extends type(){
        public function go_type(){
            echo "我坐巴士去拉萨";
        }
    }
    function change($obj){
        if($obj instanceof type){
            $obj->go_type();
        }else{
            echo"传入的参数不是一个对象";
        }
    }
    echo "实例化type_car:";
    change(new type_car());
    echo "<br>";
    echo "实例化type_bus:";
    change(new type_bus);
    ?>
    
  2. 通过接口实现多态

    <?php
        interface type{
        public function gotype();
    }
    class typecar implements type{
         public function gotype(){
             echo "我开着小轿车去拉萨";
          }
    }
    class typebus implements type{
        public function gotype(){
            echo "我坐巴士去拉萨";
        }
    }
    function change($obj){
        if($obj instanceof type){
            $obj->go_type();
        }else{
            echo"传入的参数不是一个对象";
        }
    }
    echo "实例化type_car:";
    change(new type_car());
    echo "<br>";
    echo "实例化type_bus:";
    change(new type_bus);
    ?>
    

    面向对象的其他关键字

    1. final关键字

      final修饰类说明该类不可以再被继承,也不能再有子类

      final修饰成员方法说明该方法在子类中不可以进行重写,也不可以被覆盖,可以继承使用

    2. clone关键字

      $克隆对象名称=clone $原对象名称(克隆对象)

      对象克隆成功后,它们的成员方法、属性以及值是完全相同的

      克隆副本对象的初始化

      <?php
          class book{
          private $object_type='book';
          public function settype($type){
              $this->object_type=$type;
          }
          public function gettype(){
              return $this->object_type;
          }
          public function __clone(){
              $this->object_type='computer';
          }
      }
      $book1=new book();
      $book2=clone $book1;
      echo '对象$book1的变量值为:'.$book1->gettype();
      echo '<br>';
      echo '对象$book2的变量值为:'.$book2->gettype();
      ?>
      

      instanceof关键字

      可以用来检测当前对象属于哪个类

      trait关键字

      实现代码的重用

      类中不允许定义与trait同名的属性

      类中定义的方法会覆盖trait同 名的方法

      <?php
          trait eat{
          public function show(){
              echo 'eat::show()<br/>';
           }
      }
      class man{
          use eat{
              eat::show insteadof eat;
          }
      }
      $m=new man();
      $m->show();
      ?>
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FYHr6kSu-1636982295291)(C:\Users\25892\Desktop\isl实验室\trait.png)]

      面向对象的常用魔术方法

      __set()和__get()方法

__set()方法包含两个参数,分别表示变量名称和变量值,这个方法不需要主动调用,

__get()方法在对象外部获取私有成员属性的值,包含一个必要参数,即私有数据成员名,

<?php
class Person{
	/*封装私有成员属性*/
	private $name='张三';private $sex='男';private $age=12;
	/*__get()方法用来获取私有属性*/
	function __get($property_name){
		echo '在直接获取私有成员属性得时候,自动调用了这个__get()方法<br/>';
		if(isset($this->$property_name))
		{
			return ($this->$property_name);
		}else{
			return NULL;
		}
	}
}
$p1=new Person();
/*直接获取私有属性得值,会自动调用__get()的方法,返回成员属性的值*/
echo '姓名:'.$p1->name.'<br/>';
echo '性别:'.$p1->sex.'<br/>';
echo '年龄:'.$p1->age.'<br/>';
?>

__isset()和__unsset()方法

? __isset()方法对私有的成员属性进行检测,

? __unset()方法在类的外部删除指定的私有成员属性,

__toSting()方法

<?php
    class people{
    public function __toString(){
        return "我是toString的方法体";
    }
    $peo=new people();
    echo $peo;
}
注意输出对象时,echo或print函数后面直接跟要输出的对象,中间不要加多余的字符,否则__toString()方法不会被执行

__autoload()方法

在指定的路径下自动查找和该类名称相同的文件,找到则继续执行,否则报告错误

();
/直接获取私有属性得值,会自动调用__get()的方法,返回成员属性的值/
echo ‘姓名:’. p 1 ? > n a m e . ′ < b r / > ′ ; e c h o ′ 性 别 : ′ . p1->name.'<br/>'; echo '性别:'. p1?>name.<br/>;echo.p1->sex.’
’;
echo ‘年龄:’.$p1->age.’
’;
?>


### __isset()和__unsset()方法

?			__isset()方法对私有的成员属性进行检测,

?			__unset()方法在类的外部删除指定的私有成员属性,

### __toSting()方法

```php
<?php
    class people{
    public function __toString(){
        return "我是toString的方法体";
    }
    $peo=new people();
    echo $peo;
}
注意输出对象时,echo或print函数后面直接跟要输出的对象,中间不要加多余的字符,否则__toString()方法不会被执行

__autoload()方法

在指定的路径下自动查找和该类名称相同的文件,找到则继续执行,否则报告错误

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:33:35  更:2021-11-17 12:34:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 13:44:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计