【面试那些事儿一】 PHP基础

/** 
 * 第6题:如何实现中文字符串截取无乱码的方法(mb_*系列函数),首先:需要开启 extension=php_mbstring.dll 扩展 ,结果:"你" 
 */  
  
echo mb_substr("你好",0,1,"gb2312")."<br/>"; 
/** 
 * 第7题:用PHP写出显示客户端和服务器端IP的代码 
 */  
  
echo $_SERVER['REMOTE_ADDR'];//客户端IP  
echo $_SERVER['SERVER_ADDR'];//服务器端IP  
echo $_SERVER['PHP_SELF'];//结果:"/index.php"   当前脚本的名称(不包括路径和查询字符串)  
echo $_SERVER["HTTP_REFERER"];//链接到当前页面的来源url  
echo gethostbyname("www.v1pin.com");//获取指定域名的IP地址  
echo getenv("REMOTE_ADDR");//获取客户端IP地址  
echo getenv("SERVER_ADDR");//获取服务器端IP地址 
/** 
 * 第8题:mysql中 IFNULL 控制流函数;IFNULL() 
 * IFNULL(): 
 *      (1)它有两个参数,并且对第一个参数进行判断。 
 *      (2)如果第一个参数不是NULL,函数就会向调用者返回第一个参数;如果是NULL,将返回第二个参数; 
 * 例如: 
 *      SELECT IFNULL(1,2), IFNULL(NULL,10), IFNULL(4*NULL,'false');//结果:"1 10  false" 
 */ 
/** 
 * 第9题:简述include与require的区别? 
 * 相同点: 
 *      (1)include与require都能把另外一个文件包含到当前文件中 
 * 异同点: 
 *      (1)使用include时,当包含的文件不存在时系统会报出警告级别的错误,但并不影响程序的后续执行. 
 *      (2)使用require时,当包含的文件不存在时系统会先报出警告级别的错误,接着又报出一个致命性的错误,将终止程序的后续执行. 
 *      (3)require只会解释包含的文件一次,不会再解释第二次,因而效率相对较高;而include则会重复的解释包含的文件 
 *      (4)载入时机不同:require在运行前载入包含文件,include在运行时载入包含文件 
/** 
 * 第10题:如何获取一个字符串中指定的字符? 
 */  
  
 $str="abcdefg";  
 echo $str{2}."<br/>";  
/** 
 * 第13题:addslashes()与 htmlspecialchars() 区别 
 * 
 * 区别: 
 
 *   (1)addslashes()函数主要在指定的预定义字符前添加反斜杠,这些预定义字符主要包括: 
 * 
 *      单引号 (') 
 *      双引号 (") 
 *      反斜杠 (\) 
 *      NULL 
 * 
 *      addslashes()函数的主要作用是保证这些预定义字符能够正确入库,仅此而已 
 * 
 * 
 * (2)htmlspecialchars()函数把一些预定义的字符转换为HTML实体,这些预定义字符主要包括: 
 * 
 *       
 *      & (和号)      成为 & 
 *      " (双引号)     成为 " 
 *      ' (单引号)     成为 ' 
 *      < (小于)       成为 < 
 *      > (大于)       成为 > 
 * 
 *      echo htmlspecialchars($str, ENT_COMPAT);  //默认,仅编码双引号 
 *      echo htmlspecialchars($str, ENT_QUOTES);  //编码双引号和单引号 
 *      echo htmlspecialchars($str, ENT_NOQUOTES);//不编码任何引号 
 * 
 */  
//第17题:如何使用 array_multisort() 函数实现对多维数组进行排序?  
//模拟从数据库中查询出来的记录(提示:二维数组)  
$arr[] = array("age"=>20,"name"=>"小强");  
$arr[] = array("age"=>21,"name"=>"李伟");  
$arr[] = array("age"=>20,"name"=>"小亮");  
$arr[] = array("age"=>22,"name"=>"黎明");  
   
foreach ($arr as $key=>$value){  
    $age[$key]  = $value['age']; //排序字段 "age"  
    $name[$key] = $value['name'];//排序字段 "name"  
}  
  
/** 
 * 1、对 $arr 数组进行排序 
 *    首先按照年龄从大到小的顺序排列,如果年龄相同再按照名字的顺序排序,类似于sql中的order by 
 * 2、注意事项: 
 *    (1)$age和$name  等价于 数据表的"age"和"name"列字段,类似于 "order by age desc,name asc"  
 *    (2)排序顺序标志: 
 *          SORT_ASC - 按照上升顺序排序 
 *          SORT_DESC - 按照下降顺序排序 
 *    (3)排序类型标志: 
 *          SORT_REGULAR - 将项目按照通常方法比较 
 *          SORT_NUMERIC - 将项目按照数值比较 
 *          SORT_STRING  - 将项目按照字符串比较 
 *    (4)排序标志的默认值为: SORT_ASC 和 SORT_REGULAR 
 *    (5)每个一维数组后指定的排序标志仅仅对该一维数组有效,一个一维数组不能指定两个同类的排序标志 
 *    (6)该函数会改变数字索引,其它索引不改变 
 * 
 */  
