php基础语法之魔术方法.docx
《php基础语法之魔术方法.docx》由会员分享,可在线阅读,更多相关《php基础语法之魔术方法.docx(13页珍藏版)》请在冰豆网上搜索。
php基础语法之魔术方法
魔术方法,magicmethod
在特定的情况下,会被自动调用的方法,通常负责完成某块独立的功能的方法称之为魔术方法!
特点:
1,需要用户脚本定义,不定义不执行!
2,命名方式都是以__开头!
总结:
__construct
__destruct
__sleep
__wakeup
__set
__get
__isset
__unset
__clone
__call
__callStatic
__autoload()//魔术函数
__invoke()
将一个对象,当作函数调用时,会触发该对象的__invoke()方法,由此方法,就可以调用,没有该方法就不能调用!
回想匿名函数
$say中是啥?
对象!
语法是调用对象的语法?
为什么,匿名函数对象(ClosureL类对象)可以,但是普通类对象不行?
__invoke是php实现匿名函数不可或缺的部分!
此时,也可以传递参数,为对象传递参数,就是为invoke魔术方法传递参数!
__toString()
转换到字符串的意思!
当将对象当作字符串使用时,会自动调用该对象的魔术方法!
如果此时,存在toString魔术方法,即可以完成转换。
toString的返回值,就是转换的结果,一般转换对象的标志性的属性即可!
静态延迟绑定,static
>=5.3
问题:
1,$this永远代表所在类的对象?
不是
2,self用于代表所在类么?
是,永远代表所在类的对象!
看逻辑:
显然,当前的逻辑不是十分完善!
此时,应该是表示当前类的关键字,最好应该在调用时决定最好!
(self不能做到)
此时,采用一个新的关键字,代表当前类,与self不同,在于是运行时调用时决定,而不是在类编译时就确定好了的!
关键字是:
static。
总结:
static关键字的功能:
1,声明静态局部变量
2,声明静态成员
3,当前类,运行时的当前类!
类中,可以表示类的关键字:
self,所在类
static,调用类
parent,父类
参数类型约束
约束函数,或者方法类参数的类型,只能是某个类的对象!
php是弱类型,变量可以存储任意类型的数据!
函数,方法的参数也是可以接受任意类型!
但是参数,可以被规定为,某个类的固定对象!
在参数前增加类名即可!
注意,只支持类名!
还支持数组!
对象的遍历
对象是一个集合数据类型!
简单的遍历,foreach
foreach,可以遍历对象
遍历对象,是依次获得对象拥有的属性的信息!
留意,访问修饰可以影响!
自定义遍历,iterator,迭代器接口
场景:
在遍历班级时,就相当于,遍历的班级的所有学生,而不不是遍历班级的所有属性!
此时,需要使用接口编程实现。
foreach时,php回去判断当前所遍历的对象的类,是否类实现一个叫iterator(迭代器)接口!
不是的话,就会依次得到对象每个属性!
(简单遍历)
是的话,会在foreach执行时,通过调用接口内规定的各个方法来完成这个遍历!
两个问题:
foreach的流程:
Iterator接口的内容:
预定义的!
php定义好了的!
显然,php的foreach的五个重要的步骤,依赖于接口中定义的5个方法!
编程实现,是需要遍历学生信息:
1,类要实现Iterator接口
2依次完善抽象方法
常用的对象,类函数
is_object();
class_exists();
interface_exists();
get_class();
get_parent_class();
get_class_vars();得到类的变量(属性)
get_class_methods();得到类的方法
get_declared_classes();得到所有已经定义的类!
可以见,有自定义类,和预定义类!
stdClass,内置的标准类!
__PHP_Incomplete_Class
Closure
魔术常量
__CLASS__,当前类名。
注意:
可以newself不可以new__CLASS__。
__METHOD__,当前方法名。
区别__FUNCTION__。
__FILE__
__DIR__
__LINE__
__FUNCTION__
面向对象的特征
封装,
继承
多态
快速排序
分治。
分而治之!
核心思想:
解决一个难度为N的问题,与解决2个难度为N/2相比!
冒泡解决6个元素的问题?
需要比较几次?
5,4,3,2,1=15
冒泡3个元素的问题两次?
2,1=3
2,1=3
思路:
将整体的待排序序列,分割成两个部分!
分割的原则,跳出一个参考元,将比参考元大的,放一起,比参考元小的放在一起!
假设第一个为参考元!
接下,再对,分割的两个子序列,再次分割!
直到所有的分割的待排序序列内,元素数量为一个或者0个!
实现的时候,应该注意:
1,选择参考元的问题。
编程实现:
递归实现!
递归点:
递归出口:
待排序的序列元素个数为1或者0,则不需要再递归了!
步骤:
1,判断是否是需要再次递归(递归出口)
2,选择参考元(第一个元素)
3,将数组分割成两个部分。
4,递归对分割的两个部分进行分别排序
5,将小于与参考元与大于三个部分合并起来!