您的位置:首页 > 编程语言 > PHP开发

PHP易混淆知识点大分享

2017-08-11 17:51 246 查看
1. 变量如何定义?如何检查变量是否定义?如何删除一个变量?怎样检测变量是否设置?


本帖隐藏的内容

        $定义   isset()// 检测变量是否设置
        defined()// 检测常量是否设置
        unset()//销毁指定的变量
        empty()// 检测变量是否为空

2. 什么是可变变量?


本帖隐藏的内容

   一个变量的变量名可以动态的设置和使用。
        $a = 'hello' , $$a = 'world',        ${$a}=hello world

3. 变量赋值方式有哪几种?

      


本帖隐藏的内容

1)直接赋值   2)变量间赋值   3)引用赋值

4. 引用和拷贝有什么区别?


本帖隐藏的内容

拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自的内存,互不干扰。
        引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。

5. php中变量有哪些基本数据类型?


本帖隐藏的内容

  php支持8种原始数据类型包括:
        四种标量类型(布尔型boolean,整型interger,浮点型float/double
, 字符串string)
        两种复合类型(数组array ,
对象object)
        两种特殊类型(资源resource,NULL)

6. 其它类型转换为boolean类型时,哪些被认为是false 
 


本帖隐藏的内容

布尔值false,整型值0,
浮点型值0.0, 空白字符串, 字符串'0', 空数组,特殊数据类型NULL, 没有设定的变量。

   empty()函数在哪些情况下返回true?
布尔值false,整型值0,
浮点型值0.0, 空白字符串, 字符串'0', array()空数组,特殊数据类型NULL, 没有任何属性的对象,没有赋值的变量。

7. 如果定义了一个变量$a ,但是没有赋初始值, 那么$a==0吗? $a==false吗?$a==''吗? 
 $a==NULL吗? $a===NULL吗? 
   


本帖隐藏的内容

  答:echo=>什么都没有 ,
var_dump=>NULL
        empty($b)==true吗?———————————— echo=>1 , var_dump=>bool(true)
        此时如果输出$a++是多少?——————— 
      echo=>什么都没有 , var_dump=>NULL
        如果输出++$a又是多少?————————— 
      echo=>1  , var_dump=>int(1)

8. 字符串怎么转成整数,有几种方法?怎么实现?


本帖隐藏的内容

        强制类型转换: (整型)字符串变量名;
        直接转换:settype(字符串变量,整型);
        intval(字符串变量);

9. 标量数据和数组的最大区别是什么?

        


本帖隐藏的内容

一个标量只能存放一个数据,而数组可以存放多个数据。

10. 常量如何定义如何检测一个常量是否被定义?常量的值只能是哪些数据类型?


本帖隐藏的内容

        define()//定义常量 , defined()//检查常量是否定义
        常量的值只能是标量类型的数据。

11. 常量分为系统内置常量和自定义常量。请说出最常见的几个系统内置常量?


本帖隐藏的内容

__FILE__ , __LINE__ , PHP_OS , PHP_VERSION

12. 如果定义了两个相同的常量,前者和后者哪个起作用?


本帖隐藏的内容

前者起作用,因为常量一旦定义就不能被重新定义或者取消定义。

13. 常量和变量有哪些区别?


本帖隐藏的内容

1)常量前没有$符号;
        2)常量只能通过define()定义,而不能通过赋值语句定义;
        3)常量可以在任何地方定义和访问,而变量有全局和局部之分;
        4)常量一旦定义就不能被重新定义或者取消定义,而变量而通过赋值方式重新定义;
        5)常量的值只能是标量数据,而变量的数据库类型有8种原始数据类型。

14. PHP中常用的几个预定义的全局数组变量是哪些?


本帖隐藏的内容

有9大预定义的内置数组变量:
        $_POST, $_GET, $_REQUEST, $_SESSION, $_COOKIE, $_FILES,$_SERVER, $_ENV, $GLOBALS

15. 在实际开发中,常量最常用于哪些地方?


本帖隐藏的内容

   1)连接数据库的信息定义成常量,如数据库服务器的用户名、密码、数据库名、主机名;
   2)将站点的部分路径定义成常量,如web绝对路径,smarty的安装路径,model、view或者controller的文件夹路径;
   3)网站的公共信息,如网站名称,网站关键词等信息。

16. 函数的优越性有哪些?


本帖隐藏的内容

提高程序的可维护性  提高软件的可靠性  提高程序的可重用性  提高程序的开发效率

17. 如何定义一个函数?函数名区分大小写吗?


本帖隐藏的内容

1)使用 function 关键字;2)函数命名规则和变量一样,以字母或者下划线开头,而不能以数字开头; 3)函数名不区分大小写; 4)函数名不可以使用已经声明过的或者系统自建的函数名称。

18. 什么是变量的能见度 或者 说是变量作用域?


