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,会比较类型,性能好,若不写第三个参数,比如字符串数字会先转成数字,会花费大量时间,性能较低。

posted @ 2018-04-17 00:26  迹忆  阅读(179)  评论(0编辑  收藏  举报