博客列表 >文件包含和类与对象实例演示

文件包含和类与对象实例演示

李玉峰
李玉峰原创
2022年04月30日 23:21:50424浏览

(一) include和require的使用方法和区别

  1. <?php
  2. //文件包含
  3. //本质:将目录文件复制到当前位置
  4. //!1. include
  5. // 推荐绝对路径
  6. // echo __DIR__;
  7. include __DIR__ .'/inc/f1.php';
  8. echo $username .'<br>';
  9. $res = include __DIR__ .'/inc/f1.php';
  10. echo $res .'<hr>';
  11. //!2. require
  12. require __DIR__ . '/inc/f1.php';
  13. echo $username .'<br>';
  14. $res = require __DIR__ .'/inc/f1.php';
  15. echo $res .'<hr>';
  16. //!3. include和 require区别
  17. //? 区别1
  18. //include:用到时再加载,动态
  19. //require:应该写到顶部,静态
  20. //? 区别2
  21. //条件加载使用include,代码执行不终止;不要使用require,代码执行会终止;
  22. if(false) include __DIR__ .'/inc/f2.php';
  23. echo $site;
  24. echo $username .'<br>';
  25. if(false) require __DIR__ .'/inc/f2.php';
  26. echo $site;
  27. echo $username .'<br>';
  28. echo '<hr>';
  29. include __DIR__ .'/inc/f20.php';
  30. echo 'include后面的代码<br>';
  31. // require __DIR__ .'/inc/f20.php';
  32. // echo 'require后面的代码<br>';
  33. //其他情况推荐使用 require,因为有错误可以提前解决

(二) 类与实例:class和new

  1. <?php
  2. //!类与实例
  3. //?1.class
  4. //?2.new
  5. // 类声明
  6. //1.class
  7. class Goods
  8. {
  9. //...
  10. }
  11. //类的实例化:创建对象的过程,new
  12. $goods = new Goods;
  13. var_dump($goods);
  14. echo '<hr>';
  15. //查看类
  16. echo get_class($goods) . '<br>';
  17. //动态类
  18. $str = 'goods';
  19. // 类用大驼峰命名法
  20. $class = ucfirst('goods');
  21. // echo $class;
  22. $o = new $class;
  23. // var_dump($o);
  24. //判断是不是它的实例,是返回true,否返回false
  25. var_dump($o instanceof Goods);

(三)类成员:常规成员和静态成员

  1. <?php
  2. /**
  3. * 类成员
  4. * 一、常规成员
  5. * 1.属性:可以被其他方法所共享
  6. * 2.方法:自定义,魔术方法
  7. *
  8. *
  9. * 访问限制符
  10. * 1.private:私有,仅限当前类使用
  11. * 2.protected:继承,可在本类或子类中使用,不对外公开
  12. * 3.public:公开,默认
  13. *
  14. * 二、静态成员
  15. * 1.static 静态属性 静态方法
  16. * 2.与实例无关,不要用$this
  17. * 3.内部用self,外部用类名
  18. */
  19. class User11
  20. {
  21. //常规成员
  22. //1.属性
  23. //语法:访问限制符 类成员声明
  24. //声明为私有,实现封装
  25. private $username;
  26. //2.方法
  27. //2.1 自定义方法:用户自己声明自己调用
  28. public function getUsername()
  29. {
  30. // -> 对象成员访问符
  31. // $obj = new User1;
  32. // return $obj->username;
  33. // 当前实例的引用,$this与实例绑定的
  34. return $this->username;
  35. }
  36. //2.2 魔术方法:由系统来调用,用户不能直接调用
  37. //构造方法:实例化时自动调用
  38. public function __construct(string $username)
  39. {
  40. $this->username = $username;
  41. }
  42. }
  43. //实例化
  44. $user1 = new User11('刘老师');
  45. echo $user1->getUsername() . '<hr>';
  46. //代码优化
  47. //静态成员
  48. class User2
  49. {
  50. //静态属性
  51. private static $username = 'admin';
  52. //类常量:与实例无关,用类访问
  53. const APP='粮油商城';
  54. //方法
  55. public static function getUsername()
  56. {
  57. //self:与当前类绑定
  58. return self::$username;
  59. }
  60. }
  61. //实例方法问静态方法是一个bug
  62. // echo (new User2) -> getUsername();
  63. //外部用类名访问静态成员
  64. echo User2::getUsername();
  65. echo User2::APP;

(四) 类的扩展、抽象等

1.protected:受保护/可继承

2.extends:扩展/继承

3.parent:父类引用

4.abstract:抽象