本帖隐藏的内容

就是变量在程序中的可作用范围。根据变量的能见度,变量分为局部变量和全局变量。

19. 什么是局部变量和全局变量?函数内是否可以直接调用全局变量?


本帖隐藏的内容

局部变量是函数内部定义的变量,其作用域是所在的函数。如果函数外还有一个跟局部变量名字一样的变量,程序会认为它们两个是完全不同的两个变量。当退出函数的时候,其中的局部变量就同时被清除。全局变量是定义在所有函数以外的变量,其作用域是整个php文件,但是在用户自定义的函数内部是无法使用的。如果一定要在用户自定义的函数内部使用全局变量,那么就需要使用global关键字声明。也就是说如果在函数内的变量前加上golbal来修饰,那么函数内部就可以访问到这个全局变量,不仅可以利用这个全局变量进行运算而且可以对这个全局变量进行重新赋值。全局变量还可以使用
$GLOBALS['var'] 来调用。

20. 常量如何定义? 如何检测一个常量是否被定义?常量的值只能是哪些数据类型?


本帖隐藏的内容

define()//定义常量 , defined()//检查常量是否定义常量的值只能是标量类型的数据。

21. 什么是静态变量?


本帖隐藏的内容

如果一个函数内定义的变量前使用关键字static来声明,那么该变量就是静态变量。
        一般函数内的变量在函数调用结束后,其存储的数据将被清除,所占的内存空间也被释放。而使用静态变量时,该变量会在函数第一次被调用时被初始化,初始化后该变量也不会被清除,当再次调用该函数时,这个静态变量不再被初始化,而能保存上次函数执行完后的值。可以说静态变量在所有对该函数的调用之间共享。

22. php中函数传递参数的方式有哪些?两者有什么区别?    


本帖隐藏的内容

按值传递和按地址传递(或按引用传递)
        (1)按值传递:  待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对该变量值做的修改,不影响原本的变量值。
        (2)按地址传递: 使用 & 符号,表明该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块地址导入函数之中,所以函数体内的该变量和主程序中的该变量在内存中是同一个。函数体做的修改,直接影响到函数体外部的该变量的值。

23. 什么是递归函数?如何进行递归调用?


本帖隐藏的内容

递归函数其实就是调用自身的函数,但是必须满足以下两个条件:
        1)在每一次调用自身时,必须是更接近于最终结果;
        2)必须有一个确定的递归终止条件,不会造成死循环。
        举例说明:
        在实际工作中往往会在遍历文件夹的时候使用。
        如果有个例子是希望获取到目录windows下所有的文件,那么先遍历windows目录,如果发现其中还有文件夹,那么就会调用自身,继续往下寻找,依次类推,直到遍历到再也没有文件夹为止,这也就是意味着遍历出来了所有的文件。

24. 判断一个函数是否存在?
           


本帖隐藏的内容

function_exists( string $function_name )  如果存在,返回true, 不存在则返回 false。

25. func()和@func()之间有什么区别?


本帖隐藏的内容

第二个函数调用失败不会报错,第一个会报错

26. include()和require()函数的用法和区别是什么?include_once()和require_once()呢?


本帖隐藏的内容

include和require出现错误后的错误级别不一样
        include_once()和require_once()在加载之前要判断是否已经导入

27. 说出前置++和后置++的区别?


本帖隐藏的内容

前置++是先将变量增加1,然后在将值赋值给原来的变量;
        后置++是先返回变量的当前值,然后再将变量的当前值增加1.

28. 字符串运算符“.”与算术运算符“+”有什么区别?


本帖隐藏的内容

当“a”“b”之间使用.时认为是连字符。如果两者间是+的时候php会认为是一次运算。
        1)如果+号两边的字符串是数字组成的,那么会将字符串自动转为整型;
        2)如果+号两边是纯粹的字母,那么会输出0;
        3)如果+号两边的字符串是以数字开头的,那么会截取字符串开头的数字,然后进行运算。

29. 什么是三目(或三元)运算符?


本帖隐藏的内容

根据一个表达式的结果在另两个表达式中选择一个。
        例如: ($a==true) ? 'good':'bad';

30. 控制流程语句有哪些?


本帖隐藏的内容

1:三种程序结构    顺序结构、分支结构、循环结构
        2:分支: if/esle/esleif/     switch/case/default
        3: switch 需要注意的:
                case子句中的常量可以是整型、字符串型常量、 或者常量表达式,不允许是变量。
                  同一个switch子句中,case的值不能相同,否则只能取到首次出现case中的值。
        4: 循环  for while   do...while
          do...while 后面必须加入分号结尾。
          while 和 do...while 的区别
        5:break 和 continue 的区别。
                break可以终止循环。
                continue没有break强大,只能终止本次循环而进入到下一次循环中。

