今天我们继续学习SPL的内容。本文内容比较简单的介绍了SPL中提供的一系列功能。其实在之前的很多文章中,我们已经接触到了SPL中提供的一些功能。这次我们将详细研究它。类信息相关函数类信息相关函数主要是查看一些类信息的函数,没有操作类功能的函数。类继承、接口、特性查看首先,我们来看一下。如果我们想得到当前类实现了哪个接口,那么直接使用一个class_implements()即可。interfaceA{}interfaceB{}classTestAimplementsA,B{}var_dump(class_implements(newTestA));//array(2){//["A"]=>//string(1)"A"//["B"]=>//string(1)"B"//}可以看到返回的是一个数组,里面显示的是我们当前类对象实现的接口名。如果我们查询的类没有实现任何接口,那么它返回一个空数组。var_dump(class_implements(newstdClass()));//array(0){//}同样,我们也可以查看一个类对象的父类。classC{}classTestBextendsC{}var_dump(class_parents(newTestB));//array(1){//["C"]=>//string(1)"C"//}虽然PHP是单继承语言,但使用class_parents()函数仍然返回一个数组。如果类对象没有父类,那么也返回一个空数组。classTestC{useD,E;}var_dump(class_uses(newTestC));//array(2){//["D"]=>//string(1)"D"//["E"]=>//string(1)"E"//}最后,我们还可以通过class_uses()函数获取当前类对象使用的trait信息。类hash和类ID做过Java开发的同学肯定都看到过,所有的类都会有一个hashCode()方法。Java中该方法的作用是返回一个对象的Hash码值。通常用于判断对象是否相等。在Java中,所有的类默认都继承自基类Object,而这个基类自带这个方法。但是在PHP中,类没有这种全局基类,自然也就没有这种方法了。显然,我们只能依靠其他扩展工具来帮助我们提供这样的能力。巧合的是,SPL中正好提供了这样一个功能。var_dump(spl_object_hash(newTestA));//字符串(32)"000000000ed109570000000025e36d74"$a=newTestA;var_dump(spl_object_hash($a));//字符串(32)"000000000ed109570000000025e36d74"(newTest_dump)(newTest_dump);//int(2)var_dump(spl_object_id($a));//int(1)spl_object_hash()函数用来获取一个对象的Hash值,它是一个完整的Hash值,不像Java的hashCode()方法返回一个数值。同一个类模板实例化的对象返回相同的内容。spl_object_id()返回对象的ID。对于不同的new,即实例化的对象,其结果是不同的。如果对象一直存在,它的ID值不会改变,如果对象被销毁,ID值也会被回收,交给其他对象使用。其实我们直接打印对象就可以看到ID值。var_dump($a);//object(TestA)#1(0){//}var_dump(newTestA);//object(TestA)#2(0){//}井号后面的数字是我们对象的ID值,就是spl_object_id()得到的。获取SPL库中所有可用的类信息此函数返回SPL库中所有可用的类名信息。var_dump(spl_classes());//array(55){//["AppendIterator"]=>//string(14)"AppendIterator"//["ArrayIterator"]=>//string(13)"ArrayIterator"//["ArrayObject"]=>//string(11)"ArrayObject"//["BadFunctionCallException"]=>//string(24)"BadFunctionCallException"//["BadMethodCallException"]=>//string(22)"BadMethodCallException"//["CachingIterator"]=>//string(15)"CachingIterator"//["CallbackFilterIterator"]=>//string(22)"CallbackFilterIterator"//["DirectoryIterator"]=>//string(17)"DirectoryIterator"//["DomainException"]=>//string(15)"DomainException"//["EmptyIterator"]=>//string(13)"EmptyIterator"//["FilesystemIterator"]=>//string(18)"FilesystemIterator"//["FilterIterator"]=>//string(14)"FilterIterator"//["GlobIterator"]=>//…………………………//……………………可以看到我们之前提到的很多类型的信息都可以在这里看到。迭代器相关函数迭代器相关函数其实在上一篇文章讲迭代器的时候就已经出现了,那就是非常好用的iterator_to_array()函数。$iterator=newArrayIterator(['a'=>'a1','b'=>'b1','c'=>'c1']);var_dump(iterator_to_array($iterator,true));//数组(3){//["a"]=>//字符串(2)"a1"//["b"]=>//字符串(2)"b1"//["c"]=>//string(2)"c1"//}我们可以想象,在这个函数内部,我们实际上是使用foreach()来遍历迭代器,并将所有的结果返回到一个数组中。这个函数还有第二个参数,它的作用是让键不使用原来的键值,而是使用默认的数组下标排列方式。var_dump(iterator_to_array($iterator,false));//array(3){//[0]=>//string(2)"a1"//[1]=>//string(2)"b1"//[2]=>//string(2)"c1"//}除了直接获取迭代器遍历的结果,我们还可以通过函数直接获取迭代器内部的元素个数。var_dump(iterator_count($iterator));//int(3)实际上是iterator_count()这个函数就像是count()函数的迭代器版本。函数printCaps($iterator){echostrtoupper($iterator->current()),PHP_EOL;returntrue;}iterator_apply($iterator,"printCaps",array($iterator));//A1//B1//C1最后一个iterator_apply()函数是让我们通过一个指定的回调函数来遍历一个迭代器。自动加载相关功能对于自动加载功能,我们在最早的一篇文章,也就是关于Composer的系列文章中已经接触到了。但是那个时候我们只是学习了一个spl_autoload_register()函数。今天我们再学习两个函数,不过先来看看spl_autoload_register()函数的使用。functionautoloadA($class){if(is_file('./autoloadA/'.$class.'.php')){require_once'./autoloadA/'.$类。'.php';}}spl_autoload_register('autoloadA');spl_autoload_register(function($class){if(is_file('./autoloadB/'.$class.'.php')){require_once'./autoloadB/'.$class.'.php';}});$sky=newSky();$sky->result();//这是天空PHP!$planet=newPlanet();$planet->result();//这是PHP星球!在这里的测试代码部分,我们通过回调函数和匿名函数注册了两个spl_autoload_register()。这样,当我们在当前文件中使用未定义的类时,就会在这两个autoloads中查找。我们之前讲Composer的时候说spl_autoload_register()比\_\_autolod()好,因为它维护了一个autoload列表,相当于多个\_\_autoload()的功能。我们可以看到我们通过另一个函数注册了多少个自动加载的函数。var_dump(spl_autoload_functions());//array(2){//[0]=>//string(9)"autoloadA"//[1]=>//object(Closure)#3(1){//["parameter"]=>//array(1){//["$class"]=>//string(10)"
