博客列表 >类与对象基础

类与对象基础

嘬一口啊
嘬一口啊原创
2020年07月24日 17:26:23712浏览

类的声明和实例化对象

  • 声明类
  1. // class 类名 { }
  2. 例:
  3. class demo {
  4. }
  • 类中成员
  1. // 类成员:属性&方法
  2. 例:
  3. class demo {
  4. // 属性
  5. public $a = '这是类属性';
  6. // 方法
  7. public function test() {
  8. return '这是类方法';
  9. }
  10. }
  • 将类实例化得到对象
  1. 例:
  2. class demo {
  3. // 属性
  4. public $a = '这是类属性';
  5. // 方法
  6. public function test() {
  7. return '这是类方法';
  8. }
  9. }
  10. // 实例化对象:将实例化出的对象以一个变量来承接 = new 要实例化的类名();
  11. $demo = new demo();
  12. // instanceof用于确定一个 PHP 变量是否属于某一类 class 的实例是返回true否则返回false
  13. // 检测$demo变量名是否是属于demo类的实例化对象
  14. var_dump($demo instanceof demo);
  • 调用类中的属性和方法
  1. 例:
  2. class demo {
  3. // 属性
  4. public $a = '这是类属性';
  5. // 数组属性
  6. public $option = [1,2,3];
  7. // 方法
  8. public function test() {
  9. return '这是类方法';
  10. }
  11. }
  12. // 实例化类得到对象
  13. $demo = new demo();
  14. // 调用类中的属性
  15. // 对象名->属性名
  16. echo $demo->a; // 输出"这是类属性"
  17. // 访问调用类中的数组属性 // 根据索引来访问数组中的指定元素
  18. echo $demo->option[0]; // 输出 1;
  19. // 调用类中的方法
  20. // 对象名->方法名();
  21. echo $demo->test(); // 输出 "这是类方法"
  • 类方法中的构造方法

__construct() 构造方法:在本类实例化时自动调用

  1. 例:
  2. class demo {
  3. // 构造方法
  4. public function __construct {
  5. return '这是构造方法';
  6. }
  7. }
  8. // 类只要一实例化就自动调用构造方法
  9. $demo = new demo();
  10. // 打印输出对象
  11. var_dump($demo); // 输出 "这是构造方法";
  • 动态类:将类名设置为变量值
  1. 例:
  2. class demo {
  3. // 属性
  4. public $a = '这是类属性';
  5. // 方法
  6. public function test() {
  7. return '这是类方法';
  8. }
  9. }
  10. $className = 'demo'; // demo是上面的类名
  11. // 实例化对象
  12. $obj = new $className();
  13. // get_class(对象名); 返回对象所属类名
  14. echo get_class($obj);

类中的静态属性和静态方法的定义及访问

  • 静态属性和静态方法的定义

静态属性/静态方法:如果这个属性/方法仅使用一次,可以不创建类实例,而直接通过类来调用

  1. // 静态属性定义:static 属性名 = 属性值;
  2. // 静态方法定义:static 方法名(){}
  3. 例:
  4. class demo {
  5. //静态属性
  6. public static $a = '这是静态属性';
  7. // 静态方法
  8. public static $test() {
  9. return '这是静态方法';
  10. }
  11. }
  • 类中静态属性和静态方法的调用
  1. 例:
  2. class demo {
  3. //静态属性
  4. public static $a = '这是静态属性';
  5. // 静态方法
  6. public static $test() {
  7. return '这是静态方法';
  8. }
  9. }
  10. // 调用静态属性:当前类名::属性名;
  11. demo::$a;
  12. // 调用类中的静态方法:当前类名::方法名();
  13. demo::test();

类中的抽象属性

  1. 例:
  2. class demo {
  3. //定义抽象属性;抽象属性:没被初始化的属性, 默认赋NULL:
  4. public $salary;
  5. }
  6. // 实例化类
  7. $demo = new demo();
  8. // 检测抽象属性是否是一个空值
  9. var_dump(is_null($demo->salary));// 返回值true,

