php最基础的东西,面试必备<2>

              php扎实基础知识和面试必备。继续讲解


              五.  后++  在函数局部规则


                 

<?php

   function fun()
   {
        $var=0;

        return  $var++;
 
   }

    $get = fun();

    var_dump($get);   //输出    0   



?>
                  这个应该不是很诡异的事情,但是还是有人会误解!以为会输出  1     ,其实不然。     毕竟$var++之后就没有再次出现使用$var的场景,也就是此时$var还是0.   那是因 为$var是局部变量的原因。

                  看下面代码:


 $var2 = 1;
    function get_value(){
        global $var2;
        
        return $var2++;
    }
    get_value();
 
    echo $var2;  //输出2   

                   哈哈,又和上面不一样了。  怎么回事?   因为 $var2在fun中定义为global了   全局变量 ,    第一次进去肯定是  1  之后++  

,     到echo 是第二次使用这个变量$var2,自然变成了2. 看见没有,以为很简单的东西,到底是我们真正地理解了吗?


              六.  Object作为形参传入函数

    

<?php
 
    class  Dog
   {
        public  $name;

       public  function  __construct($name)
      {
            $this->name=$name;
      }

       public  function show()
      {
             echo "name=>".$this->name;
       }
   }

     function   change_name(Dog  $dog)   //改变dog的名字
    {
               $dog->name="change  name";    var_dump($dog);   //观察对象标识符
    }

    $dog=new Dog("小黄");    var_dump($dog);  //观察对象标识符

    $dog->show();  //显示   name=>小黄

    change_name($dog);   //调用更改名字函数

    $dog->show();    //显示   name=>change name


?>

                        $dog经过函数的调用,确实改变了!  奇怪  ,这不是形参的局部变量吗?  什么鬼?    上结果图:


                     看见输出结果没有,      连个输出$dog的对象标识符(不懂这一块可以上

网查询,也可看看我的一篇博文有讲对象拷贝原理)都是一致的,说明什么。说明传递对象过去传递的是引用过去,也就是实际操作了这块内存空间。所以$dog->name得以改变也就不足为奇了。


                     总结:      除了Object类型是默认传引用以外,其它函数形参都是默认传值的形式     。


              七. 递归遍历目录下所有文件

 

                  递归遍历一个目录下所有文件,网上有很多解决方案。但是大多数都是递归,反复使用面向过程的方法。   个人对面向对象

比较喜欢,面向过程和面向对象没有谁厉害和谁差的这个一个比较。只能说看谁更合适什么样的场景去使用。 php提供面向对象的

方式直接对目录遍历做了封装,我们何必还要自己造轮子?直接上代码,仅需4行代码即可!

                 

<?php

$data=new RecursiveDirectoryIterator(".\Public");

foreach (new RecursiveIteratorIterator($data) as $file)
{
    if($file->getFileName()!='.' && $file->getFileName()!='..')
        echo $file->getPathName()."<br/>";

}

                   是不是很牛逼!   实现Iterator接口的操作目录和文件的类很强大,  4行代码解决你递归问题,不必去写什么opendir,scandir

显得比较复杂。面试问你这个遍历一个目录下说要所有文件,4行代码绝对让面试官感觉你小伙子不错。不想偷懒的程序员不是好程

序员,能用最简单的代码写出比别人复杂的代码出一样的效果才是真正的高手。


            八.   对于路径  upload/up.image.jpeg       用5种方式提取出   .jpeg文件扩展名 

             

                  1.很容易想到的方法,从最后一个点截取到最后所形成的字符串  .jpeg     strrstr($str,".")     

                  

                   

     function fun1($str)
     {

         return strrchr($str,'.');
     }
                  2.   把字符串翻转过来,然后去第一个点之前的所有字符串,再翻转       strrev()    strstr($str," ."  ,true)    第三个参数取之前的字符串,用点连接即可


function  fun2($str)
{
    $str=strrev($str);
    $str=strstr($str,".",true);
    $str=strrev($str);
    return ".".$str;
}

                    3.  找到点最后所处位置   再substr

 function fun3($str)
   {
       $index=strrpos($str,".");
       $str=substr($str,$index);
       return $str;
   }

                   4.   使用pathinfo()函数处理

             

function fun4($str)
    {

        return ".".pathinfo($str,PATHINFO_EXTENSION);
    }

                 5.   使用explode切割为数组,然后取最后一个元素就是 jpeg   加上点就行

        

function fun5($str)
   {

       $array=explode(".",$str);

       return ".".array_pop($array);
   }

         九.   常见一个url,怎么提取参数为键值对放入数组。例如   http://www.baidu.com/index.php?name=zhangsan&id=20&gender=male

                    

                      首先对于url操作想到  parse_url($url)    取出query    再分割 &为数组  然后再分割=  再操作     太麻烦!    直接两步搞定

 $url=" http://www.baidu.com/index.php?name=zhangsan&id=20&gender=male";

  $data=parse_url($url,PHP_URL_QUERY);   //取到name=zhangsan&id=20&gender=male

  parse_str($data,$get);                  //此时$get就是获取到的结果数组     $key=>value   
                   网络上说能动手就别BB,这个是能有内置函数搞定就别写多余的代码。      建议大家多看看URL字符串的处理函数,也不是很多


         十. 一个看起来不是问题的问题

            

<?php

     class  Dog{
?>

<?php

    public function  hello()
   {

   } 
  }


    
?>

         代码这样定义一个类会不会成功?    答案是否定的。       类的定义要在一块代码段进行完整定义 不能跨代码段。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GEEK JUMP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值