1.使用字符串可以作为字符的集合,每个字符都可以独立访问。只适用于单字节字符(字母、数字、半角标点符号),如中文等(utf8下,中文3字节表示)$str="abcd";echo$str[3];//decho$str{0};//a//另一种方法是使用str_split将所有字符拆分到一个数组中。$strArr=str_spilt($str);//同样不适合中文Array([0]=>a[1]=>b[2]=>c[3]=>d)functionmb_str_split($str){returnpreg_split('/(?blog[1]=>guest)2.转换类型通常我们知道在变量前加上(int),(string),(float)等即可用于显示转换。下面介绍一种,一种可以直接转为null的转换,.(unset)//转换为NULL$a='a';$a=(unset)$a;//此时$a为NULL//另一种方式$a='a';unset($a);dd($a);//ErrorPHPNotice:Undefinedvariable:aintest.phponline39Notice:Undefinedvariable:aintest.phponline393.issetandempty,is_null变量检测3.1isset检测变量If不存在,返回false;但需要注意的是变量本身是否为Null值,如果是,同样会返回false;如果不满意,它将返回true。为了更方便的检测变量是否存在,推荐使用array_key_exists来判断$a=null;$varExists=array_key_exists('a',get_defined_vars());if($varExists){echo'变量a存在';}3.2空,检测变量不存在,且每一个空值,0值为true,否则为false3.3is_null当参数满足以下三个条件时,is_null()会返回TRUE,否则为FALSE1,赋值为NULL2.没有赋值3.未定义,相当于unset()。一个变量unset()后,是不是没有定义?4.static的一些用法我们都知道static可以直接定义静态变量和静态方法。不管是调用静态变量还是静态方法,都可以用::来调用,如果是本类就用self去调用,如果是类外就用类名去调用,我就不深究了细节在这里,这些都是比较常见的。让我们谈谈不常见的。类中的静态延迟静态绑定;延迟静态绑定是指允许在静态继承的上下文中引用被调用的类。延迟绑定的意思是:static::不再是定义当前方法所在的类,而是实际运行时所在的类。(大致意思是子类继承父类后,在父类中使用了一个静态方法或变量,如static::A(),但是方法A在父类中不存在,而在类中存在子类,这样写是正确的,不会因为方法不存在而报错,因为static修饰的A在执行时会绑定到具体的子类,只要子类有这个方法即可)注:可以使用for(但不限于)静态方法调用。self::,代表这个类(当前代码所在的类)总是代表这个类,因为在类编译的时候就已经确定了。即子类调用父类的方法,但self不代表被调用的子类。parent::表示父类static::,表示本类(调用方法的类),用来指代继承范围内的静态调用类。在运行时,表示的类是确定的。static::不再解析为定义当前方法的类,而是在实际运行时计算。除了静态延迟绑定的简单用法外,还有一个前向调用,forward_static_call_array()(该函数只能在方法中调用)会转发调用信息(不过细说,类似本节第8点,PHP反射),概括的例子如下:classA{publicstaticfunctionfooStatic(){static::who();}publicstaticfunctionwho(){echo__CLASS__."aaa\n";}}classBextendsA{publicstaticfunctiontestStatic(){A::fooStatic();B::fooStatic();C::fooStatic();父母::fooStatic();自我::fooStatic();}publicstaticfunctionwho(){echo__CLASS__."bbb\n";}}classCextendsB{publicstaticfunctionwho(){echo__CLASS__."ccc\n";}}C::testStatic();一起来找答案吧:5.array_mergeand+,合并数组5.1array_merge合并两个或多个数组时,如果键名不是数字,会自动合并在一起,但如果有重复的键名,后面的将覆盖以前的。如果键名是数字,会根据前面数组的索引值,自动增加前面的索引值,用于后面的变化,也就是改变原来的键名。5.2+合并数组,使用+号合并数组,当键名相同时,保留第一个键名,即使键名是数字也不会重新排列。这个特性对于它起作用的一些业务场景是非常有用的。5.3array_push,只是把对应的值放在数组的末尾,会保留原来的结构,整体作为一个新的值,键名按照之前的递增。这个不同于array_merge5.4array_combine,两个参数,第一个参数,作为新数组的键,第二个参数作为新数组的值。不是给原来的数组增加新的值。所以其实它和上面三个函数是不一样的。光看名字很容易混淆。$a=['a','b','c'];$b=['5'=>'测试'];$c=[1,2,3];$arrayMerge=array_merge($a,$b);$arrayPlus=$a+$b;$arrayCombine=array_combine($a,$c);array_push($a,$b);//$arrayMergeArray([0]=>a[1]=>b[2]=>c[3]=>test)//$arrayPlusArray([0]=>a[1]=>b[2]=>c[5]=>test)//$arrayCombineArray([a]=>1[b]=>2[c]=>3)//array_pushArray([0]=>a[1]=>b[2]=>c[3]=>数组([5]=>测试))6。指针数组的内部指针:current/pos在不移动指针的情况下,返回内部指针当前指向的数组单元的值。key不移动指针,返回数组中当前单元的键名next将数组内部指针向前移动一位,返回移动后的当前单元的值。先移动,再取值。prev将数组内部指针后退一位,并返回移动后当前单元的值。先移动,再取值。end将数组内部指针指向最后一个元素并返回最后一个元素的值reset将数组内部指针指向第一个元素并返回第一个元素的值each返回当前键/值对arrayand将数组指针向前移动一步。返回的是由键和值组成的长度为4的数组。下标0和key代表key,下标1和value代表value。执行完each()后,数组指针会停留在数组的下一个单元或者命中数组末尾时停留在最后一个单元格。如果你想用each再次遍历数组,你必须使用reset()。1、以上指针操作函数,除key()外,若指针移出数组则返回false。key()被移除时返回null。2.如果指针非法,则不能进行next/prev操作,但可以进行reset/end操作。3.current/next/prev遇到空单元(0或"")也会返回false。每个都不会!list将数组中的值赋值给一些变量。list()是一种语言构造,而不是函数。只能用于数值索引数组,并假定数值索引从0开始/*可用于交换多个变量的值*/list($a,$b)=array($b,$a);示例:list($drink,,$power)=array('coffee','brown','caffeine');1.复制数组,它的指针位置也会被复制。特殊情况:如果数组指针无效,复制的数组指针会被重置,而原数组指针保持不变。【指针问题】谁先执行写操作,谁就开辟了新的值空间。变量(数组变量)值传递给谁并不重要。数组函数current()定义为写操作,所以会有问题。foreach遍历数组的一个副本,只有写入时才会开辟一个新的值空间。即只有在foreach循环体写入原数组时才会出现指针问题。如果分配新空间时指针无效,则初始化指针。2.如果指针位置有问题,可以通过初始化reset()来解决。7.序列化(serialization)#数据传输都是字符串类型#除了资源类型,都可以序列化#存储数据时,序列化会存储数据本身和数据类型作用:1.在网络中传输数据时;2.为了将一个数组或对象放到磁盘上#serializeserialize生成一个可存储的值表示字符串-适合在PHP中存储或传递值而不会丢失其类型和结构。#DeserializationunserializecreatesPHPvaluesfromstoredrepresentationsmixedunserialize(string$str[,string$callback])-对单个序列化变量进行操作,将其转换回PHP值。8、PHP反射有时我们需要使用一些语言特性来帮助我们完成任务,以便构建更好的代码结构和重用代码。例如,我们需要为我们的新仓库trinity_middle_service使用PHP。可以轻松分发自包含函数,例如call_user_func_array。用法如下:classOrder{publicfunctiongetBasicInfo($orderId,$write=false){}}$detailServiceInstance=newOrder();$functionName='getBasicInfo';$params[0]=1000001;//或者$params['orderId']=1000001$params[1]=true;//或者$params['write']=truecall_user_func_array([$detailServiceInstance,$functionName],$params);从上面的代码可以看出,call_user_func_array先来,第一个参数是一个数组,数组中下标0的值是一个类的实例,下标1的值是这个实例中存在的方法;第二个参数是对应函数需要的参数,是数组的形式,而call_user_func_array会自动按顺序对应每个参数,所以在这里,参数的顺序很重要。无论使用数字键名还是字符键名,都必须与函数的具体参数一一对应,才能正确实现函数的分配。8.1反射的应用使用call_user_func_array,我们可以很容易的实现分布,而且每个参数也很清楚。但是,如果我们需要更灵活的使用这个功能,还需要引入PHP的反射机制,比如PHP自带的ReflectionMethod类。我们可以通过这个类来直接获取一个类中具体方法的各种信息,比如参数个数,参数名称,是否有默认值等。代码如下:$object=newOrder();$functionName='getBasicInfo';$reflectionObj=new\ReflectionMethod($object,$functionName);//通过上面的代码后,可以直接通过$reflectionObj获取相关信息,如下$reflectionObj->isPublic();//可以判断该方法是否是public方法,还有isPrivate、isProtected、isStatic等$reflectionObj->getParameters();//可以获取方法的所有参数,是一个数组,foreach可以获取具体的参数foreach($reflectionObj->getParameters()as$arg){if(array_key_exists($arg->name,$params)){$callParams[$arg->name]=$params[$arg->name];}else{$paramVal=null;if($arg->isOptional()){//或者使用isDefaultValueAvailable检查是否有可用的默认值$paramVal=$arg->getDefaultValue();}$callParams[$arg->name]=$paramVal;}}具体参数:https://www.php.net/manual/zh/class.reflectionmethod.php和ReflectionClass可以得到一些类信息,用法类似的。8.2调用不存在的方法__call&__callStatic(魔术方法)当调用类中不存在或没有访问权限的方法时,会自动调用__call()方法。__call对应的静态方法的调用是__callStatic。通过PHP反射可以优化代码,可以针对一些特殊的基础业务功能,比如工单,trinity内部使用类似的方法。9.move_uploaded_file该函数是前端文件上传到后台后可能用到的函数。上传后,我们将通过$_FILES['file']'tmp_name'并使用move_uploaded_file($tmp_name,$savePath);数据库中的文件如:/tmp/phpwTJzUw被移走,导致以下代码使用$_FILES全局变量时会出现找不到文件的问题。10.引用传递在使用array_pop等函数时,array_pop的参数是通过引用传递的。编码过程中,有时参数直接写成函数返回值,5.3之后不允许,会报致命错误(严格模式Down)。您将看到:PHPStrictStandards:Onlyvariablesshouldbebyreferencein-online3严格标准:Onlyvariablesshouldbepassedbyreferencein-online3d以上来自:https://www.php.net/manual/en/function.array-pop.php通过引用传递参数的函数在通过值调用时改变了它们的行为。以前按值接受参数的函数现在将抛出致命错误。以前任何期望通过引用传递但被调用时传递常量或文字值的函数都需要在调用之前将值分配给变量。以上来自:PHP手册附录PortingfromPHP5.2.xtoPHP5.3.xsectionhttps://www.php.net/manual/zh/migration53.incompatible.php而实际上看起来并没有错,只是放即函数返回值赋值给一个变量,然后将该变量作为参数传入。比如在代码中经常写成:error_reporting(E_STRICT);$testArr=['a','b','c','c','d'];$popValue=array_pop(array_unique($testArr));//以上代码会报错,必须使用$testArr=['a','b','c','c','d'];$testArr=array_unique($testArr)$popValue=array_pop($测试Arr);
