一些好的php面试题及解析

1. echo (int)((0.1+0.7)*10);//7

看似有穷的小数, 在计算机的二进制表示里却是无穷的
添加链接描述
echo serialize(0.1+0.7); //d:0.79999999999999993;
精度丢失。
强制转换为 integer会舍弃小数部分~
类似的题例如:
关于整数溢出:
如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。

32 位系统下的整数溢出
$large_number = 2147483647;
var_dump($large_number);                     // int(2147483647)

$large_number = 2147483648;
var_dump($large_number);                     // float(2147483648)

64 位系统下的整数溢出
$large_number = 9223372036854775807;
var_dump($large_number);                     // int(9223372036854775807)

$large_number = 9223372036854775808;
var_dump($large_number);                     // float(9.2233720368548E+18)

关于比较两个浮点数是否相等

$a = 1.23456789;
$b = 1.23456788;
$epsilon = 0.0000001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}

2. javascript跨域如何实现//jsonp 和 cors

什么是跨域?

  • 跨域是指从一个域名的网页去请求另一个域名的资源。
  • 严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域。
  • 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.

(1)跨域资源共享(CORS)
CORS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览器与服务器应该如何沟通。CORS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。只需要在后台中加上响应头来允许域请求!在被请求的Response header中加入以下设置,就可以实现跨域访问了!

//指定允许其他域名访问
'Access-Control-Allow-Origin:*'//或指定域
//响应类型
'Access-Control-Allow-Methods:GET,POST'
//响应头设置
'Access-Control-Allow-Headers:x-requested-with,content-type'

(2)通过jsonp跨域
JSONP是JSON with Padding(填充式json)的简写,是应用JSON的一种新方法,只不过是被包含在函数调用中的JSON,
CORS和JSONP对比

1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。

2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。

3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS)。

参考:js中的跨域问题

3. 以下如何访问 d 的值?

<?php
$a = array(
    'a',
    3 => 'b',
    1 => 'c',
    'd'
);
?>
 $a[0]
 $a[1]
 $a[2]
 $a[3]
 $a[4]

$a[4]
解析:如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。

类型强制与覆盖

$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);

以上例程会输出:
array(1) {
[1]=>
string(1) “d”
}
解析 :上例中所有的键名都被强制转换为 1,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 “d”。
补充
数组的key 可以是 integer 或者 string,如果不是这两种类型,则会强制转换。value 可以是任意类型。

此外 key 会有如下的强制转换:

  • 包含有合法整型值的字符串会被转换为整型。例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

4. max_input_time 指令的默认值是多少?

60秒
注:此变量在php.ini中,可以以秒为单位对通过 POST、GET 以及 PUT 方式接收数据时间进行限制,默认 60 秒。
补充:注:php.ini 中的 upload_tmp_dir 的这个参数为上传文件的临时目录

5. 2次foreach 输出什么

$arr = [1,2,3];
    foreach($arr as &$v) {
        //nothing todo.
    }
    foreach($arr as $v) {
        //nothing todo.
    }
    var_export($arr);

解析: 第一次foreach 完后,$v和$arr[2]指向同一块内存,根据引用传值的特点可知,修改$v的值,$arr[2]的值也会被修改,所以第二次foreach,每次遍历后,

遍历到第一个元素时:$arr[2]=$v=$arr[0],$arr=[1,2,1];
遍历到第二个元素时:$arr[2]=$v=$arr[1],$arr=[1,2,2];
遍历到第三个元素时:$arr[2]=$v=$arr[2],$arr=[1,2,2];

所以两次foreach后,$arr=array ( 0 => 1, 1 => 2, 2 => 2, )

header实现301永久定向

header('HTTP/1.1 301 Moved Permanently');
header('Location: https://blog.maplemark.cn');

echo 8.2%-3.2

2

1.取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。 

2.取模运算符 % 的结果和被除数的符号(正负号)相同。即 $a % $b 的结果和 $a 的符号相同。

什么是面向对象?主要特征是什么?

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。
封装:就是把一些重要的属性封装在类内,然后通过一个开放的接口来操作。
继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:多态就是只抽象的声明父类,具体的工作由子类对象来完成。

HTTP 状态中302、403、 500代码含义?

代码含义
301永久重定向
302临时重定向
403禁止访问
404网页不存在
401未授权
502响应超时
500服务器内部错误

如何过滤数据库重复数据?

如果需要读取不重复的数据可以在SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。

mysql> SELECT DISTINCT no 
-> FROM student;

Linux 下建立压缩包,解压缩包的命令

打包:
tar -cvf etc.tar /etc <==仅打包,不压缩!
-c :打包选项
-v :显示打包进度
-f :使用档案文件
注:有的系统中指定参数时不需要在前面加上-,直接使用tar xvf

解包:

tar -xvf demo.tar

线性表和顺序表的区别?

  1. 线性表包括顺序表和链表。
  2. 顺序表中的元素地址是连续的,链表中元素地址不是连续的,是通过指针连起来的。

什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么?

  1. 索引用来快速地寻找那些具有特定值的记录。
  2. 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。
  3. 索引的缺点:
    1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。
    3、当对表中 的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

解释:左连接,右连接,内连接。

1、內连接仅选出两张表中互相匹配的记录.因此,这会导致有时我们需要的记录没有包含进来。
2、左连接和右连接都是外部连接,也就是区别于内部连接,它对不满足连接条件的行并不是象内部连接一样将数据完全过滤掉,而是保留一部分数据,行数不会减少。
3、左连接是只要左边表中有记录,数据就能检索出来,而右边有的记录必要在左边表中有的记录才能被检索出来.
4、右连接是只要右边表中有记录,数据就能检索出来 ;

用 PHP 写出显示客户端 IP 与服务器 IP 的代码

获取客户端 IP:getenv(“REMOTE_ADDR”);
获取服务器端 IP:$_SERVER[“SERVER_ADDR”];

数据库索引有几类,分别是什么?什么时候该用索引?

普通索引、主键索引、唯一索引
并非所有的数据库都以相同的方式使用索引,作为通用规则,只有当经常查询列中的数据时才需要在表上创建索引。

写几个魔术方法并说明作用?

__call()当调用不存在的方法时会自动调用的方法
__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set()当给未定义的变量赋值时会自动调用的方法
__get()当获取未定义变量的值时会自动调用的方法
__construct()构造方法,实例化类时自动调用的方法
__destroy()销毁对象时自动调用的方法

__unset()当对一个未定义变量调用 unset()时自动调用的方法
__isset()当对一个未定义变量调用 isset()方法时自动调用的方法
__clone()克隆一个对象
__tostring()当输出一个对象时自动调用的方法

$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILE 的意思是什么?

它们都是 PHP 预定义变量
$_REQUEST 用来获取 post 或 get 方式提交的值
$_POST 用来获取 post 方式提交的值
$_GET 用来获取 get 方式提交的值
$_COOKIE 用来获取 cookie 存储的值
$_SESSION 用来获取 session 存储的值
$_FILE 用来获取上传文件表单的值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值