访问属性和方法

  • 本类中的方法中访问类的属性
  1. 例:
  2. class demo {
  3. // 定义属性
  4. public $name = '大娃';
  5. public $age = 100;
  6. // 定义方法
  7. public function test() {
  8. // 实例化当前类
  9. $demo = new demo();
  10. // 访问当前类中的类成员
  11. return "姓名:$demo->name,年龄:$demo->age";
  12. }
  13. }
  14. // 实例化对象
  15. $demo = new demo();
  16. // 调用类方法
  17. echo $demo->test(); // 输出 "姓名:大娃,年龄:100"
  • self和$this

解决类的名称被限定,使用self可以引用当前的类名称:self可以引用当前的类名称

$this会自动创建, $this是只读的,不能被更新 相当于:$this = new self;

类方法中声明的变量,不是属性是类方法的私有变量

  1. 例:
  2. class demo {
  3. // 定义属性
  4. public $name = '大娃';
  5. public $age = 100;
  6. // 定义方法
  7. public function test2() {
  8. // 声明一个变量, 声明在方法中的变量,不是属性,是私有变量/局部变量
  9. $salary = 8000;
  10. // 1.解决类的名称被限定,使用self可以引用当前的类名称
  11. $demo = new self; // 等同于 $demo = new demo();
  12. // 2.使用$this代替实例化出来的对象名称
  13. // $this会自动创建, $this是只读的,不能被更新 相当于:$this = new self;
  14. return "姓名:$this->name,年龄:$this->age,工资:$salary";
  15. }
  16. }
  17. // 实例化对象
  18. $demo = new demo();
  19. // 调用列中的test2方法
  20. echo $demo->test2(); // 输出 "姓名:大娃,年龄:100,工资:8000"
  • 类中的方法访问类外部的成员:变量和函数
  1. class demo {
  2. public function test3() {
  3. // 调用外部函数
  4. $str = hello();
  5. // 外部变量
  6. // 通过超全局数组访问外部变量
  7. return $str.$GLOBALS['username'];
  8. }
  9. }
  10. // 外部函数
  11. function hello(){
  12. return 'Hello ';
  13. }
  14. // 外部变量
  15. $username = '葫芦娃';
  16. // 实例化对象
  17. $demo = new demo();
  18. // 调用类中的test3方法
  19. echo $demo->test3(); // 输出 "hello葫芦娃"
  • 依赖注入:类中的方法访问类外部的成员:变量和函数
  1. 例:
  2. class demo {
  3. public function test4($hello,$username) {
  4. return $hello() . $username;
  5. }
  6. }
  7. // 外部函数传入类中的方法中的两种方法
  8. // 外部函数
  9. function hello()
  10. {
  11. return 'Hello ';
  12. }
  13. // 方法1:通过动态函数把函数传入类中的方法中
  14. $hello = 'hello';
  15. // 方法2:匿名函数[使用匿名函数把外部的函数传入类中方法中]
  16. $hello = function()
  17. {
  18. return 'Hello111';
  19. };
  20. // 外部变量
  21. $username = '葫芦娃';
  22. // 实例化对象
  23. $demo = new demo();
  24. //调用类中的test4方法
  25. echo $demo->test4($hello,$username); // 输出 "hell0葫芦娃"
  • 使用static声明静态方法:不依赖实例访问类的属性
  1. class demo {
  2. // 定义属性
  3. $nation = 'CHINA';
  4. // 声明方法
  5. public static function test5() {
  6. return "葫芦娃的国籍:".self::$nation;
  7. }
  8. }
  9. // 实例化对象
  10. $demo = new dmeo();
  11. // 调用类中的test5方法
  12. echo $demo->test5(); // 输出 "葫芦娃的国籍:CHINA"
  • 普通方法中可以访问静态成员
  1. 例:
  2. class demo {
  3. // 定义属性
  4. $nation = 'CHINA';
  5. // 声明方法
  6. public function test6() {
  7. return "国籍: " . self::$nation;
  8. }
  9. }
  10. // 实例化对象
  11. $demo = new dmeo();
  12. // 调用类中的test6方法
  13. echo $demo->test6(); // 输出 "国籍:CHINA"