31. 数组的概念是什么?数组根据索引分为哪两种,如何区分?数组的赋值方式有哪两种?


本帖隐藏的内容

        数组是一个可以存储一组或一系列数值的变量(复合型变量)
        索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值)
        数组的赋值方式有哪两种?
        数组的声明方式主要有两种。
        1.通过array()函数声明数组;
可以通过key=>value的方式分别定义索引和值,也可以不定义数组的索引下标,只给出数组的元素值。
       2.直接为数组元素赋值,不需要调用array()函数。例如:        $arr[0] = 1;     $arr[1] = 2;
        特别注意:
        数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当作整数对待。
        例如: $array[3] 与  $array['3'] 引用的是相同的一个元素,而 $array['03'] 引用的则就是另外的一个元素了。

32.数组如何遍历?


本帖隐藏的内容

①for循环
        ②foreach循环  ,这是最常用的遍历方式。用法如下:foreach($arr as $key=>$value){}
        ③list each 和while 配合起来循环

33. foeach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢?


本帖隐藏的内容

当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset().
        reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。

34. 如何计算数组长度(或者说计算数组中所有元素的个数)?字符串怎么取长度?


本帖隐藏的内容

count() -- 计算数组中的元素个数。
        可以使用count(数组名)或者count(数组名,1),如果有第二个参数,并且是数字1,则表示递归统计数组元素的个数。如果第二个参数是数字0,则等同于只有一个参数的count()函数。
        sizeof() -- count() 的别名(count — 计算数组中的单元数目或对象中的属性个数)
字符串:strlen()— 获取字符串长度
        mb_strlen()— Get string length

35. 数组中相关的常用函数有哪些?


本帖隐藏的内容

1) count --(sizeof别名)— 计算数组中的单元数目或对象中的属性个数   
                例如:int count ( mixed $var [, int $mode ] )  $var 通常都是数组类型,任何其它类型都只有一个单元。  $mode 默认值为0. 1为开启递归地对数组计数
        2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 检查数组中是否存在某个值。如果 needle 是字符串,则比较是区分大小写的。如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack
中的相同。
        3) array_merge(array $array1 [, array $array2 [, array $... ]] ) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。 
                特别注意:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面. 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引!
        4) 数组与字符串之间的转换
                (1)explode ( string $separator , string $string [, int $limit ] )  使用一个分隔字符来分隔一个字符串。
                (2)implode ( string $glue , array $arr )  使用一个连接符将数组中的每个单元连接为一个字符串。join 为 implode 的别名
        5) sort(array &$array [, int $sort_flags ]) — 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。

36. 数组合并函数array_merge()和数组加法运算$arr + $arr2 的区别是什么?
   


本帖隐藏的内容

array_merge()->使用array_merge(),如果是关联数组合并,如果数组的键名相同,那么后面的值将覆盖前者;如果是数字索引数组合并,则不覆盖,而是后者附加到前者后面。"+"->使用数组加法运算,与array_merge()不同,加法运算不管是关联数组还是数字索引数组,都是将相同键名的的值舍弃,也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。

37. 字符串定义的时候单引号和双引号有什么区别?
      


本帖隐藏的内容

单引号加载速度比双引号加载速度快.

38. echo(),print(),print_r()的区别?


本帖隐藏的内容

(1)echo 是语法,Output one or more strings,没有返回值;
        (2)print 是函数,不能输出数组和对象,Output a string,print有返回值;
        (3)print_r 是函数,可以输出数组。print_r是个比较有意思的函数,可以输出stirng、int、float、        array、object等,输出array时会用结构表示,print_r输出成功时返回true;而且print_r可以通过print_r($str,true)来,使print_r不输出而返回print_r处理后的值。此外,对于echo和print,基本以使用echo居多,因为其效率比print要高。

39. 按照功能分类说说都有哪些字符串处理函数?这些函数的作用是什么?


本帖隐藏的内容

A. 字符串输出函数
        (1)echo $a,$b,$c......;  是一个语言结构,而不是一个真正的函数。
        (2)print($a)    本函数输出字符串。若成功则返回 1,失败返回 0
        (3)print_r($a)
        (4)var_dump($a); 能输出类型、长度、值
        B. 去除字符串首尾空格的函数: trim  ltrim  rtrim(别名:chop)   使用第二个参数,还可以去除指定的字符。
        C. 转义字符串函数:addslashes()
        D. 获取字符串长度的函数:strlen()
        E. 截取字符串长度的的函数:substr()
        F. 检索字符串函数: strstr() , strpos()
        G. 替换字符串函数:str_replace()

40. 请给出以下问题的正确答案?


本帖隐藏的内容

