php小知识点
1. 注意echo和print的区别
PHP中echo和print都是输出的作用,但是两者之间还是有细微的差别。echo输出后没有返回值,但print有返回值,当其执行失败时返回flase。因此可以作为一个普通函数来使用,例如执行$r = print "Hello World"; 变量$r的值将为1。而且代码中echo语句的运行效率要略快于print语句。
2. php 常用的判断变量的函数有下列几个
gettype()、is_array()、is_bool()、is_float()、is_integer()、is_null()、is_numeric()、is_object()、is_resource()、is_scalar() 和 is_string()
gettype() 会根据 参数类型返回下列值
“boolean”(从 PHP 4 起)
“integer”
“double”(如果是 float 则返回“double”,而不是“float”)
“string”
“array”
“object”
“resource”(从 PHP 4 起)
“NULL”(从 PHP 4 起)
“unknown type”
这里需要注意的是 is_numeric()是用来判断 变量是否是数字或者数字符串的
当is_numeric() 的参数是数字或者数字字符串的时候 返回true 否则返 false
3. include()与require()
1.在错误处理方面,使用include语句,如果发生包含错误,程序将跳过include语句,虽然会显示错误信息但是程序还是会继续执行。但是,requre语句会提示一个致命错误。
2.如果你的Web程序使用了MVC这种对文件包含强依赖的设计方法,请使用require_once。
3.关于包含文件后作用域问题总结如下:
1).所有在被包含文件中定义的函数和类在被包含后,在包含文件里都具有全局作用域
2).被包含文件的变量的作用域,随着包含位置的变化而变化。比如如果是在函数中包含,被包含文件的变量是局部变量
文件 a.php
1.$name="llj"; 2.class Teacher{ 3. public function show(){ 4. echo 'my job is teacher</br>'; 5. } 6.} 7.function showName(){ 8. echo 'a.php 里面的方法'; 9.}
文件 index.php
1.function a(){ 2. require "a.php"; 3. $teacher =new Teacher(); 4. $teacher->show(); 5.} 6. 7.a();//正常调用 8. 9.showName();//正常调用 10. 11.var_dump($name);//提示$name没有定义 其$name作用域是a()函数,是局部的
1) 加载失败的处理方式不同:
include**`如果引入的文件不存在`**,试图继续往下执行,报一个warning
(如果你不介意之前的内容是否被包含,之后的内容都要执行,就使用include)
require如果**`引入的文件不存在`**,报fatal error,不再继续执行.
(如果之前的内容一定要被包含,才允许继续执行之后的代码,就使用require)
2) 包含文件不存在或者语法错误的时候require是致命的,include不是。
3) include有返回值,而require没有(可能因为如此require的速度比include快)。
4) 引入时间不同:
require通常使用方法,这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。
include通常使用方法,这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化
Include/require 与 include_once /require_once的区别
_once 会自动判断文件是否已经引入,如果引入,不再重复执行.
即:保证被包含文件只可能被引入一次.
(如果包含的文件里有定义函数,那么被包含的文件只能被包含一次,如果多次包含,就会出现函数重定义的错误,php是不运行函数重定义的,会出现致命错误,之后代码不在运行)
有的文件不允许被包含多次?
可以用_once来控制,但是,如果从文件的设计上,比较规范,能保证肯定不会出现多次包含的错误,
这种情况下 建议用include,因为include_once要检测之前有没有包含,效率没有include高
关于include和require后面是否加括号的问题
理论上来说:include和require后面加不加括号对执行结果没有区别,但是加上括号效率较低,所以后面能不加括号就不加括号。
1.作用上
同:包含文件并运行(使用位置:函数内、函数外、方法内)
异:include_once/require_once是include/require基础上进一步封装,增加了一个“文件是否已经包含”的判断
2.性能上
异:由于include_once/require_once是include/require基础上进一步封装,所以include_once/require_once比include/require速度慢
3.使用上
异:require包含的文件存在错误或者不存在的话,那么程序就会中断执行了,并显示致命错误;
include包含的文件存在错误或者不存在的话,那么程序不会中端,而是继续执行,并显示一个警告错误。
所以一般重要文件用require(如:类库),不重要的用include(如:模板)
4.返回值上
同:如果被包含的文件内用return返回,那么无论include/require就会有return的值返回;如果被包含的文件内没有使用return返回,那么无论include/require,成功返回int(1),失败返回boolean(false)
2.php <?php return 'wakaka'; ?> 1.php <?php $ret = include '2.php'; echo $ret; //输出wakaka ?>
异:如果使用include_once/require_once包含文件,成功返回boolean(true),失败返回boolean(false),如果前面已经包含了该文件,文件内使用return返回,那么再使用include_once/require_once包含相同文件时是返回boolean(true)
4.self :: 和 this--> 的区别
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(常量)或者static(静态属性),那么就必须使用域操作符::,而如果被引用的变量或者方法没有被声明成const或者static,那么就使用指向操作符->。
5.foreach循环后留下悬挂指针
在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法:
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // now : $arr is array(2, 4, 6, 8)
这里有个问题很多人会迷糊。循环结束后,$value并未销毁,$value其实是数组中最后一个元素的引用,这样在后续对$value的使用中,如果不知道这一点,会引发一些莫名奇妙的错误:)看看下面这段代码:
$array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} echo implode(',', $array), "\n"; foreach ($array as $value) {} echo implode(',', $array), "\n";
运行结果如下:
1,2,3
1,2,3
1,2,2
为什么是这个结果呢?
我们来分析下。第一个循环过后,$value是数组中最后一个元素的引用。第二个循环开始:
第一步:复制$arr[0]到$value(注意此时$value是$arr[2]的引用),这时数组变成[1,2,1]
第二步:复制$arr[1]到$value,这时数组变成[1,2,2]
第三步:复制$arr[2]到$value,这时数组变成[1,2,2]
综上,最终结果就是1,2,2
避免这种错误最好的办法就是在循环后立即用unset函数销毁变量:
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value);
6. in_array(str,arr,true)
第三个参数如果为true,会比较类型,性能好,若不写第三个参数,比如字符串数字会先转成数字,会花费大量时间,性能较低。