array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$arr);  
echo "<pre>";print_r($arr);exit;  
/** 
 * 结果: 等价于 "select * from user order by age desc,name asc"; 
 * Array( 
 *   [0] => Array 
 *       ( 
 *           [age] => 22 
 *           [name] => 黎明 
 *       ) 
 *   [1] => Array 
 *       ( 
 *           [age] => 21 
 *           [name] => 李伟 
 *       ) 
 *   [2] => Array 
 *       ( 
 *           [age] => 20 
 *           [name] => 小亮 
 *       ) 
 *   [3] => Array 
 *       ( 
 *           [age] => 20 
 *           [name] => 小强 
 *       ) 
 * ) 
 */ 
/** 
 * 第27题:交换数组中的键和值 
 */  
$a=array(  
    0=>"Dog",  
    1=>"Cat",  
    2=>"Horse"  
);  
echo "<pre>";  
print_r(array_flip($a));  
  
/** 
 * 经array_flip()数组函数处理后的结果: 
 * Array( 
 *   [Dog] => 0 
 *   [Cat] => 1 
 *   [Horse] => 2 
 *  ) 
 */ 
/** 
 * 第39题:开启php.ini文件中的safe_mode选项,会影响到哪些函数的应用?至少说出四个 
 * 
 *  答:主要影响文件操作类函数、程序执行类函数 等等 
 *      如:pathinfo()、basename()、fopen()、exec() 等等 
 */  
/** 
* 第41题:如何通过form表单控制上传文件的大小? 
* 
*  (1)答:在form表单中,通过隐藏域MAX_FILE_SIZE控制上传文件的大小,它必须放在文件域之前才能够起作用。 
* 
*  (2)解析:在客户端控制上传文件,应用的form表单中的enctype和method属性,以及隐藏域 MAX_FILE_SIZE 
*      enctype="multipart/form-data"    //指定表单编码数据方式 
*      method="post"                    //指定数据的传输方式 
*      <input type="hidden" name="MAX_FILE_SIZE" value="10000" /> //通过隐藏域控制上传文件的大小(单位为字节),该值不能超过php.ini配置文件中 upload_max_filesize 选项设置的值 
*/ 
/** 
 * 第43题:如何将 1234567890 转换成 1,234,567,890 每三位用逗号隔开的形式? 
 */  
echo number_format("1234567890")."<br/>";         //结果:1,234,567,890      默认以逗号作为分隔符        
echo number_format("1234567890",2)."<br/>";           //结果:1,234,567,890.00       参数2-指定小数位数  
echo number_format("1234567890",2,",",".")."<br/>"; //结果:1.234.567.890,00     参数2-指定小数位数 参数3-规定替代小数点符号的字符串  参数4-规定用作千位分隔符的字符串  
/** 
 * 第45题:stripos()、strpos()、strripos()、strrpos() 字符串函数的区别? 
 * 
 *  (1)stripos():返回字符串在另一字符串中第一次出现的位置(大小写不敏感) 
 *  (2)strpos() :返回字符串在另一字符串中首次出现的位置(对大小写敏感) 
 *  (3)strripos():查找字符串在另一字符串中最后出现的位置(对大小写不敏感) 
 *  (4)strrpos():查找字符串在另一字符串中最后出现的位置(对大小写敏感) 
/** 
 * 第48题:如何用php的环境变量得到一个网页地址的内容? 
 * 如:"http://www.baidu.com/index.php?id=10" 
 */  
  
echo $_SERVER['REQUEST_URI'];//结果:"/index.php?id=10"
/** 
 *第50题:如何使用php实现双向队列? 
 */  
class Deque{  
    public $queue;  
    public function __construct(){//构造函数,创建一个数组  
        $this->queue = array();  
    }  
  
    public function addFirst($item){//array_unshift() 函数在数组开头插入一个或多个元素。  
        return array_unshift($this->queue , $item);  
    }  
  
    public function removeFirst(){  
        return array_shift($this->queue);//PHP array_shift() 函数删除数组中的第一个元素  
    }  
  
    public function addLast($item){//给数组末尾追加元素,无指定下标,默认为数字  
        return array_push($this->queue , $item);  
    }  
  
    public function removeLast(){  
        return array_pop($this->queue);//PHP array_pop() 函数删除数组中的最后一个元素  
    }  
}  
//第51题:统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数  
$array=array(4,5,1,2,3,1,2,"a","a");  
  
