博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php之基础深入---类与对象篇
阅读量:5263 次
发布时间:2019-06-14

本文共 3745 字,大约阅读时间需要 12 分钟。

1、类的自动加载: spl_autoload_register()函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载,这样可以避免include一大堆文件。

比如你有一个(甚至很多个)需要引用的类文件Example.php,它是这样子的

你还有一个父文件,或者父类,或者说是公共文件,总之是你必须要用到的文件,它是这样子的

当然,这只是最简单的例子,但是当需要引用的类文件比较多的时候,就很能体现出spl_autoload_register()的价值与灵活性了。

2、代码的复用:trait定义和class相似,但是无法实例化自身,通常用use来实现代码复用,相当于把trait的内容复制到use的地方,use多个trait类时用逗号隔开

say();

从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

say(); //输出"hello",trait类A覆盖了父类B的相同方法$obj->listen(); //输出"boom",当前类C覆盖了trait类A的相同方法

3、匿名类的创建和使用:PHP 7 开始支持匿名类。 匿名类可以创建一次性的简单对象,可以传递参数到匿名类的构造器,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用 trait,

num = $num; } use SomeTrait;});/* *以上代码会输出: *object(class@anonymous)#1 (1) { *["Command line code0x104c5b612":"class@anonymous":private]=> *int(10) * } */

4、重载overloading:当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用,所有的重载方法都必须被声明为 public,这些魔术方法的参数都不能通过引用传递

属性重载

data[$name]=$value; } //读取不可访问属性的值时,__get() 会被调用 public function __get($name) { if (array_key_exists($name, $this->data)) { return $this->data[$name]; }else{ return "Undefined property ".$name; } } //当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用 public function __isset($name) { return isset($this->data[$name]); } //当对不可访问属性调用 unset() 时,__unset() 会被调用 public function __unset($name){ echo $name."has unset."; unset($this->data[$name]); } //调用存在的属性 public function getName(){ return $this->name; }}$obj=new A();echo $obj->getName(); //输出"zhylioooo"echo $obj->age; //输出"Undefined property age"var_dump(isset($obj->age)); //输出 ...03.php:34:boolean falseunset($obj->age); //输出"age has unset"$obj->age=24;echo $obj->age; //输出24

方法重载

say1(); } public static function __callStatic($name, $arguments){ echo "call the static method ".$name; self::say2(); }}$obj=new A();$obj->say1(); //输出call the say1:helloA::say2(); //输出call the static method say2world

 5、魔术方法:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法,包括

  • __construct(),类的构造函数(类实例化时自动调用)
  • __destruct(),类的析构函数(销毁一个类之前调用)
  • __call(),在对象中调用一个不可访问方法时调用
  • __callStatic(),用静态方式中调用一个不可访问方法时调用
  • __get(),获得一个类的成员变量时调用
  • __set(),设置一个类的成员变量时调用
  • __isset(),当对不可访问属性调用isset()或empty()时调用
  • __unset(),当对不可访问属性调用unset()时被调用。
  • __sleep(),执行serialize()时,先会调用这个函数
  • __wakeup(),执行unserialize()时,先会调用这个函数
  • __toString(),类被当成字符串时的回应方法
  • __invoke(),调用函数的方式调用一个对象时的回应方法
  • __set_state(),调用var_export()导出类时,此静态方法会被调用(var_export和var_dump类似)
  • __clone(),当对象复制完成时调用
  • __autoload(),尝试加载未定义的类(建议使用spl_autoload_register())
  • __debugInfo(),打印所需调试信息 

其中__sleep和__wakeup

int 1 1 => int 2 2 => int 3 * */
name=$name; $this->pswd=$pswd; $this->login(); } public function login(){ echo "hello ".$this->name."!your pswd is ".$this->pswd; } public function __sleep() { return array("name","pswd"); } public function __wakeup() { $this->login(); }}$obj=new A("zhylioooo","123456"); //输出hello zhylioooo!your pswd is 123456$str=serialize($obj);unserialize($str); //再次输出hello zhylioooo!your pswd is 123456/**序列化操作对象时,__sleep()用于提交未提交的数据,即保持对象现场状态*__wakeup()则是恢复现场 */

6、  类与对象的几个重要函数和关键字

class_exists() 判断某个类是否存在interface_exists() 判断接口是否存在class_implements() 返回指定类实现的所有接口class_parents() 返回指定类的父类get_class() __CLASS__ 获取某个对象所处的类名get_parent_class() 获取某个对象所属父类的类名get_class_methods() 获取一个类所有方法,返回索引数组get_class_vars() 获取一个类所有属性,下标为属性名get_declared_classes() 获取所有声明过的类(包括系统类)is_object() 判断是否对象get_object_vars() 获得对象所有属性,返回数组,下标为属性名property_exists() 判断对象中是否存在该属性get_called_class() 获取当前主调类的类名(最初调用的类)this 是指向当前对象的指针(姑且用C里面的指针来看吧)self 是指向当前类的指针parent 是指向父类的指针static 是指向最初调用的类

 

转载于:https://www.cnblogs.com/zhylioooo/p/7922144.html

你可能感兴趣的文章
Exchange超级实用命令行
查看>>
Git
查看>>
面向对象学习
查看>>
C语言中操作符详解
查看>>
Flexbox指南
查看>>
html和body的关系
查看>>
codevs1052 地鼠游戏
查看>>
Codeforces 442B. Andrey and Problem
查看>>
ADS--图像缩放与剪裁(只是完成了前台的功能,传送数据到后台的功能待完成)...
查看>>
android 之HttpURLConnection的post,get方式请求数据
查看>>
密码保护
查看>>
JS解析,格式化日期
查看>>
php json_decode 后,数字转换成了 科学计数法 的解决方案
查看>>
python学习笔记:第9天 函数初步
查看>>
VCenter克隆虚拟机报错msg.snapshot.error-QUIESCINGERROR
查看>>
phonegap3.4.0安装
查看>>
yolov3应该什么时候停止训练?
查看>>
安装Nginx
查看>>
HTML5(基础09-06)
查看>>
PAT A1020 Tree Traversals (25 分)——建树,层序遍历
查看>>