PHP面试-阿里云开发者社区

开发者社区> 数据库> 正文

PHP面试

简介:

不用新变量直接交换现有两个变量的值

Java代码  收藏代码
  1. list($a,$b)=array($b,$a);  

js 内置对象

String对象:处理所有的字符串操作
Math对象:处理所有的数学运算
Date对象:处理日期和时间的存储、转化和表达
Array对象:提供一个数组的模型、存储大量有序的数据
Event对象:提供JavaScript事件的各种处理信息


error_reporting(-1);// 报告所有 PHP 错误
error_reporting(0); // 关闭所有PHP错误报告

 

PHP 的意思 Hypertext Preprocessor

php操作json json_decode json_encode

 

php5魔术函数、魔术常量

__construct() __destruct() __call() __get() __set() __toString() __clone()
__sleep() __wakeup() __isset() __unset() __set_state() __autoload()

__LINE__  __FILE__ __FUNCTION__ __CLASS__  __METHOD__

 

防止SQL注射漏洞一般用__addslashes___函数。

 

如何修改SESSION的生存时间
方法1:将php.ini中的session.gc_maxlifetime设置为9999重启apache
方法2:$savePath = "./session_save_dir/";
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start(); 
方法3:setcookie() and session_set_cookie_params($lifeTime);

 

<?php

$a=3;
$b=6;
if($a=5||$b=7){
    $a++;
    $b++;
}
var_dump($a, $b);
陷阱是运算符的优先,赋值运算符(=)的优先级是最低的,所以正确理解应该是
$a=(5||$b=7)
正确结果:true,7

 

include 和 include_once 有什么分别?require 又如何? 
include():容许你在脚本中把同一个档案插入多次,若果档案不存在,它会发出系统警告并继续执行脚本,如果不被执行,所引用文件就不包含进来
include_once():它跟 include() 的功能相似,在脚本的执行期间,有关档案只会被插入一次。
require():跟 include() 差不多,但若果档案不存在,它会发出系统警告,这个警告会引致致命错误令脚本中止执行不管文件执行不执行,都要将所引用文件包含进来

 

php生成和解析xml

用DOMDocument

 

概述 MVC 体系结构。

答: MVC 包括三类对象, model 是 模型 , view 是视图, controller 是控制器,它定义用户界面对用户输入的响应方式。

在 MVC 体系中,模型通常被称为 " 业务逻辑 " ,是真正完成任务的代码,视图就是使用界面,反映数据的变化。控制器控制着模型和视图之间的交互过程,它决定着向用户返回怎样的视图、检查通过界面输入的信息以及选择处理输入信息的模型

在 MVC 中,表示层和逻辑层分离,各部分可相互独立进行开发,便于开发和维护,提高了开发效率。

 

表单中 get与post提交方法的区别?
1)get是从服务器上获取数据,post是向服务器传送数据。 
2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制
4)get安全性非常低,post安全性较高。

 

写出session 的运行机制
用 户A访问站点Y,如果站点Y执行了session_start();(以下假定session_start()总是存在)那么会产生一个 session_id,这个session id一般会以COOKIE的形式保存到用户A(我们可以通过在php.ini里设置session.use_only_cookies为1,强制 SESSION ID必须以COOKIE传递。)。这时候SESSION ID表现为$_COOKIE[’PHPSESSID’];(PHPSESSID可用session_name()函数来修改)
用户A接着访问,这个session id($_COOKIE[’PHPSESSID’])就会在A每次访问Y的时候传送到站点Y。
在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到session id,然后通过session id,来获得与SESSION数据的关联,并返回SESSION数据。

cookie机制

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。 PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似

 

session与cookie的区别 ?
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

 

PHP可以和sql server/oracle等数据库连接吗?(1分)
可以


请写出PHP5权限控制修饰符(3分)
Private  protected  public


请写出php5的构造函数和析构函数(2分)
__construct      __destruct


$a = 'abcdef'; 请取出$a的值并打印出第一个字母(1分)
echo $a{0};              //正则表达式
echo $a[0];   //字符串也是一个数组

 

如何实现字符串翻转?

strrev() 或

