博客列表 >文件加载及类与对象基础

文件加载及类与对象基础

溪边小树
溪边小树原创
2020年05月05日 19:57:29478浏览

文件加载

[toc]

  • 文件加载: 可简单的理解为将外部文件内容复制到当前文档中
  • 根据被加载文件的特征和重要性,可分为: “条件加载” 和 “强制加载” 二种方式

1. 条件加载

加载外部文件,如果失败报警告级(Warning)错误,不会中断程序

序号 语法 描述
1 include 条件加载
2 include_once 去重(chong)条件加载

2. 强制加载

加载外部文件,如果失败报致命级(Fatal error)错误,并中断程序

序号 语法 描述
1 require 强制加载
2 require_once 去重强制加载

类与对象

1. 概念

序号 名称 描述 关键字
1 class 对象的模板 class
2 对象instance 类的实例 new
  • 类与对象界限并不清晰,在不影响理解前提下,常用类代表实例来引用类成员
  • 对象与类的某一个实例绑定, 所以对象与实例可视为同义词,互换并不影响

2. 类中成员

2.1 按功能分类

序号 名称 描述 关键字
1 类属性property 类中变量
2 类方法method 类中函数 function
3 类常量method 类中常量 const

2.2 按访问权限分类

序号 名称 关键字 类外部 类内部 类继承上下文 描述
1 公开成员 public 允许 允许 允许 默认
2 受保护成员 protected 禁止 允许 允许 封装
3 私有成员 private 禁止 允许 禁止 封装

2.3 按调用主体分类

序号 名称 关键字 调用主体
1 非静态成员 默认 类实例调用
2 静态成员 static 类调用

2.4 按是否有具体实现分类

序号 名称 关键字 具体实现
1 非抽象成员 默认
2 抽象成员 abstract
  • 类中只要有一个抽象方法,该类必须声明为抽象类abstract class
  • 严格来说未初始化的属性也应该算是抽象成员, 即: 抽象属性
  • 思考: 有抽象属性的类,为什么不需要定义为抽象类呢?
    • 普通属性通常会在类实例化通过构造方法进行初始化
    • 静态属性由类调用而没有实例化的机会,所以定义时通常已经初始化

2.5 按方法是否可重写

序号 类型 关键字 描述
1 可重写方法 默认 可由子类重写
2 最终方法 final 不允许子类重写

只有 “类和方法” 可声明为final, 属性不可以


3. 类的分类

序号 类型 关键字 可实例化 可继承 可组合
1 常规类 class 允许 允许 允许
2 最终类 final 允许 禁止 允许
3 抽象类 abstract 禁止 允许 允许
4 特征类 trait 禁止 禁止 允许
5 接口类 interface 禁止 允许 允许
6 匿名类 new class{} 禁止 允许 允许