5.final:最终类

  1. <?php
  2. use Demo1 as GlobalDemo1;
  3. /**
  4. * 类的扩展/抽象/最终
  5. * 1.protected:受保护/可继承
  6. * 2.extends:扩展/继承
  7. * 3.parent:父类引用
  8. * 4.abstract:抽象
  9. * 5.final:最终类
  10. */
  11. //父类 / 基类
  12. class Person
  13. {
  14. //protected:成员可继承,可以在子类中使用
  15. protected $name;
  16. //private:私有,仅限当前类,子类和外部都不可见
  17. private $id = 123;
  18. //public:类中,子类,类外都可见
  19. public function __construct($name)
  20. {
  21. $this->name = $name;
  22. }
  23. //getInfo::protected
  24. //更严格private,更宽松public
  25. protected function getInfo()
  26. {
  27. return $this->name;
  28. }
  29. }
  30. //学生类
  31. //extends:Stu类扩展了Person类的功能
  32. class Stu extends Person
  33. {
  34. //1.属性扩展
  35. private $lesson;
  36. private $score;
  37. //2.方法扩展/重写
  38. public function __construct($name,$lesson,$score)
  39. {
  40. //引用父类的构造方法
  41. //parent:父类引用
  42. parent::__construct($name);
  43. $this->lesson = $lesson;
  44. $this->score = $score;
  45. }
  46. //getInfo
  47. public function getInfo()
  48. {
  49. // return $this->name."同学,你的 $this->lesson 成绩是 $this->score 分";
  50. //父类引用方法实现
  51. return parent::getInfo()."同学,你的 $this->lesson 成绩是 $this->score 分";
  52. }
  53. }
  54. $stu = new Stu('小明','php',90);
  55. echo $stu -> getInfo();
  56. echo '<hr>';
  57. //直接使用父类
  58. $person = new Person('李老师');
  59. //var_dump只打印属性,不打印方法
  60. var_dump($person);
  61. echo '<hr>';
  62. //抽象类
  63. //把父类声明成一个抽象类,必须通过继承/扩展的子类来间接使用
  64. echo '抽象类' . '<br>';
  65. abstract class Demo1
  66. {
  67. }
  68. //抽象类不能实例化
  69. // new Demo1;
  70. class Demo2 extends GlobalDemo1
  71. {
  72. }
  73. //通过实例化子类来实现
  74. new Demo2;
  75. // 查看父类
  76. echo 'Demo2的父类是:' . get_parent_class(new Demo2);
  77. echo '<hr>';
  78. //有一个抽象方法就成抽象类了
  79. abstract class Demo3
  80. {
  81. //hello 方法已经被实现了
  82. // protected function hello()
  83. // {
  84. // //
  85. // }
  86. //抽象方法:只有方法名,参数列表,没有具体实现(大括号)
  87. abstract protected function hello($name);
  88. }
  89. class Demo4 extends Demo3
  90. {
  91. //工作类Demo4中必须实现父类Demo3中的抽象成员
  92. public function hello($name)
  93. {
  94. return 'Hello,' . $name;
  95. }
  96. }
  97. echo call_user_func([new Demo4,'hello'],'小明');
  98. echo '<hr>';
  99. echo '最终类';
  100. //一个类不用扩展,直接当成工作累/直接干活的,直接new
  101. //为了防止被继承,可声明为最终类
  102. final class Demo5{
  103. }
  104. //最终类不能被继承
  105. // class Demo6 extends Demo5
  106. // {
  107. // }

(六)接口

  1. <?php
  2. //接口:大号的抽象类
  3. //接口中的所有成员必须是抽象的
  4. //interface:声明接口
  5. //implements:实现接口
  6. interface User
  7. {
  8. //1.类常量
  9. const NATION = 'china';
  10. //2.必须是抽象,必须是public
  11. public function m1();
  12. public function m2();
  13. //官方手册不建议声明抽象构造方法
  14. }
  15. //接口不能直接使用,要用一个类来实现它
  16. //1.用普通类来实现一个接口,必须将接口中的所有抽象方法全部实现
  17. class Demo1 implements User
  18. {
  19. public function m1()
  20. {
  21. }
  22. public function m2()
  23. {
  24. }
  25. }
  26. //2.用抽象类来实现一个接口,允许有不实现的抽象成员
  27. abstract class Demo2 implements User
  28. {
  29. public function m1()
  30. {
  31. }
  32. }
  33. //php默认只支持单继承
  34. // class A extends B;
  35. //通过接口可间接实现多继承
  36. interface A
  37. {
  38. }
  39. interface B
  40. {
  41. }
  42. interface C
  43. {
  44. }
  45. class Test implements A,B,C
  46. {
  47. }
  48. //查看当前类实现的所有接口
  49. $arr = class_implements('Test');
  50. printf('<pre>%s</pre>',print_r($arr,true));
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议