$str = "abcdefg";
function strrevv($str)
{
$len=strlen($str);
$newstr = '';
for($i=$len;$i>=0;$i--)
{
$newstr .= $str{$i};
}
return $newstr;
}
$showstr = strrevv($str);
echo $showstr."<br>";

 

A.判断一个变量的值是否为空: empty    
B.判断一个变量是否为NULL: is_null 
C.判断一个变量是否存在:      isset                                
D.释放一个变量:            unset

<?
function get_arr($arr){
unset($arr[0]);
}
$arr1 = array(1, 2);
$arr2 = array(1, 2);
get_arr(& $arr1);
get_arr($arr2);
echo count($arr1);
echo count($arr2);
?>

1 2

 

<?    
$GLOBALS ['var1'] = 5;
$var2 = 1;
function get_value(){
global $var2;
$var1 = 0;
return $var2++;
}
get_value();
echo $var1;
echo $var2;
?> 
5 2 没有global就是5 1

 

<?
$count = 5;
function get_count(){
static $count = 0;
return $count++;
}
echo $count;
++$count;
echo $count;
echo get_count();
echo get_count();
?> 
5 6 0 1

 

<?
$a6 = 'null';           
$a8 = array(array());   
echo empty($a6) ? 'true' : 'false';
echo empty($a8) ? 'true' : 'false';
?>
false false  //字符串null //一个元素为array
如果 var 是非空或非零的值,则 empty () 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

 

分别说出echo、print()、print_r()、printf()、sprintf 的区别。
echo() :用于输出一个或多个字符串,没有返回值,速度快于其他
print():该函数功能和echo()一样,不同的是print()有返回值。成功返回 1 ,失败则返回 0 。
printf():该函数是用于输出格式化的字符。
sprintf():该函数有用法和printf()的格式一样,但sprintf()不是输出字符串,而是将格式化的字符串以返回值的形式写入到一个变量中。
print_r():可以打印出复杂类型变量的值(如数组,对象),如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。

 

说明:
全等(===):如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。
相等(==):如果 $a 和 $b 具有相同的键/值对则为 TRUE。

<?
$str1 = null;
$str2 = false;
echo $str1==$str2 ? '相等' : '不相等';
$str3 = '';
$str4 = 0;
echo $str3==$str4 ? '相等' : '不相等';
$str5 = 0;
$str6 = '0';
echo $str5===$str6 ? '相等' : '不相等';
?>
相等 相等 不相等

 

1. 用PHP打印出前一天的时间,打印格式是2007年5月10日 22:21:21
echo date('Y-m-d H:i:s', strtotime('-1 day'));

 

php获取访客ip

$_SERVER["REMOTE_ADDR"];


2. PHP代码如下:
$a="hello";
$b=&$a;
unset($b);
$b="world";
echo $a;
其结果是?答案为:hello


3. PHP代码如下:
$str="cd";
  $$str="landog";  
$$str.="ok";
echo $cd;
其结果是? hotdogok

4. 用PHP写一段代码,实现不使用第3个变量,交换$a、$b的值,$a、$b的初始值自己定。
$a = $a^$b;
$b = $b^$a;

11. 移动任意一位数或符号,使等式成立, 102 = 101-1。注:是移动不是交换,等号不能分开。

将102的2挪到右上角
12. 规律题,3、1、4、1、5、9、2、(  ), 请按照规律在括号内写出下一表达式。

答案为6,因为∏=3.1415926
13. 规律题,5、8、-3、5、-2、3、-1、(  ),请按照规律在括号内写出下一表达式。
答案为2,规律为n=(n-2) – |(n-1)| ,n>=3

 

写一个 函数,array_remove(),要求最简洁的清除 数组中值为$v的项。

function array_remove(&$array, $var) { 
    $index = array_search($var, $array); 
    if ($index !== false) 
        unset($array[$index]); 
}

 

以下登陆代码安全上有什么问题?
<?
   $m=$_GET['m'];
   $user=$_GET['user'];
   $pass=$_GET['pass'];
   $include($m."do/php");
   $sql="select count(*) as b from user where username='".$user."'and password='".$pass."';
   $r=mysql_query($sql);
   list($count)=@mysql_fetch_array($r);
   if($count>1){
   
   ......登陆成功操作
   }