部分示例

  1. <?php
  2. // 加载用户的自定义模板
  3. include 'custom.php';
  4. include "custom.php";
  5. include ("custom.php");
  6. $file = "custom.php";
  7. include $file;
  8. include "$file";
  9. $file = "custom";
  10. include $file . '.php';
  11. if (@!include 'custom1.php') include 'default.php';
  12. $file = 'custom.php';
  13. if (file_exists($file) && is_file($file))
  14. include "{$file}";
  15. else
  16. include 'default.php';
  17. echo '如果看到我, 说明程序没有因文件加载失败而终止';
  18. // include_once(): 仅允许加载一次
  19. // 全局成员:函数, 常量, 类, 接口
  20. // 不支持函数重载, 因此在同一个程序中不允许出现同名函数
  21. // include 'common.php';
  22. // include 'common.php';
  23. include_once 'common.php';
  24. // include_once(): 加载前会检查该文件是否已经加载过了, 去重检查
  25. include_once 'common.php';
  26. echo fetch();
  27. // 1. require: 强制加载
  28. // 如果加载失败, 终止当前脚本, 与include不一样
  29. require 'config.php';
  30. // 2. 强制去重加载
  31. require_once 'common.php';
  32. require_once 'common.php';
  33. echo '如果看到我, 说明程序没有因文件加载失败而终止';
  34. // 文件加载与作用域
  35. // 只要在同一个作用域内, 文件外部变量可以在被加载的文件中使用
  36. // 当前是全局作用域
  37. $sitename = 'php中文网';
  38. // include 'file1.php';
  39. echo '站点名称: ' , $sitename ?? '默认站点';
  40. $email = 'peter@php.cn';
  41. echo '<hr>';
  42. // 函数作用域
  43. function test1()
  44. {
  45. include 'file1.php';
  46. echo '<br>';
  47. echo $email;
  48. }
  49. test1();
  50. echo '<hr>';
  51. function test2()
  52. {
  53. include 'file2.php';
  54. }
  55. test2();
  56. echo $goods ?? '默认商品';
  57. // 小案例: 数据查询
  58. // 连接数据库
  59. require 'connect.php';
  60. // 查询测试
  61. $sql = 'SELECT `id`,`name`,`email` FROM `users` LIMIT 3';
  62. $res = $pdo->query($sql)->fetchAll(PDO::FETCH_NUM);
  63. // 解构遍历查询结果
  64. foreach ($res as list($id, $name, $email)) {
  65. printf('%s : %s ( %s ) <br>', $id, $name, $email);
  66. }
  67. // 变量: 数据复用
  68. $name = '电脑';
  69. $price = 8899;
  70. // 函数: 代码复用
  71. function get($name, $price)
  72. {
  73. return "$name : $price 元";
  74. }
  75. // echo get('电脑', 7899);
  76. echo get($name, $price);
  77. // 变量 + 函数 = 对象
  78. // 对象也是实现"代码复用"的手段
  79. // 要使用对象, 就得先创建一个模板,根据这个模板,不断的创建多个对象出来,实现复用
  80. // 这个模板就叫: "类"
  81. // $object = {
  82. // // 变量: 数据复用
  83. // $name = '电脑';
  84. // $price = 8899;
  85. // // 函数: 代码复用
  86. // function get($name, $price)
  87. // {
  88. // return "$name : $price 元";
  89. // }
  90. // }
  91. //类的声明与实例化
  92. //1. 类的声明: class
  93. class Goods
  94. {
  95. }
  96. // 2. 类的实例化:创建对象的过程, new
  97. $goods = new Goods();
  98. // 类的实例, 对象, 在不会引起误会的场景下, 实例与对象是同义词
  99. var_dump($goods instanceof Goods);
  100. // 如果不知道类名,get_class()
  101. echo get_class($goods);
  102. // 动态类, 首字母大写
  103. $class = ucfirst('goods');
  104. // $class = 'goods';
  105. die($class);
  106. $obj = new $class();
  107. var_dump($obj instanceof Goods);
  108. // 类成员: 类属性, 类方法, 类常量
  109. class User
  110. {
  111. // 类属性: 类中变量
  112. // 类中成员的作用域: 访问限制
  113. // 类属性就是有访问限制的变量
  114. // 语法: 访问限制符 $变量标识符;
  115. // 1. 常规属性: 非静态属性/动态属性
  116. public $name = '胡八一';
  117. public $age = 40;
  118. public $options = [1,2,3];
  119. // nowdow
  120. public $output = <<< 'RES'
  121. <h3>中国必胜 \n\r</h3>
  122. RES;
  123. // heredoc :双引号
  124. public $output1 = <<< EOT
  125. <h3>中国\n\r必胜 </h3>
  126. EOT;
  127. // 非法属性值
  128. // 不能用变量
  129. // public $age = $var;
  130. // 不能用类属性/类方法
  131. // public $user = $this->name;
  132. // 不能用表达式
  133. // public $total = $price * 10;
  134. // 不能使用函数调用
  135. // public $creat = time();
  136. // 2. 静态属性
  137. // 如果一个属性的值,对所有实例来说是一样的, 用类访问更方便,此时可以声明为静态的
  138. public static $nationality = '中国/CHINA';
  139. // php程序的运行简单的可以分为二个阶段: 编译, 执行
  140. // 3. 抽象属性: 没有被初始化, 默认值就null
  141. // public $salary;
  142. public $salary = null;
  143. }
  144. $user = new User;
  145. $user->name = '王胖子';
  146. // -> : 对象运算符/对象成员访问符
  147. echo "姓名: {$user->name}, 年龄: {$user->age}<br>";
  148. echo $user->output . '<br>';
  149. echo $user->output1 . '<br>';
  150. // 访问静态属性: 使用范围解析符, 双冒号::
  151. User::$nationality = '美国/USA';
  152. echo User::$nationality;
  153. var_dump(is_null($user->salary));
  154. // 类成员: 类属性, 类方法, 类常量
  155. class User
  156. {
  157. // 类属性: 类中变量
  158. // 类中成员的作用域: 访问限制
  159. // 类属性就是有访问限制的变量
  160. // 语法: 访问限制符 $变量标识符;
  161. // 1. 常规属性: 非静态属性/动态属性
  162. public $name = '胡八一';
  163. public $age = 40;
  164. public $options = [1,2,3];
  165. // nowdow
  166. public $output = <<< 'RES'
  167. <h3>中国必胜 \n\r</h3>
  168. RES;
  169. // heredoc :双引号
  170. public $output1 = <<< EOT
  171. <h3>中国\n\r必胜 </h3>
  172. EOT;
  173. // 非法属性值
  174. // 不能用变量
  175. // public $age = $var;
  176. // 不能用类属性/类方法
  177. // public $user = $this->name;
  178. // 不能用表达式
  179. // public $total = $price * 10;
  180. // 不能使用函数调用
  181. // public $creat = time();
  182. // 2. 静态属性
  183. // 如果一个属性的值,对所有实例来说是一样的, 用类访问更方便,此时可以声明为静态的
  184. public static $nationality = '中国/CHINA';
  185. // php程序的运行简单的可以分为二个阶段: 编译, 执行
  186. // 3. 抽象属性: 没有被初始化, 默认值就null
  187. // public $salary;
  188. public $salary = null;
  189. }
  190. $user = new User;
  191. $user->name = '王胖子';
  192. // -> : 对象运算符/对象成员访问符
  193. echo "姓名: {$user->name}, 年龄: {$user->age}<br>";
  194. echo $user->output . '<br>';
  195. echo $user->output1 . '<br>';
  196. // 访问静态属性: 使用范围解析符, 双冒号::
  197. User::$nationality = '美国/USA';
  198. echo User::$nationality;
  199. var_dump(is_null($user->salary));
  200. // 类成员之方法
  201. // 工作类
  202. class User
  203. {
  204. // 类方法:类中函数
  205. public $name = '胡八一';
  206. public $age = 40;
  207. public static $nationality = '中国/CHINA';
  208. // 1. 访问类属性: 方法1
  209. public function write1()
  210. {
  211. // 1. 创建类实例
  212. $user = new User;
  213. // 2. 访问类中的属性
  214. return "姓名: {$user->name} , 年龄: {$user->age}";
  215. }
  216. // 2. 访问类属性: 方法2
  217. public function write2()
  218. {
  219. // self: 引用当前, $this: 引用当前实例
  220. // 1. 创建类实例, self 与当前的类绑定
  221. // $this不允许用户设置, 由php系统进行维护和赋值
  222. // $this = new self();
  223. // 2. 访问类中的属性, $this 与当前类的实例绑定
  224. return "姓名: {$this->name} , 年龄: {$this->age}";
  225. }
  226. // 3. 类方法中的变量与类属性的区别
  227. public function write3()
  228. {
  229. // 方法中的: 私有变量
  230. $salary = 9000;
  231. // 类属性
  232. return "姓名: {$this->name} , 年龄: {$this->age}, 工资: $salary";
  233. // 什么时候用类属性, 什么时候用方法的私有变量?
  234. // 1. 类属性: 如果某个变量需要在多个方法中都被使用(共享), 那么就该把它定义为属性
  235. // 2. 方法变量: 如果某个变量只有一个特定方法中使用,那么应该把它定义为这个方法的私有变量
  236. }
  237. // 4. 类方法中访问外部成员
  238. public function write4()
  239. {
  240. // 访问外部函数: 函数的作用域默认是全局, 函数是全局成员
  241. $str = hello();
  242. // 访问外部变量, 可以用global
  243. global $username;
  244. return $str . $username;
  245. }
  246. // 5. 改进类方法中访问外部成员
  247. public function write5(string $name, Closure $closure)
  248. {
  249. return $closure() . $name;
  250. }
  251. // 6. 静态方法: 直接用类调用, 被所有类实例所共享
  252. public static function write6()
  253. {
  254. // 静态方法不允许使用$this
  255. // return "姓名: {$this->name} , 年龄: {$this->age}, 工资: $salary";
  256. // 静态方法中只能访问静态成员: 静态属性, 静态方法
  257. return '国籍是: ' . self::$nationality;
  258. }
  259. // 能不能在一个非静态方法中访问静态成员呢?
  260. public function write7()
  261. {
  262. // 可以访问, 但不推荐, 在以后的版本中很可能被禁止
  263. return '国籍是: ' . self::$nationality;
  264. }
  265. }
  266. // 客户端代码
  267. $user = new User;
  268. echo $user->write1() . '<br>';
  269. echo $user->write2() . '<br>';
  270. echo $user->write3() . '<br>';
  271. // 类外部函数
  272. function hello()
  273. {
  274. return 'Hello ';
  275. }
  276. // 类外部变量
  277. $username = '大金牙';
  278. echo $user->write4() . '<br>';
  279. $hello = function ()
  280. {
  281. return 'Hello ';
  282. };
  283. echo '<hr>';
  284. echo $user->write5($username, $hello) . '<br>';
  285. echo $user->write6() . '<br>';
  286. echo $user->write7() . '<br>';
  287. // 类成员的访问控制: 作用域
  288. class User
  289. {
  290. // public: 公开成员,默认值, 类外部, 类内部, 以及类的子类中(类的继承上下文环境中)
  291. // protected: 受保护的成员, 类外部禁止访问, 但是类的内部以及它的继承上下文中可以访问
  292. // private: 私有成员, 除了当前类可以访问, 类的外部以及类的继承上下文中都禁止访问
  293. // 继承上下文环境: 当前类, 以及它的扩展类/子类,构成的一个具有层级结构的类家庭
  294. protected $name = '胡八一';
  295. protected $age = 40;
  296. // private: 是当前类的私有成员, 是完成对象封装的主要工具
  297. private $salary = 9999;
  298. // 类中方法可以访问类中所有成员, 不受访问控制的限制
  299. public function write()
  300. {
  301. return "姓名: {$this->name} , 年龄: {$this->age}, 工资: $this->salary";
  302. }
  303. }
  304. // 子类
  305. class Rob extends User
  306. {
  307. public function write()
  308. {
  309. return "姓名: {$this->name} , 年龄: {$this->age}, 工资: $this->salary";
  310. }
  311. }
  312. // 客户端
  313. $user = new User();
  314. // echo "姓名: {$user->name} , 年龄: {$user->age}, 工资: $user->salary";
  315. echo $user->write() , '<br>';
  316. $rob = new Rob;
  317. echo $rob->write();
  318. // OOP: 封装, 继承, 多态
  319. // 封装:public, proteced, private
  320. // 继承: extends
  321. // 多态: 方法的重写是实现方法级的多态, 面向接口开发, 实现的是对象级的多态
  322. // 类的继承
  323. // 父类: 基类
  324. class User
  325. {
  326. protected $name = '胡八一';
  327. protected $age = 40;
  328. private $salary = 9999;
  329. protected static $nationality = '中国/CHINA';
  330. public function write()
  331. {
  332. return "姓名: {$this->name} , 年龄: {$this->age}";
  333. }
  334. }
  335. // 类的继承,也叫类的扩展
  336. // 子类: 扩展类
  337. class Rob extends User
  338. {
  339. // 二类成员: 子类有权访问的父类成员类型, public, protected
  340. // 三种操作: 子类对父类的三种操作: 继承, 重写, 扩展
  341. // 1. 继承: 父类的二类成员自动成为子类的成员
  342. // 2. 重写: 覆写与父类/基类同名的成员(属性, 方法)
  343. // 3. 扩展: 子类添加自身的方法来增加/扩展父类的功能
  344. // 1. 重写父类成员
  345. // 属性重写
  346. protected $age = 50;
  347. // 方法重写, 方法级的多态
  348. public function write()
  349. {
  350. // 在子类中可以引用父类成员
  351. // parent::write()
  352. return parent::write() . ', 是一个盗墓人7777~~';
  353. }
  354. // 2. 扩展
  355. // 属性扩展
  356. protected $profession = '摸金校尉';
  357. // 方法扩展
  358. public function write1()
  359. {
  360. return parent::write() . ", 职业: {$this->profession}";
  361. }
  362. }
  363. // 客户端
  364. $user = new User;
  365. echo $user->write() . '<br>';
  366. $rob = new Rob;
  367. echo $rob->write() . '<br>';
  368. echo $rob->write1() . '<br>';
  369. // 最终方法和最终类, final
  370. final class Dad
  371. {
  372. public $a = 100;
  373. public function test1()
  374. {
  375. return __METHOD__;
  376. }
  377. public function test2()
  378. {
  379. return __METHOD__;
  380. }
  381. }
  382. class Son extends Dad
  383. {
  384. public function test1()
  385. {
  386. return __CLASS__ .' 类中的重写方法 : ' . __METHOD__;
  387. }
  388. public function test2()
  389. {
  390. return __CLASS__ .' 类中的重写方法 : ' . __METHOD__;
  391. }
  392. }
  393. // 客户端
  394. $son = new Son;
  395. echo $son->test1(), '<br>';
  396. echo $son->test2(), '<br>';
  397. // 抽象类: 部分分离了" 设计(抽象类中完成)与实现(工作类中完成)"
  398. // 设计类
  399. abstract class User
  400. {
  401. protected $name = '胡八一';
  402. protected $age = 40;
  403. // 具体方法: 有方法体: {...},
  404. protected function write1()
  405. {
  406. return "姓名: {$this->name} , 年龄: {$this->age}";
  407. }
  408. // 抽象方法:没有方法体
  409. // 只要一个类中有一个抽象方法, 那么这个类就是:抽象类
  410. abstract protected function write2();
  411. }
  412. // 实现类/工作类: 是一个可以被实例化的普通类
  413. // 工作类不一定是可以被实例化的普通类,也可是一个抽象类
  414. // 抽象类也可以被继承, 抽象类也可以用在继承的上下文环境中
  415. // 抽象类中允许有抽象成员, 但不是强制的,也可以没有
  416. abstract class Rob extends User{
  417. protected $profession = '摸金校尉';
  418. // 必须将抽象类中的抽象方法实现
  419. protected function write2() {
  420. return parent::write1() . ", 职业: {$this->profession}";
  421. }
  422. }
  423. // 最终工作类: 允许实例化
  424. class Work extends Rob
  425. {
  426. public function write2()
  427. {
  428. return parent::write2();
  429. }
  430. }
  431. // 客户端
  432. // 抽象类不能被实例化
  433. // new User;
  434. // $rob = new Rob();
  435. // echo $rob->write2();
  436. $work = new Work();
  437. echo $work->write2();
  438. // 接口: 完全分离了"设计与实现"
  439. // 关键字: interface
  440. // 使用与类相似的语法: 抽象方法, 常量, 构造方法(魔术方法的一种)
  441. // 默认访问控制必须是public
  442. // 接口允许多继承, 从而间接实现了PHP的多继承
  443. // implements (英婆慢吃)
  444. // 接口使用场景1: 单接口
  445. interface iUser
  446. {
  447. // 接口常量
  448. const NATION = '中国';
  449. // 接口方法
  450. public static function write();
  451. // 构造方法(略)
  452. }
  453. // 工作类实现接口
  454. class User implements iUser
  455. {
  456. protected static $name = '胡八一';
  457. // 接口中的抽象方法,必须在工作类实现
  458. public static function write()
  459. {
  460. return self::$name . ' 的国籍是: ' . iUser::NATION;
  461. }
  462. }
  463. // 客户端
  464. // 接口常量的访问与类常量一样
  465. // echo iUser::NATION;
  466. echo User::write();

课程学习小结

正如老师上次作业评语所说的:编程, 看是学不会的, 必须动动手。利用五一假期的时间,对文件加载及类与对象基础相关内容进行了较为全面地复习,包括回看视频及讲义代码,对之前感觉比较生疏的内容加深了理解,虽然实践时时间紧,借助了老师的课堂案例,但还是尝试着逐个函数去实现一下,对自己动手少的缺点有所改进。完成相关练习后,特别是上课时感觉没怎么听懂的地方,又查询了手册和相关资料,搞清楚了来龙去脉,并对相关知识的脉络进行了思维导图式的梳理,感觉学有所获,值得进一步坚持。回顾四月一号以来的学习经历,我觉得自己每天都有进步,哪怕比较微小,也是值得肯定的,继续加油!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议