文件包含的本质与应用

本质:将目录文件复制到当前位置

include

  1. include __DIR__ . '/inc/f1.php';
  2. // $username = '猪老师'; //这是f1.php里面的内容
  3. // 被包含文件共享作用域
  4. echo $username . '<br>';//输出 猪老师
  5. // echo $email . '<br>';
  6. $email = include __DIR__ . '/inc/f1.php';
  7. // 引用的f1.php文件里可以直接用return,这样引用的文件就有返回值
  8. echo $email . '<hr>';

require

  1. //require也可以引用
  2. require __DIR__ . '/inc/f1.php';
  3. echo $username . '<br>';
  4. $email = require __DIR__ . '/inc/f1.php';
  5. echo $email . '<br>';

include,require区别

  • 区别1

    • include: 用到时再加载, 动态
    • require: 应该写到顶部, 静态
  • 区别2

    • include: 加载失败,继续执行不中断
    • requrie: 加载失败,中断退出
  1. //使用include ,如果文件不存在则会继续运行下面的代码
  2. // include __DIR__ . '/inc/hello.php';
  3. @include __DIR__ . '/inc/hello.php'; //前面加@可以屏蔽调错误提示
  4. echo 'include后面的代码' . '<br>';
  5. //使用require,若是文件不存在则不会机械执行下面的代码
  6. require __DIR__ . '/inc/hello.php';
  7. echo 'require后面的代码' . '<br>';

使用include_once或require_once,代表只包含一次

  1. include_once __DIR__ . '/inc/f1.php';
  2. require_once __DIR__ . '/inc/f1.php';

文件模板

  1. <?php require __DIR__ . '/inc/header.php' ?>
  2. <!-- 主体 -->
  3. <main>
  4. <ul>
  5. <li><a href="">最新文章1</a></li>
  6. <li><a href="">最新文章2</a></li>
  7. <li><a href="">最新文章3</a></li>
  8. <li><a href="">最新文章4</a></li>
  9. <li><a href="">最新文章5</a></li>
  10. <li><a href="">最新文章6</a></li>
  11. <li><a href="">最新文章7</a></li>
  12. <li><a href="">最新文章8</a></li>
  13. <li><a href="">最新文章9</a></li>
  14. <li><a href="">最新文章10</a></li>
  15. </ul>
  16. </main>
  17. <?php require __DIR__ . '/inc/footer.php' ?>

类与对象

将一组相关的变量和函数进行组合,形成一个新的编码单元,来简化代码,实现”代码复用”

对象 = 变量 + 函数

PHP对象是基于”类”,类是对象的模板

  1. class A
  2. {
  3. }
  4. new A;

类与实例

类声明
  1. class Goods
  2. {
  3. // ...
  4. }
类的实例化:创建对象的过程,new
  1. $goods = new Goods;
  2. var_dump($goods);
  3. // 车: class
  4. // 轿车: obj
  5. echo '<hr>';
  6. echo get_class($goods) . '<br>';//返回对象的类名
  7. // 动态类
  8. $str = 'goods';
  9. // 大驼峰/帕斯卡 ucfirst()将字符串的首字母转换为大写
  10. $class = ucfirst('goods'); //
  11. // echo $class;
  12. $o = new $class;
  13. var_dump($o);
  14. var_dump($o instanceof Goods);

类成员

  1. 常规成员

    1. 属性:可以被其他方法所共享
    2. 方法:自定义方法和 魔术方法两种方法
  2. 访问限制符

    1. private:私有,仅限在当前类中使用
    2. protected:继承,可在本类或子类中使用,不对外公开
    3. public:公共,默认
  3. 静态成员

    1. static,静态属性,静态方法
    2. 与类实例无关,静态成员,不要用$this
    3. 内部用self,外部用类名