$ac=array_count_values($array);  
  
/** 
 * 输出结果: 
 * Array( 
 *   [4] => 1 
 *   [5] => 1 
 *   [1] => 2 
 *   [2] => 2 
 *   [3] => 1 
 *   [a] => 2 
 * ) 
 */  
echo "<pre>";print_r($ac);  
//第53题:str_word_count() 函数计算字符串中的单词数?  
  
/** 
 * 输出结果:2 
 */  
echo str_word_count("Hello world!");//参数二:默认0,返回单词的数目  
  
/** 
 * 输出结果: 
   Array( 
    [0] => Hello 
    [1] => world 
   ) 
 */  
echo "<pre>";print_r(str_word_count("Hello world!",1));//参数二:1-返回包含字符串中的单词的数组  
  
/** 
 * 输出结果: 
   Array( 
    [0] => Hello 
    [6] => world 
   ) 
 */  
echo "<pre>";print_r(str_word_count("Hello world!",2));//参数二:2-返回一个数组,其中的键是单词在字符串中的位置,值是实际的单词. 
/** 
 *  第56题:redis与memcached区别? 
 * 
 *  不同点: 
 * 
 *      (1)redis中并不是所有数据在有效期内只能常驻内存的(如果需要,可定期同步持久化到磁盘),这是和memcached相比一个最大的区别(memcached中的数据在有效期内是以键值对的形式常驻内存的) 
 *      (2)redis不仅仅支持简单的键值对类型的数据,同时还提供list,set,hash等数据结构的存储;memcached仅支持简单的键值对类型的数据,但是memcached却可以缓存图片、视频等等数据 
 *      (3)redis支持数据的备份,即master-slave模式的数据备份 
 *      (4)redis支持数据的持久化和数据同步,可以将内存中的数据保存在磁盘中,重启系统后可以再次加载进行使用,缓存数据不会因此而丢失.memached缓存数据是常驻内存的,重启系统后数据就没了 
 *      (5)redis可以通过expire设定有效期,memcached在set数据的时候可以指定要缓存的数据永不过期 
 *      (6)redis可以做一主多从;memcached也可以做一主多从 
 *      (7)redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘;memcached当物理内存用完后就会自动清理一些早期的数据 
 * 
 *  相同点: 
 * 
 *      (1)redis和memcached都是将数据存放在内存中,都是内存数据库 
 *      (2)redis和memcached都可以做一主多从 
 * 
 *  性能: 
 * 
 *      (1)redis根据其官方的测试结果:在50个并发的情况下请求10w次,写的速度是110000次/s,读的速度是81000次/s 
 *      (2)redis将键名与值的最大上限各自设定为512MB;memcached则<span id="transmark"></span>将键名限制在250字节,值也被限制在不超过1MB,且只适用于普通字符串. 
 * 
 *      何时使用memcached: 
 * 
 *      (1)小型静态数据:当我们需要缓存小型静态数据的时候可以考虑memcached,最具代表性的例子就是HTML代码片段;因为memcached的内部内存管理机制虽然不像redis的那样复杂,但却更具实际效率,这是因为memcached在处理元数据时所消耗的内存资源相对更少.作为memcached所支持的惟一一种数据类型,字符串非常适合用于保存那些只需要进行读取操作的数据,因为字符串本身无需进行进一步处理<span id="transmark"></span>. 
 * 
 */

//第58题:文件缓存的使用案例  
public function &get($key, $cache_time = '') {  
        if(empty ($cache_time)) {  
            $cache_time = $this->cache_time;//缓存时间  
        } else {  
            $cache_time = intval($cache_time);//缓存时间  
        }  
        $cache_encode_key  = $this->get_key($key);//获取一个唯一的长字符串  
                //缓存文件的命名和缓存文件的存放位置  
        $filename = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/'.$cache_encode_key.".cache.php";  
        if(!is_file($filename) || time() - filemtime($filename) > $cache_time) {//如果缓存文件不存在或者缓存文件过期,则返回false  
            return false;  
        } else {  
            return unserialize(file_get_contents($filename));//如果缓存文件存在且未过期,那么读取缓存文件内容并返回  
        }  
    }  
    public function set($key,$data) {  
        $cache_encode_key  = $this->get_key($key);  
        $cache_dir  = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/';//缓存文件的缓存目录  
        $filename   = $cache_dir.$cache_encode_key.".cache.php";//缓存文件名  
        if( $this->mkpath($cache_dir) ) {//递归创建缓存目录  
            $out    = serialize($data);//将要缓存的数据序列化  
            file_put_contents($filename, $out);//将序列化的数据写入到缓存文件中  
        }  
    }  
    public function add($key, $data) {  
        $cache_encode_key   = $this->get_key($key);  
        $cache_dir  = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/';//缓存目录  
        $filename   = $cache_dir.$cache_encode_key.".cache.php";//缓存文件名  
        if(is_file($filename)) {//如果缓存文件存在,则返回false  
            return false;  
        } else {//如果缓存文件不存在,则生成一个新的缓存文件到缓存目录  
            $this->set($key, $data);  
        }  
    }  
    public function del($key) {  
        $cache_encode_key   = $this->get_key($key);  
        $cache_dir  = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/';//缓存目录<span id="transmark"></span>  
        $filename   = $cache_dir.$cache_encode_key.".cache.php";//缓存文件名  
        if(is_file($filename)) {//如果缓存文件存在则返回false<span id="transmark"></span>  
            return false;  
        } else {//如果缓存文件不存在,则删除缓存文件  
            @unlink($filename);  
        }  
    }  
  
        public function get_key($key){  
                return md5(CACHE_KEY.$key);//md5加密字符串  
        }  

