一些面试题(网上找的)

来源:互联网 发布:淘宝如果投诉最有效 编辑:程序博客网 时间:2024/04/29 00:52

$str = '2e33ez869';$pattern = "/[a-zA-Z]/";var_dump(preg_replace($pattern,'*', $str));

Q:用PHP实现英文字符串翻转

A:

1)strrev()函数

2)自定义函数

function strrevv($str){    $len=strlen($str);    $newstr = '';    for($i = $len-1; $i >= 0; $i--){        $newstr .= $str{$i};    }}

Q:写一段PHP代码,确保多个进程同时写入同一个文件(提示:文件锁)

A:

function write_file($filename, $content){    $lock = $filename . '.lck';    $write_length = 0;    while(true) {        if( file_exists($lock) ) {            usleep(100);        } else {            touch($lock);            $write_length = file_put_contents($filename, $content, FILE_APPEND);            break;        }    }    if( file_exists($lock) ) {        unlink($lock);    }    //返回写入结果    return $write_length;}         



Q:在HTTP1.0中,状态码200、301、302、403、404、500、502的含义

A:

200:成功。服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。如果是对您的 robots.txt 文件显示此状态码,则表示 Googlebot 已成功检索到该文件。

301:永久移动。请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

302:临时移动。服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。

403:禁止。服务器拒绝请求。

404:未找到服务器找不到请求的网页。

500:服务器遇到错误,无法完成请求。

502:错误网关。服务器作为网关或代理,从上游服务器收到无效响应。



Q:写出一个正则表达式,过滤网页上的JS/VBS脚本;写一个正则表达式验证电子邮件的格式

A:

/<script[^>]*?>.*?<\/script>/si

/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/



Q:用php写一个函数数将一,二,十一,十二,二十二,四十三,一百一十八,七百五十八,一千五十六,一千九百四十二这样的中文数字转换成1,2,11,12,22,43,118,758,1056,1942这样阿拉伯数字,6000以内的能转换就行了。

A:

function abc($str){$arr = array('零'=>0,'一'=>1,'二'=>2,'三'=>3,'四'=>4,'五'=>5,'六'=>6,'七'=>7,'八'=>8,'九'=>9,'十'=>10,'百'=>100,'千'=>1000,'万'=>10000,);$len = mb_strlen($str, 'utf-8');$res = array();for($i = 0; $i<$len; $i++){$single = mb_substr($str, $i, 1, 'utf-8');$res[] = $arr[$single];}$result = 0;for($i = 0; $i<count($res); $i++){if ($i == 0 && $res[$i] == 10){$result += 10;}else if ($res[$i] > 9 || $res[$i] == 0 ) {continue;} else if (isset($res[$i+1]) && $res[$i+1] > 9){$tmp = $res[$i] * $res[$i+1];$result += $tmp;} else {$result += $res[$i];}}return $result;}


Q:php面向对象中的魔术方法

A:

__construct() 实例化对象是被自动调用。当__construct和以类名为函数名的函数 同时存在时调用__construct,另一个不背调用。类名为函数名的函数为老版的构造函数。

__destruct() 当删除一个对象或一个对象操作结束是被调用。

__call() 对象调用某个方法。若方法不存在,这调用__call 这个方法

__get() 读取一个对象属性,如果对象属性是私有的会调用它

__set() 给一个对象属性赋值时如果属性是私有的会调用它

__toString() 打印一个对象的时候会被调用。

__clone() 克隆对象时被调用,如:$a=new test(); $a1=clone $a;

__sleep() Serialize 之前被调用,若对象比较大,想删减一点东西在序列化可以用它。

__wakeup() Unserialize时被调用,做些对象的初始化工作。

__isset() 检测一个对象的属性是否存在如果 检测的属性是私有的时候会被调用。

__unset() 删除一个对象属性时如果 删除的对象属性是私有的会被调用

__set_state() 调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。

__autoload() 实例化一个对象时,如果对应的类不存在,则该方法被掉用。



Q:将字符串“2a3E33Z55”中的数字转为星号(*),字母转为小写

A:

$str = '2a3E33Z55';$pattern = "/\d/";var_dump(preg_replace($pattern,'*', strtolower($str)));

Q:常见的设计模式

A:

参考自:https://www.ibm.com/developerworks/cn/opensource/os-php-designptrns/

一、工厂模式

工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。


二、单例模式

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。


三、观察者模式

观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。


四、命令链模式

命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。


五、策略模式

在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。



Q:快速排序

A:

/*    快速排序*/function quickSort($array){    if(!isset($array[1]))        return $array;    $mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素    $leftArray = array();     $rightArray = array();    foreach($array as $v)    {        if($v > $mid)            $rightArray[] = $v;  //把比$mid大的数放到一个数组里        if($v < $mid)            $leftArray[] = $v;   //把比$mid小的数放到另一个数组里    }    $leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割    $leftArray[] = $mid;        //把分割的元素加到小的数组后面,不能忘了它哦    $rightArray = quickSort($rightArray);  //把比较大的数组再一次进行分割    return array_merge($leftArray,$rightArray);  //组合两个结果}






0 0