博客列表 >0812-文件引用及作用域、类(对象)

0812-文件引用及作用域、类(对象)

三九三伏
三九三伏原创
2022年08月29日 19:52:31491浏览

一、include和require

两者用法相同,区别在于出错处理,include出错后可继续向下执行,require出错后终止执行。
包含的文件与当前脚本共用同一个作用域

二、类与对象

常用关键字和操作

对象是一个容器,是全局成员的一个前缀。
类:全局成员,声明,class,大驼峰UserName,PascalName

  1. // 类声明 class
  2. class Goods
  3. {
  4. }
  5. // 类的实例化->对象 new
  6. $goods = new Goods();
  7. // 实例总是与一个类绑定。
  8. var_dump($goods instanceof Goods);
  9. echo '<hr>';
  10. echo get_class($goods).'<br>';
  11. // 动态类
  12. // 控制器就是一个动态类,控制器名称出现在url
  13. $controller = $goods;
  14. $obj = new $controller();
  15. var_dump($obj);

  1. /**
  2. * 类成员
  3. * 1. 实例成员:用对象访问,内部用$this->属性
  4. * 2. 静态成员:static定义,用类访问,内部用self::$静态属性名
  5. */
  6. class User1 {
  7. //实例成员
  8. // 默认:公有成员public
  9. public $username = '路人甲';
  10. // 私有:只能在当前类使用
  11. private $salary = 60000;
  12. //方法:函数语法
  13. public function getSalary(){
  14. $user = new User1();
  15. return $user->salary;
  16. }
  17. }
  18. // 实例化
  19. $user1 = new User1();
  20. echo $user1->username.'<br>';
  21. //私有变量只能内部使用,外部直接使用会报错。
  22. // echo $user1->salary.'<br>';
  23. echo $user1->getSalary();

以上代码如果改动User1这个名字,通用性会受影响,因此this派上用场了。

  1. class User1 {
  2. ...
  3. //方法:函数语法
  4. public function getSalary(){
  5. // 缺乏通用性不建议
  6. // $user = new User1();
  7. // return $user->salary;
  8. // 使用this更通用
  9. return $this->salary;
  10. }
  11. }
  12. ...

魔术方法

类里面采用双下划线开始的函数,只有使用权没有定义权。

  1. // 获取类中任意私有属性,属性获取器。
  2. class User1 {
  3. //实例成员
  4. // 默认:公有成员public
  5. public $username = '路人乙';
  6. // 私有:只能在当前类使用
  7. private $salary = 100000;
  8. // 区别身份
  9. public $role = '老婆';
  10. // 获取器
  11. public function __get($name) {
  12. // 访问工资时,少报1000
  13. if($this->role == '老婆')
  14. return $this->$name - 1000;
  15. return $this->$name;
  16. }
  17. // 设置器
  18. public function __set($name, $value){
  19. $this->$name = $value;
  20. }
  21. // __get,__set拦截非法请求
  22. }
  23. // 实例化
  24. $user1 = new User1();
  25. echo $user1->username.'<br>';
  26. //通过属性获取器直接访问私有变量。
  27. echo $user1->salary.'<br>';
  28. //通过属性设置器直接设置私有变量。
  29. $user1->salary = 2000000;
  30. echo $user1->salary.'<br>';

构造方法

  1. class User {
  2. public $username;
  3. public $role;
  4. private $salary;
  5. private $age;
  6. // 当前类实例状态(属性值)应该有用户决定。
  7. // 构造方法派上用场,实例化时自动触发。
  8. public function __construct($username, $role, $salary, $age)
  9. {
  10. $this->username = $username;
  11. $this->role = $role;
  12. $this->salary =$salary;
  13. $this->age = $age;
  14. }
  15. }
  16. $user1 = new User('路人甲', '会计', 15000, 30);
  17. $user2 = new User('路人乙', '销售', 10000, 32);
  18. echo $user1->username.'<br>';
  19. echo $user2->username.'<br>';

静态成员

被所有对象共享

  1. class User {
  2. public $username;
  3. public $role;
  4. private $salary;
  5. private $age;
  6. // 当前类实例状态(属性值)应该有用户决定。
  7. // 构造方法派上用场,实例化时自动触发。
  8. public function __construct($username, $role, $salary, $age, $nation = '中国')
  9. {
  10. $this->username = $username;
  11. $this->role = $role;
  12. $this->salary =$salary;
  13. $this->age = $age;
  14. // 初始化静态属性
  15. self::$nation = $nation;
  16. }
  17. // 静态属性,不写死,在构造函数里初始化。
  18. public static $nation;
  19. // 静态方法访问静态属性
  20. public static function hello() {
  21. // 在类中要使用self引用当前类
  22. // return 'Hello,'. User::$nation;
  23. return 'Hello,'. self::$nation;
  24. }
  25. }
  26. $user1 = new User('路人甲', '会计', 15000, 30);
  27. echo $user1->username.'<br>';
  28. // 类外部访问静态变量
  29. echo User::$nation.'<br>';
  30. // 调用静态方法
  31. echo User::hello().'<br>';
  32. $user2 = new User('路人乙', '销售', 10000, 32, '泰国');
  33. echo $user2->username.'<br>';
  34. echo User::$nation.'<br>';

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