//第60题:php如何读取php.ini配置文件中的配置选项的值  
echo ini_get('post_max_size');//获取上传文件的最大尺寸  
echo get_cfg_var('post_max_size');//获取上传文件的最大尺寸  

/** 
 *第62题:__call是魔术方法 
 *      __call是魔术方法是指请求的方法不存在的时候采用的哪种处理方式;如果请求的方法名存在(跟参数列表无关),则不会调用此魔术方法 
 */  
class MethodTest {  
     /** 
      * 再如: 
      *       public function __call($funName, $args){//参数1-要调用的方法名   参数2-传递给要调用方法的参数列表 
      *             switch (count($args)) { 
      *                 case 0: 
      *                     return $this->$funName(); 
      *                 case 1: 
      *                     return $this->$funName($args[0]); 
      *                 case 2: 
      *                     return $this->$funName($args[0], $args[1]); 
      *                 case 3: 
      *                     return $this->$funName($args[0], $args[1], $args[2]); 
      *                 case 4: 
      *                     return $this->$funName($args[0], $args[1], $args[2], $args[3]); 
      *                 case 5: 
      *                     return $this->$funName($args[0], $args[1], $args[2], $args[3], $args[4]); 
      *                 default: 
      *                     return call_user_func_array($this->$funName, $args); 
      *             } 
      *     } 
      */  
     public function __call($name,$arguments) {//参数1-调用的方法名 参数2-传递给调用方法的参数列表  
        if(method_exists($this,$name)){  
            return $this->$name();  
        }else{    
            echo "调用的方法 $name() 不存在;传递给 $name() 方法的参数列表如下:".implode(',',$arguments)."\n";  
        }  
     }  
}  
$obj = new MethodTest();  
//结果:调用的方法 runTest() 不存在;传递给 runTest() 方法的参数列表如下:李四,张三   
$obj->runTest('李四','张三');//方法名、参数列
/**  
 * 第65题:php中的重写与重载 
 * 首先来了解两个概念: 
 *      重写/覆盖:  指子类重写了父类的同名方法,但重写后的同名方法的参数个数及类型没有限制             <span id="transmark"></span>发生在子类与父类之间  
 *      重载:     指本类中存在多个同名方法,但参数类型/个数不同,当传不同的参数时调用不同的方法         发生在本类内部  
 * PHP中,不允许存在多个同名方法. 因此,不能够完成java,c++中的这种重载;但是,PHP的灵活,可以模拟达到类似的效果  
*/  
  
class human{  
      public function say($name){  
            echo $name,' 吃了吗?<br />';  
      }  
}  
  
class stu extends human{  
  
      /* 
       * 报错:Fatal error: Cannot redeclare stu::say() in D:\wamp\www\php\61.php on line 28,因为在PHP中,不允许存在多个同名方法,没有重载概念这一说。 
       * public function say($a,$b,$c){ 
       *        echo '哥仨好'; 
       * } 
      */  
      public function say(){  
            echo '切克闹,卡猫百比<br />';  
      }  
        
}  
  
$li=new stu();  
$li->say();//结果:切克闹,卡猫百比;  
$li->say('binghui');//结果:切克闹,卡猫百比;上面这个过程叫重写  
  
  
  
//在PHP中模拟重载的方法  
class Calc {   
    public function area() {   
        //判断一个调用area时,得到的参数个数   
        $args = func_get_args();//获取参数个数   
        if(count($args) == 1) {   
            return 3.14 * $args[0] * $args[0];   
        } else if(count($args) == 2) {   
            return $args[0] * $args[1];   
        } else {   
            return '未知图形';   
        }   
    }   
}   
$calc = new Calc();   
//计算圆的页面   
echo $calc->area(10),'<br />';   
//计算矩形的面积   
echo $calc->area(5,8); 















猜你喜欢

转载自blog.csdn.net/maguangwithc/article/details/80087151
今日推荐