常规成员和访问限制符
  1. class User1
  2. {
  3. // 常规成员
  4. // 1. 属性
  5. // 语法: 访问限制符 类成员声明
  6. // 声明为私有, 实现封装
  7. private $username;
  8. // 2. 方法
  9. // 2.1 自定义方法: 用户自己声明自己调用
  10. public function getUsername()
  11. {
  12. // -> 对象成员访问符
  13. // 当前实例的引用, $this 与实例绑定的
  14. return $this->username;
  15. }
  16. // 2.2 魔术方法: 由系统来调用,用户不能直接调用
  17. // 构造方法: 实例化进自动调用
  18. // 名字固定__construct
  19. public function __construct(string $username)
  20. {
  21. $this->username = $username;
  22. }
  23. }
  24. // 实例化
  25. $user1 = new User1('张老师');
  26. echo $user1->getUsername();
  27. echo '<hr>';
静态方法
  1. class User2
  2. {
  3. // 静态属性
  4. private static $username = 'admin';
  5. // 类常量: 与实例无关,用类访问
  6. const APP = '商城';
  7. // 方法
  8. public static function getUsername()
  9. {
  10. // self: 功能与$this类似, 与当前类 User2 绑定
  11. return self::$username;
  12. }
  13. }
  14. // 实例访问静态方法是一个兼容bug, 能成功,但不要再用了
  15. echo (new User2)->getUsername();
  16. // 应该永远用类来访问静态成员
  17. echo User2::getUsername();
  18. echo User2::APP; //类常量

类的扩展/抽象/最终

  1. protected:受保护/可继承
  2. extends:扩展/继承,类的继承扩展
  3. parent:父类引用
  4. abstract:抽象
  5. final:最终类
父类/基类/超类 protected 声明成员可被继承
  1. class Person
  2. {
  3. // protected: 成员可继承,可以在子类中使用
  4. protected $name;
  5. // private: 私有, 仅限当前类, 子类,外部都不可见
  6. private $id = 12345;
  7. // public: 类中,子类, 类外都可见
  8. public function __construct($name)
  9. {
  10. $this->name = $name;
  11. }
  12. // getInfo::protected
  13. // 比protected再严格的是 private, 比它更宽松的是: public
  14. protected function getInfo()
  15. {
  16. return $this->name;
  17. }
  18. }
子类/学生类
  1. //Stu 是 Person 的子类,可以通过protected继承一些东西
  2. class Stu extends Person
  3. {
  4. // 1. 属性扩展
  5. private $lesson;
  6. private $score;
  7. // 2. 方法扩展/重写
  8. public function __construct($name, $lesson, $score)
  9. {
  10. // 引用了父类的构造方法
  11. // parent: 父类引用 Person
  12. parent::__construct($name);
  13. $this->lesson = $lesson;
  14. $this->score = $score;
  15. }
  16. public function getInfo()
  17. {
  18. // $this->name
  19. // return $this->name . "同学, ($this->lesson : $this->score 分)";
  20. return parent::getInfo() . "同学, ($this->lesson : $this->score 分)";
  21. }
  22. }
  23. $stu = new Stu('小狗', 'PHP', 88);
  24. echo $stu->getInfo();
  25. echo '<hr>';
  26. $person = new Person('小猪');
  27. // var_dump只打印属性
  28. var_dump($person);
  29. echo '<hr>';
extends类的继承/扩展
  1. abstract class Demo1
  2. {
  3. }
  4. // Demo2的类继承Demo1的类
  5. class Demo2 extends Demo1
  6. {
  7. }
  8. echo 'Demo2的父类是: ' . get_parent_class(new Demo2);
  9. echo '<hr>';
abstract 抽象类不想让用户直接使用父类,必须通过继承子类来间接使用
  1. 通过abstract将父类声明为一个抽象类

    1. abstract class Demo3
    2. {
    3. // 抽象方法: 只有方法名,参数列表,没有具体实现(大括号)
    4. abstract protected function hello($name);
    5. }
  2. 通过继承类来实现父类成员的调用

    1. class Demo4 extends Demo3
    2. {
    3. // 工作类Demo4中必须实现父类中的抽象成员
    4. public function hello($name)
    5. {
    6. return 'Hello , ' . $name;
    7. }
    8. }
    9. //调用 Demo4 里面的方法
    10. echo call_user_func([new Demo4, 'hello'], '牛老师');
    11. echo '<hr>';