1).$arr = array('james', 'tom', 'symfony');请将$arr数组的值用’,’分割并合并成字符串输出?                echo implode(‘,’,$arr);
        2).$str = ‘jack,james,tom,symfony’; 请将$str用’,’分割,并把分割后的值放到$arr数组中?                $arr = explode(‘,’,$str);
        3).$arr = array(3,7,2,1,’d’,’abc’);        请将$arr按照从大到小的顺序排序,并保持其键值不变?                arsort($arr); print_r($arr);
        4).$mail = “gaofei@163.com”; 
      请将此邮箱的域(163.com)取出来并打印,看最多能写出几种方法?
                echo strstr($mail,'163');
                echo substr($mail,7);
                $arr = explode("@",$mail); echo $arr[1];
        5). 如果有一个字符串,该字符串是“123,234,345,”。请问如何切割掉这个字符串最后一个逗号?
        6). 获取随机数的函数有哪几个?mt_rand() 和 rand()哪个执行速度快?

41.页面字符出现乱码,怎么解决?


本帖隐藏的内容

1.首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是
        在header()函数中指定了charset;
        例如:
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        header(“content-type:text/html;charset=utf-8”);
        2.如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是否跟页面设置的字符集保持一致,
        两者必须保持统一;
        3.如果涉及到从数据库提取数据,那么判断数据库查询时的字符集是否跟当前页面设置的字符集一致,两者必须统一,
        例如:mysql_query(“set names utf8”)。

42. 正则表达式是什么?php中有哪些常用的跟正则相关的函数?请写出一个email的正则,中国手机号码和座机号码的正则表达式?


本帖隐藏的内容

正则表达式是用于描述字符排列模式的一种语法规则。正则表达式也叫做模式表达式。
        网站开发中正则表达式最常用于表单提交信息前的客户端验证。
        比如验证用户名是否输入正确,密码输入是否符合要求,email、手机号码等信息的输入是否合法
        在php中正则表达式主要用于字符串的分割、匹配、查找和替换操作。

        preg系列函数可以处理。具体有以下几个:
        string preg_quote ( string str [, string delimiter] )
        转义正则表达式字符 正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。
        preg_replace -- 执行正则表达式的搜索和替换
        mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] 
        preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换
        mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
        preg_split -- 用正则表达式分割字符串
        array preg_split ( string pattern, string subject [, int limit [, int flags]] )

        常用的正则表达式写法:
        中文:/^[\u4E00-\u9FA5]+$/
        手机号码:/^(86)?0?1\d{10}$/
        EMAIL:
        /^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/
        密码(安全级别中):
        /^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/
        密码(安全级别高):
        /^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/

43. 请说出目前学过的返回是资源的函数?


本帖隐藏的内容

答:        fopen(打开文件)
                imagecreatefromjpeg(png gif) — 从 JPEG 文件新建一图像 
                imagecreatetruecolor — 新建一个真彩色图像
                imagecopymerge — 拷贝并合并图像的一部分
                imagecopyresized  — 拷贝部分图像并调整大小
                mysql_connect  — 打开一个到 MySQL 服务器的连接
                mysql_query();只有这执行select的时候成功,才返回资源,失败返回FALSE

44. preg_replace()和 str_ireplace()两个函数在使用上有什么不同?preg_split()和split()函数如何使用?


本帖隐藏的内容

preg_replace — 执行正则表达式的搜索和替换
       str_ireplace — str_replace() 的忽略大小写版本   str_replace — 子字符串替换
       preg_split — 用正则表达式分割字符串
       split — 用正则表达式将字符串分割到数组中

45. 获取当前时间戳的函数主要有哪些?用PHP打印出今天的时间,格式是2010-12-10 22:21:21?


本帖隐藏的内容

用PHP打印出前一天的时间格式是2010-12-10 22:21:21?如何把2010-12-25 10:30:25变成unix时间戳?
        echo date ("Y-m-d H:i:s" ,strtotime(‘-1,days’));         
        date('Y-m-d H:i:s',time());        
        $unix_time = strtotime("2009-9-2 10:30:25");//变成unix时间戳
        echo date("Y-m-d H:i:s",$unix_time);//格式化为正常时间格式

46.   在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?


本帖隐藏的内容

用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入<script>alert(111);</script>),php端接收数据的时候,应该如何处理?
        使用urlencode()对中文进行编码,使用urldecode()来解码。        
        使用htmlspecialchars($_POST[‘title’])来过滤表单传参就可以避免脚本攻击。

47. 说说mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之间有什么区别?


本帖隐藏的内容

第一个是返回结果集中的一行作为索引数组,第二个是返回关联数组,而第三个既可以返回索引数组也可以返回关联数组,取决于它的第二个参数 MYSQL_BOTH MYSQL_NUM  MYSQL_ASSOC 默认为MYSQL_BOTH
        $sql =”select * from table1”;
        $result = mysql_query($sql);
        mysql_fetch_array($result, MYSQL_NUM);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  web 优化 php