原文: https://blog.csdn.net/xyz_dream/article/details/71320337
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()
{
}
}
?>
代码这样定义一个类会不会成功? 答案是否定的。 类的定义要在一块代码段进行完整定义 不能跨代码段。