?>

注入和远程攻击 mysql_real_escape_string()

 

写一个程序,远程抓取http://www.google.cn/search?q=php 网页内容,并匹配出该网址网页内的所有超链接地址,写入url.txt

$content = file_get_contents('http://www.google.cn/search?q=php'); 
$pattern = '/href=\"(.+?)\"/'; 
preg_match_all($pattern, $content, $matches); 
$content = ''; 
foreach ($matches[1] as $mt) 
    $content .= $mt."\n"; 
file_put_contents('url.txt', $content);

 

1.以下哪一句不会把 John 新增到 users 阵列? 
$users[] = 'john';
成功把 John 新增到阵列 users。 
array_add($users,’john’);
函式 array_add() 无定义。 
array_push($users,‘john’);
成功把 John 新增到阵列 users。 
$users ||= 'john';
语法错误。

2.sort()、assort()、和 ksort() 有什么分别?它们分别在什么情况下使用?

sort()
根据阵列中元素的值,以英文字母顺序排序,索引键会由 0 到 n-1 重新编号。主要是当阵列索引键的值无关疼痒时用来把阵列排序。 
asort()
与 sort() 一样把阵列的元素按英文字母顺序来排列,不同的是所有索引键都获得保留,特别适合替联想阵列排序。
ksort()
根据阵列中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的联想阵列。

3.以下的代码会产生什么?为什么?

$num =10 ;
function multiply( ) { 
$num =$num *10 ;
} 
multiply( ) ;
echo $num ;10。

4. reference 跟一个正规的变量有什么分别?如何 pass by reference?在什么情况下我们需要这样做?
Reference 传送的是变量的地址而非它的值,所以在函式中改变一个变量的值时,整个应用都见到这个变量的新值。
一个正规变量传送给函式的是它的值,当函式改变这个变量的值时,只有这个函式才见到新值,应用的其他部分仍然见到旧值。

$myVariable = "its' value";

Myfunction(&$myVariable); // 以 reference 传送参数

以 reference 传送参数给函式,可以使函式改变了的变量,即使在函式结束后仍然保留新值。

6.foo() 与 @foo() 有什么分别?
foo() 会执行这个函式,任何解译错误、语法错误、执行错误都会在页面上显示出来。
@foo() 在执行这个函式时,会隐藏所有上述的错误讯息。
很多应用程式都使用 @mysql_connect() 和 @mysql_query 来隐藏 MySQL 的错误讯息,我认为这是很严重的失误,因为错误不该被隐藏,你必须妥善处理它们,可能的话解决它们。

7.你如何替 PHP 的应用程式侦错? 
我并不常这样做,我曾经试过很多不同的侦错工具,在 Linux 系统中设定这些工具一点也不容易。不过以下我会介绍一个近来颇受注目的侦错工具。
PHP - Advanced PHP Debugger 或称 PHP - APD,第一步是执行以下的指令安装:

pear install apd安装后在你的脚本的开头位置加入以下的语句开始进行侦错:

apd_set_pprof_trace();执行完毕,打开以下档案来查阅执行日志:
apd.dumpdir
你也可以使用 pprofp 来格式化日志。
详细的资料可以参阅 http://us.php.net/manual/en/ref.apd.php 。

9.你会如何定义一个没有成员函式或特性的类别 myclass?

class myclass{}

10.你如何产生一个 myclass 的物件?

$obj = new myclass();

11.在一个类别内如何存取这个类别的特性及变改它的值? 
使用语句:$this->propertyName,例如:

class myclass{ private $propertyName; public function __construct() {   $this->propertyName = "value"; }}