final:最终类防止类被继承,可声明为最终类

如果一个类不用扩展,直接当成工作类/直接干活的,直接new的情况下用最终类final

  1. //使用final来声明最终类
  2. final class Demo5
  3. {
  4. }
  5. //声明最终类以后,就不能被继承,所以下面的代码会报错
  6. class Demo6 extends Demo5
  7. {
  8. }

接口:大号的抽象类

接口的所有成员,必须是抽象

interface: 声明接口
  1. interface iUser
  2. {
  3. // 1. 类常量
  4. const NATION = 'CHINA';
  5. // 2. 必须是抽象,必须是public
  6. public function m1();
  7. public function m2();
  8. // 官方手册: 不建议声明抽象构造方法
  9. }
implements: 实现接口

接口不能直接用,要用一个类来实现它

  1. 用普通类来实现一个接口,必须将接口中的所有抽象方法全部实现

    1. class Demo1 implements iUser
    2. {
    3. //普通类来实现接口,必须两个都实现
    4. public function m1()
    5. {
    6. }
    7. public function m2()
    8. {
    9. }
    10. }
  2. 用抽象类来实现一个接口,允许有不实现的抽象成员

    1. abstract class Demo2 implements iUser
    2. {
    3. //使用抽象类来实现接口,允许有不实现的
    4. public function m1()
    5. {
    6. }
    7. }
  3. php默认只支持单继承,可通过接口,间接实现多继承

    1. //声明3个接口
    2. interface A
    3. {
    4. }
    5. interface B
    6. {
    7. }
    8. interface C
    9. {
    10. }
    11. //通过接口,间接实现三个继承
    12. class Test implements A, B, C
    13. {
    14. }
    15. // 查看当前类实现的所有接口
    16. $arr = class_implements('Test');
    17. printf('<pre>%s</pre>', print_r($arr, true));

总结

  1. 文件的包含:include和require
  2. 类声明用class,实例用new
  3. 类成员

    1. 常规成员,用实例来访问,用$this来内部引用
    2. 静态成员,用类来访问,用self来内部引用
  4. 类的扩展/抽象/最终

    1. protected来声明成员可被继承,可扩展
    2. extends来声明继承类
    3. 在子类中用parent来引用父类里面的成员
    4. abstract来声明抽象类,在类不允许直接使用,只允许通过子类来访问的情况下用抽象类
    5. final来声明最终类,在类不允许被继承的情况下用最终类
  5. 接口,抽象类的升级版

    1. 接口中的所有成员,必须都是抽象的,必须是public
    2. interface: 声明接口
    3. implements: 实现接口

      1. 用普通类来实现接口,必须将接口中的所有抽象方法全部实现,可以直接干活使用
      2. 用抽象类来实现接口,允许有不实现的抽象成员(可以只实现部分,或者不实现)

更多相关文章

  1. Android(安卓)Parcelable接口
  2. Android(安卓)MediaPlayer的核心原理
  3. Android音乐播放器(一):搜索手机存储的音乐
  4. Android(安卓)AIDL进程IPC通信 一次就好
  5. Android之Adapter:连接后端数据和前端显示的适配器接口
  6. Android高级应用2----ContentProvider(访问手机短信和通讯录数据)
  7. Android中各种JAVA包的功能描述
  8. Android的按钮监听事件&自定义回调函数
  9. Android使用回调接口

随机推荐

  1. Android 上如何移植live555生成库文件
  2. android总结之android初识
  3. Android UI系列
  4. android 屏幕适配
  5. Android真的很火吗?
  6. Android(Xamarin)之旅(五)
  7. Android动画设计第3弹
  8. Android基础备忘(android中的分享功能)
  9. Android的BUG - 广为人知的诟病:频繁重启
  10. android makefile(转载)