Blogger Information
Blog 26
fans 0
comment 0
visits 21813
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
文件加载及类与对象基础
溪边小树
Original
479 people have browsed it

文件加载

[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();

课程学习小结

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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:学习要纵向对比, 工作要横向对比.... 纵向对比是与自己的昨天, 横向对比是今天,因为不努力会失业的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post