13.以下哪一个函式可以把浏览器转向到另一个页面? 
redir() 
这不是一个 PHP 函式,会引致执行错误。 
header()
这个是正确答案,header() 用来插入卷头资料,可以用来使浏览器转向到另一个页面,例如:
header("Location: 
http://www.search-this.com/ "); 
location()
这不是一个 PHP 函式,会引致执行错误。 
redirect()
这不是一个 PHP 函式,会引致执行错误。


14.以下哪一个函式可以用来开启档案以便读/写? 
fget() 
这不是一个 PHP 函式,会引致执行错误。
file_open()
这不是一个 PHP 函式,会引致执行错误。
fopen() 
这是正确答案,fopen() 可以用来开启档案以便读/写,事实上这个函式还有很多选项,详细资料请参阅 php.net。 
open_file() 
这不是一个 PHP 函式,会引致执行错误。
15.mysql_fetch_row() 和 mysql_fetch_array() 有什么分别? 
mysql_fetch_row() 把数据库的一列储存在一个以零为基数的阵列中,第一栏在阵列的索引 0,第二栏在索引 1,如此类推。mysql_fetch_assoc() 把数据库的一列储存在一个关联阵列中,阵列的索引就是栏位名称,例如我的数据库查询送回“first_name”、“last_name”、 “email”三个栏位,阵列的索引便是“first_name”、“last_name”和“email”。mysql_fetch_array() 可以同时送回 mysql_fetch_row() 和 mysql_fetch_assoc() 的值。 
16.下面的代码用来做什么?请解释。

$date='08/26/2003';print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)"," \\2/\\1/\\3",$date );

这是把一个日期从 MM/DD/YYYY 的格式转为 DD/MM/YYYY 格式。我的一个好朋友告诉我可以把这个正规表达式拆解为以下的语句,对于如此简单的表示是来说其实无须拆解,纯粹为了解说的方便:

// 对应一个或更多 0-9,后面紧随一个斜号$regExpression = "([0-9]+)/";// 应一个或更多 0-9,后面紧随另一个斜号$regExpression .= "([0-9]+)/";// 再次对应一个或更多 0-9$regExpression .= "([0-9]+)";至于 \\2/\\1/\\3 则是用来对应括号,第一个括号对的是月份,第二个括号对应的是日期,第三个括号对应的是年份。

 

17.给你一行文字 $string,你会如何编写一个正规表达式,把 $string 内的 HTML 标签除去?
首先,PHP 有内建函式 strip_tags() 除去 HTML 标签,为何要自行编写正规表达式?好了,便当作是面试的一道考题吧,我会这样回答:

$stringOfText = "<p>This is a test</p>";

$expression = "/<(.*?)>(.*?)<\/(.*?)>/";

echo preg_replace($expression, " \\2 ", $stringOfText);// 有人说也可以使用 /(<[^>]*>)/ $expression = "/(<[^>]*>)/";

echo preg_replace($expression, "", $stringOfText);

 
19.你如何利用 PHP 解决 HTTP 的无状态本质? 
最主要的俩各选择是 session 和 cookie。使用 session 的方法是在每一页的开始加上 session_start(),然后利用 $_SESSION 散列表来储存 session 变量。至于 cookie 你只需记着一个原则:在输出任何文字之前调用 set_cookie() 函式,此外只需使用 $_COOKIE 散列表便可以存取所有 cookie 变量。
还有一个不那么可靠的方法,就是利用访客的 IP 地址,这个方法有特定的危险性。


20.GD 函式库用来做什么? 
这 个可能是我最喜欢的函式库,自从 PHP 4.3.0 版本后 GD 便内建在 PHP 系统中。这个函式库让你处理和显示各式格式的图档,它的另一个常见用途是制作所图档。GD 以外的另一个选择是 ImageMagick,但这个函式库并不内建于 PHP 之中,必须由系统管理员安装在伺服器上。


21.试写出几个输出一段 HTML 代码的方法。 
嗯,你可以使用 PHP 中任何一种输出语句,包括 echo、print、printf,大部分人都使用如下例的 echo:

echo "My string $variable";你也可以使用这种方法:

echo <<<END This text is written to the screen as output and this $variable is parsed too. If you wanted remarks must be on a line of its own, and can't contain any extra white space.END;

 

6 请举例说明在你的开发过程中用什么方法来加快页面的加载速度
   答:要用到服务器资源时才打开,及时关闭服务器资源,数据库添加索引,页面可生成静态,图片等大文件单独服务器。使用代码优化工具啦

1 请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
 传值只是把某一个变量的值传给了另一个变量,而引用则说明两者指向了同一个地方。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章