类的继承

子类继承父类方法:class 子类名 extends 继承的父类名 { }

子类继承了父类可用父类中的除了private关键字定义的属性和方法

  1. 例:
  2. // 父类
  3. class demo {
  4. public function test {
  5. return "这是父类的方法";
  6. }
  7. }
  8. // 继承类
  9. class demo1 extends demo {
  10. }
  11. // 实例化子类调用继承父类中的方法
  12. $demo1 = new demo1();
  13. echo $demo1->test(); //输出 "这是父类方法"

类成员的访问控制[成员的作用域]

public[公共的]关键字的属性和方法:在类中和子类中及外部中使用

protected[受保护的]:类内部和子类中可以调用但类外部不可调用

private[私有的]:只可在类的内部中调用,不可再类的外部和子类中调用

  1. 例:
  2. class demo {
  3. // public 公共成员,类外部和内部及子类中均可调用
  4. public $name = '金刚葫芦娃';
  5. // private 受保护的 类内部和子类中可以调用但类外部不可调用
  6. protected $age = 30;
  7. // 私有的 只可在类的内部中调用,不可再类的外部和子类中调用
  8. private $wife = '金刚葫芦媳';
  9. // 类内部方位
  10. public function test() {
  11. return "姓名: {$this->name},年龄 : {$this->age}, 媳妇: {$this->wife}";
  12. }
  13. }
  14. // 实例化对象
  15. $dem0 new demo();
  16. // 调用test方法查看三种关键字是否能正常使用
  17. echo $demo->test(); // 输出 "姓名:金刚葫芦娃,年龄:30,媳妇:金刚葫芦媳" 都可以使用
  • 子类中调用三种关键字定义的属性
  1. 例:
  2. class demo {
  3. // public 公共成员,类外部和内部及子类中均可调用
  4. public $name = '金刚葫芦娃';
  5. // private 受保护的 类内部和子类中可以调用但类外部不可调用
  6. protected $age = 30;
  7. // 私有的 只可在类的内部中调用,不可再类的外部和子类中调用
  8. private $wife = '金刚葫芦媳';
  9. }
  10. }
  11. class demo1 extends demo {
  12. public function test() {
  13. // 子类中: 只有public 和 protected可见
  14. return "姓名: {$this->name}, 工资: {$this->age}";
  15. }
  16. }
  17. // 实例化对象
  18. $demo1 new demo1();
  19. echo $demo1->test(); // 输出 "姓名:金刚葫芦娃,年龄:30"
  • 类外部方位三种关键字定义的属性
  1. 例:
  2. class demo {
  3. // public 公共成员,类外部和内部及子类中均可调用
  4. public $name = '金刚葫芦娃';
  5. // private 受保护的 类内部和子类中可以调用但类外部不可调用
  6. protected $age = 30;
  7. // 私有的 只可在类的内部中调用,不可再类的外部和子类中调用
  8. private $wife = '金刚葫芦媳';
  9. }
  10. }
  11. // 实例化对象
  12. $demo1 new demo1();
  13. //调用public关键字的属性
  14. echo $demo->name; // 输出"金刚葫芦娃"
  15. // 调用protected关键字的属性
  16. echo $demo->age; // 输出直接报错,不能访问protectred关键字定义的属性
  17. // 调用private关键字的属性
  18. echo $demo->wife; // 输出直接报错,不能访问private关键字定义的属性

使用final关键字定义fianl类和fianl方法及final属性

  • fianl关键字定义fianl类

fianl类不能被继承

  1. // 定义fianl类:fianl class 类名 { }
  2. 例:
  3. fianl class demo {
  4. public funciton test() {
  5. return "final类中的方法";
  6. }
  7. }
  • final关键字定义fianl方法

fianl方法不能被子类重写

  1. 例:
  2. class demo {
  3. fianl public function test() {
  4. return "这是final方法";
  5. }
  6. }
  • final关键字定义fianl属性

final属性也不能被重写

  1. 例:
  2. class demo {
  3. final public $name = '二娃';
  4. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议