一些面试题(网上找的)

$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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值