PHP常见面试题汇总(二)

PHP常见面试题汇总(二)

 
 
  1. //第51题:统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数  
  2. $array=array(4,5,1,2,3,1,2,"a","a");  
  3.   
  4. $ac=array_count_values($array);  
  5.   
  6. /** 
  7.  * 输出结果: 
  8.  * Array( 
  9.  *   [4] => 1 
  10.  *   [5] => 1 
  11.  *   [1] => 2 
  12.  *   [2] => 2 
  13.  *   [3] => 1 
  14.  *   [a] => 2 
  15.  * ) 
  16.  */  
  17. echo "<pre>";print_r($ac);  
[php] view plain copy
 
  1. //第52题:如何统计字符串中每种字符的出现次数并排序?  
  2. function countStr($str){   
  3.     $str_array=str_split($str);//str_split()函数能将字符串中每个字符都转化为数组的元素   
  4.     $str_array=array_count_values($str_array);   
  5.     arsort($str_array);//arsort()函数对数组进行逆向排序并保持索引关系  
  6.     return $str_array;  
  7. }   
  8. $str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas";  
  9. /** 
  10.  * 输出结果: 
  11.  * Array( 
  12.     [$] => 7 
  13.     [3] => 6 
  14.     [*] => 6 
  15.     [4] => 5 
  16.     [f] => 5 
  17.     [s] => 4 
  18.     [d] => 4 
  19.     [5] => 3 
  20.     [a] => 3 
  21.     [6] => 2 
  22.     [2] => 2 
  23.     [g] => 2 
  24.     [#] => 2 
  25.   ) 
  26.  */  
  27. echo "<pre>";print_r(countStr($str));   
[php] view plain copy
 
  1. //第53题:str_word_count() 函数计算字符串中的单词数?  
  2.   
  3. /** 
  4.  * 输出结果:2 
  5.  */  
  6. echo str_word_count("Hello world!");//参数二:默认0,返回单词的数目  
  7.   
  8. /** 
  9.  * 输出结果: 
  10.    Array( 
  11.     [0] => Hello 
  12.     [1] => world 
  13.    ) 
  14.  */  
  15. echo "<pre>";print_r(str_word_count("Hello world!",1));//参数二:1-返回包含字符串中的单词的数组  
  16.   
  17. /** 
  18.  * 输出结果: 
  19.    Array( 
  20.     [0] => Hello 
  21.     [6] => world 
  22.    ) 
  23.  */  
  24. echo "<pre>";print_r(str_word_count("Hello world!",2));//参数二:2-返回一个数组,其中的键是单词在字符串中的位置,值是实际的单词.  
[php] view plain copy
 
  1. <?php  
  2. /** 
  3.  *  第56题:redis与memcached区别? 
  4.  * 
  5.  *  不同点: 
  6.  * 
  7.  *      (1)redis中并不是所有数据在有效期内只能常驻内存的(如果需要,可定期同步持久化到磁盘),这是和memcached相比一个最大的区别(memcached中的数据在有效期内是以键值对的形式常驻内存的) 
  8.  *      (2)redis不仅仅支持简单的键值对类型的数据,同时还提供list,set,hash等数据结构的存储;memcached仅支持简单的键值对类型的数据,但是memcached却可以缓存图片、视频等等数据 
  9.  *      (3)redis支持数据的备份,即master-slave模式的数据备份 
  10.  *      (4)redis支持数据的持久化和数据同步,可以将内存中的数据保存在磁盘中,重启系统后可以再次加载进行使用,缓存数据不会因此而丢失.memached缓存数据是常驻内存的,重启系统后数据就没了 
  11.  *      (5)redis可以通过expire设定有效期,memcached在set数据的时候可以指定要缓存的数据永不过期 
  12.  *      (6)redis可以做一主多从;memcached也可以做一主多从 
  13.  *      (7)redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘;memcached当物理内存用完后就会自动清理一些早期的数据 
  14.  * 
  15.  *  相同点: 
  16.  * 
  17.  *      (1)redis和memcached都是将数据存放在内存中,都是内存数据库 
  18.  *      (2)redis和memcached都可以做一主多从 
  19.  * 
  20.  *  性能: 
  21.  * 
  22.  *      (1)redis根据其官方的测试结果:在50个并发的情况下请求10w次,写的速度是110000次/s,读的速度是81000次/s 
  23.  *      (2)redis将键名与值的最大上限各自设定为512MB;memcached则<span id="transmark"></span>将键名限制在250字节,值也被限制在不超过1MB,且只适用于普通字符串. 
  24.  * 
  25.  *      何时使用memcached: 
  26.  * 
  27.  *      (1)小型静态数据:当我们需要缓存小型静态数据的时候可以考虑memcached,最具代表性的例子就是HTML代码片段;因为memcached的内部内存管理机制虽然不像redis的那样复杂,但却更具实际效率,这是因为memcached在处理元数据时所消耗的内存资源相对更少.作为memcached所支持的惟一一种数据类型,字符串非常适合用于保存那些只需要进行读取操作的数据,因为字符串本身无需进行进一步处理<span id="transmark"></span>. 
  28.  * 
  29.  */  
  30. ?>  
  31.    



[php] view plain copy
 
  1. <?php  
  2. //第57题:memcached的使用案例  
  3.   
  4. //第一步:获取数据  
  5. function get_data(){  
  6.     $sql = "SELECT * from order_master ";//一般来说都是超级复杂的sql语句  
  7.     return $this->db->cache_all($sql);//获取缓存数据(如果缓存数据过期,则重新查询数据库并将查询到的数据放到memcache中并返回)  
  8. }  
  9.   
  10. //第二步:获取memcache中缓存数据  
  11. public function cache_all($sql, $reload = false, $limit = null) {//参数1-sql语句、参数2-是否从数据库中重新获取数据并写入memcache、参数3-每次获取记录数量  
  12.     $this->reload = $reload;  
  13.     $sql = $this->get_query_sql($sql, $limit);//拼接sql语句,如:'select * from order_master limit 0,10'  
  14.     return $this->get_cache($sql, 'get_all');//参数1-拼接的sql、参数2-要执行的方法名;将sql语句作为参数调用get_all()方法  
  15. }  
  16.   
  17. //第三步:从memcache中获取缓存数据 提示:1、如果缓存数据过期,则重新查询数据库并将查询结果放到memcache缓存中,返回数据. 2、如果缓存数据未过期,则直接获取缓存数据  
  18. protected function get_cache($sql,$method) {  
  19.     $cache_file = md5($sql.$method);//memcache中缓存数据的键名,格式:键名=md5(sql语句+方法名) 提示:一定要保证键名唯一  
  20.     $res = $this->cache->get($cache_file);//根据缓存数据的键名获取键值  
  21.     if(!$res) {//memcache中缓存数据过期的情况//如果memcache中缓存数据过期,则重新从数据库中获取数据,并将结果以键值对形式存储到memcache中  
  22.         $res= $this->$method($sql);//调用 $this->get_all($sql);//直接从数据库中获取数据并返回  
  23.         if($res && $this->cache_mark && !$this->reload) {  
  24.             $this->cache->set($cache_file, $res);//将数据库中查询到的数据以键值对形式set到memcache缓存中  
  25.         }  
  26.     }  
  27.     return $res;//返回数据  
  28. }  
  29.   
  30. //第四步:直接从数据库中获取数据并返回  
  31. public function get_all($sql, $limit = null, $fetch_mode = MYSQLI_ASSOC) {  
  32.     $this->query($sql, $limit);  
  33.     $all_rows = array();  
  34.     $this->fetch_mode = $fetch_mode;  
  35.     while($rows = $this->fetch()) {  
  36.         $all_rows[] = $rows;  
  37.     }  
  38.     $this->free();  
  39.     return $all_rows;  
  40. }  
  41. ?>  

[php] view plain copy
 
  1. //第58题:文件缓存的使用案例  
  2. public function &get($key, $cache_time = '') {  
  3.         if(empty ($cache_time)) {  
  4.             $cache_time = $this->cache_time;//缓存时间  
  5.         } else {  
  6.             $cache_time = intval($cache_time);//缓存时间  
  7.         }  
  8.         $cache_encode_key  = $this->get_key($key);//获取一个唯一的长字符串  
  9.                 //缓存文件的命名和缓存文件的存放位置  
  10.         $filename = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/'.$cache_encode_key.".cache.php";  
  11.         if(!is_file($filename) || time() - filemtime($filename) > $cache_time) {//如果缓存文件不存在或者缓存文件过期,则返回false  
  12.             return false;  
  13.         } else {  
  14.             return unserialize(file_get_contents($filename));//如果缓存文件存在且未过期,那么读取缓存文件内容并返回  
  15.         }  
  16.     }  
  17.     public function set($key,$data) {  
  18.         $cache_encode_key  = $this->get_key($key);  
  19.         $cache_dir  = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/';//缓存文件的缓存目录  
  20.         $filename   = $cache_dir.$cache_encode_key.".cache.php";//缓存文件名  
  21.         if( $this->mkpath($cache_dir) ) {//递归创建缓存目录  
  22.             $out    = serialize($data);//将要缓存的数据序列化  
  23.             file_put_contents($filename, $out);//将序列化的数据写入到缓存文件中  
  24.         }  
  25.     }  
  26.     public function add($key, $data) {  
  27.         $cache_encode_key   = $this->get_key($key);  
  28.         $cache_dir  = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/';//缓存目录  
  29.         $filename   = $cache_dir.$cache_encode_key.".cache.php";//缓存文件名  
  30.         if(is_file($filename)) {//如果缓存文件存在,则返回false  
  31.             return false;  
  32.         } else {//如果缓存文件不存在,则生成一个新的缓存文件到缓存目录  
  33.             $this->set($key, $data);  
  34.         }  
  35.     }  
  36.     public function del($key) {  
  37.         $cache_encode_key   = $this->get_key($key);  
  38.         $cache_dir  = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/';//缓存目录<span id="transmark"></span>  
  39.         $filename   = $cache_dir.$cache_encode_key.".cache.php";//缓存文件名  
  40.         if(is_file($filename)) {//如果缓存文件存在则返回false<span id="transmark"></span>  
  41.             return false;  
  42.         } else {//如果缓存文件不存在,则删除缓存文件  
  43.             @unlink($filename);  
  44.         }  
  45.     }  
  46.   
  47.         public function get_key($key){  
  48.                 return md5(CACHE_KEY.$key);//md5加密字符串  
  49.         }  
[php] view plain copy
 
  1. //第59题:redis使用案例  
  2. //推送活动商品上线  
  3.   
  4.     public function push_activity_goods_online($data) {  
  5.         $key = sprintf($this->config->item('activity_goods_push_key'), $data['goods_id']);  
  6.   
  7.         $this->cache->redis->delete($key);  
  8.         $this->load->driver('cache', array('adapter' => 'redis'));  
  9.         return $this->cache->redis->hmset($key, $data);  
  10.     }  
  11.   
  12.     //拉取上线活动商品  
  13.   
  14.     public function pull_activity_goods_online($key) {  
  15.         $key = sprintf($this->config->item('activity_goods_push_key'), $key);  
  16.         $this->load->driver('cache', array('adapter' => 'redis'));  
  17.   
  18.         return $this->cache->redis->hgetall($key);  
  19.     }  
  20.   
  21.     //删除上线的活动商品  
  22.   
  23.     public function del_activity_goods_online($key) {  
  24.         $key = sprintf($this->config->item('activity_goods_push_key'), $key);  
  25.         $this->load->driver('cache', array('adapter' => 'redis'));  
  26.         return $this->cache->redis->delete($key);  
  27.     }  
  28.   
  29.     //推送活动上线  
  30.   
  31.     public function push_activity_online($data) {  
  32.   
  33.         $activity_push_key = $this->config->item('activity_push_key');  
  34.         //非通用平台作用哉活动,活动前缀+平台作用域  
  35.         if (isset($data['plateform']) && ($data['plateform']) != 'all') {  
  36.             $activity_push_key = $data['plateform'] . ':' . $activity_push_key;  
  37.         }  
  38.   
  39.         //订单促销  
  40.         if ($data['activity_range'] == 1) {  
  41.             $key = sprintf($activity_push_key, 'order');  
  42.         } else {  
  43.             $key = sprintf($activity_push_key, $data['activity_id']);  
  44.         }  
  45.   
  46.         $this->cache->redis->delete($key);  
  47.         $this->load->driver('cache', array('adapter' => 'redis'));  
  48.         return $this->cache->redis->hmset($key, $data);  
  49.     }  
  50.   
  51.     //拉取上线活动  
  52.   
  53.     public function pull_activity_online($key) {  
  54.         if ($key == 'order') {  
  55.             $key = sprintf($this->config->item('activity_push_key'), 'order');  
  56.         }if ($key == 'mobile:order') {  
  57.             $key = "mobile:" . sprintf($this->config->item('activity_push_key'), 'order');  
  58.         } else {  
  59.             $key = sprintf($this->config->item('activity_push_key'), $key);  
  60.         }  
  61.   
  62.         $this->load->driver('cache', array('adapter' => 'redis'));  
  63.   
  64.         return $this->cache->redis->hgetall($key);  
  65.     }  
  66.   
  67.     //删除上线的活动  
  68.   
  69.     public function del_activity_online($key, $activity = array()) {  
  70.         $activity_push_key = $this->config->item('activity_push_key');  
  71.   
  72.         //非通用平台作用哉活动,活动前缀+平台作用域  
  73.         if (isset($activity['plateform']) && ($activity['plateform']) != 'all') {  
  74.             $activity_push_key = $activity['plateform'] . ':' . $activity_push_key;  
  75.         }  
  76.         $key = sprintf($activity_push_key, $key);  
  77.         $this->load->driver('cache', array('adapter' => 'redis'));  
  78.         //echo "redis->delete:" . $key . "\r\n<br>";  
  79.         return $this->cache->redis->delete($key);  
  80.     }  
  81.   
  82.     //获取全部活动  
  83.     public function pull_all_activity_online() {  
  84.         $aids = array();  
  85.         $key = "*" . sprintf($this->config->item('activity_push_key'), "*");  
  86.         $this->load->driver('cache', array('adapter' => 'redis'));  
  87.         $hashname = $this->cache->redis->keys($key);  
  88.         if (is_array($hashname)) {  
  89.             $prefix_key = str_replace("%s", '', $this->config->item('activity_push_key'));  
  90.             foreach ($hashname as $key => $value) {  
  91.                 /* if ($value == ($prefix_key . "order")) { 
  92.                   continue; 
  93.                   } */  
  94.                 $aid = str_replace($prefix_key, "", $value);  
  95.                 $aids[] = $aid;  
  96.             }  
  97.             return $aids;  
  98.         } else {  
  99.             return null;  
  100.         }  
  101.     }  
  102.   
  103.     //获取所有活动商品  
  104.     public function pull_all_activity_goods_online() {  
  105.         $aids = array();  
  106.         $key = sprintf($this->config->item('activity_goods_push_key'), "*");  
  107.         $this->load->driver('cache', array('adapter' => 'redis'));  
  108.         $hashname = $this->cache->redis->keys($key);  
  109.         if (is_array($hashname)) {  
  110.             $prefix_key = str_replace("%s", '', $this->config->item('activity_goods_push_key'));  
  111.             foreach ($hashname as $key => $value) {  
  112.                 $aid = str_replace($prefix_key, "", $value);  
  113.                 $aids[] = $aid;  
  114.             }  
  115.             return $aids;  
  116.         } else {  
  117.             return null;  
  118.         }  
  119.     }  
  120.   
  121.     //获取线上活动商品by goods_id  
  122.     public function get_activity_goods_online($product_id) {  
  123.         if (empty($product_id)) {  
  124.             return false;  
  125.         }  
  126.         $activity_goods = $this->pull_activity_goods_online($product_id);  
  127.   
  128.         if (!empty($activity_goods)) {  
  129.             return $activity_goods;  
  130.         }  
  131.   
  132.         return false;  
  133.     }  
[php] view plain copy
 
  1. //第60题:php如何读取php.ini配置文件中的配置选项的值  
  2. echo ini_get('post_max_size');//获取上传文件的最大尺寸  
  3. echo get_cfg_var('post_max_size');//获取上传文件的最大尺寸  
[php] view plain copy
 
  1. //第61题:php中如何动态的调用一个函数  
  2. $name_list = '小强,张三,李四,王五,马六';  
  3. $funName = 'explode';//函数名当作字符串  
  4. echo "<pre>";print_r($funName(',',$name_list));  
  5. echo "<pre>";print_r(call_user_func_array($funName,array(',',$name_list)));  
  6.   
  7. /** 
  8.  * 结果: 
  9.  *  Array( 
  10.  *      [0] => 小强  
  11.  *      [1] => 张三 
  12.  *      [2] => 李四 
  13.  *      [3] => 王五 
  14.  *      [4] => 马六 
  15.  *  ) 
  16.  * 
  17.  *  Array( 
  18.  *      [0] => 小强 
  19.  *      [1] => 张三  
  20.  *      [2] => 李四 
  21.  *      [3] => 王五 
  22.  *      [4] => 马六 
  23.  *  ) 
  24.  */  
[php] view plain copy
 
  1. /** 
  2.  *第62题:__call是魔术方法 
  3.  *      __call是魔术方法是指请求的方法不存在的时候采用的哪种处理方式;如果请求的方法名存在(跟参数列表无关),则不会调用此魔术方法 
  4.  */  
  5. class MethodTest {  
  6.      /** 
  7.       * 再如: 
  8.       *       public function __call($funName, $args){//参数1-要调用的方法名   参数2-传递给要调用方法的参数列表 
  9.       *             switch (count($args)) { 
  10.       *                 case 0: 
  11.       *                     return $this->$funName(); 
  12.       *                 case 1: 
  13.       *                     return $this->$funName($args[0]); 
  14.       *                 case 2: 
  15.       *                     return $this->$funName($args[0], $args[1]); 
  16.       *                 case 3: 
  17.       *                     return $this->$funName($args[0], $args[1], $args[2]); 
  18.       *                 case 4: 
  19.       *                     return $this->$funName($args[0], $args[1], $args[2], $args[3]); 
  20.       *                 case 5: 
  21.       *                     return $this->$funName($args[0], $args[1], $args[2], $args[3], $args[4]); 
  22.       *                 default: 
  23.       *                     return call_user_func_array($this->$funName, $args); 
  24.       *             } 
  25.       *     } 
  26.       */  
  27.      public function __call($name,$arguments) {//参数1-调用的方法名 参数2-传递给调用方法的参数列表  
  28.         if(method_exists($this,$name)){  
  29.             return $this->$name();  
  30.         }else{    
  31.             echo "调用的方法 $name() 不存在;传递给 $name() 方法的参数列表如下:".implode(',',$arguments)."\n";  
  32.         }  
  33.      }  
  34. }  
  35. $obj = new MethodTest();  
  36. //结果:调用的方法 runTest() 不存在;传递给 runTest() 方法的参数列表如下:李四,张三   
  37. $obj->runTest('李四','张三');//方法名、参数列表  
[php] view plain copy
 
  1. //第63题:php.ini配置文件的解析  
  2.   
  3.     (1)如:配置文件 test.ini  
  4.   
  5.         [names]  
  6.         me = Robert  
  7.         you = Peter  
  8.   
  9.         [urls]  
  10.         first = "http://www.example.com"  
  11.         second = "http://www.w3school.com.cn"  
  12.       
  13.     (2)代码:<?php   print_r(parse_ini_file("test.ini"));   ?>  
  14.   
  15.        结果:  
  16.             Array(  
  17.                 [me] => Robert  
  18.                 [you] => Peter  
  19.                 [first] => http://www.example.com  
  20.                 [second] => http://www.w3school.com.cn  
  21.             )  
  22.       
  23.     (3)代码:<?php   print_r(parse_ini_file("test.ini",true));   ?>  
  24.   
  25.        结果:  
  26.             Array(  
  27.                 [names] => Array(  
  28.                     [me] => Robert  
  29.                     [you] => Peter  
  30.                 )  
  31.                 [urls] => Array(  
  32.                     [first] => http://www.example.com  
  33.                     [second] => http://www.w3school.com.cn  
  34.                 )  
  35.             )  

[php] view plain copy
 
  1. <?php  
  2. /**  
  3.  * 第65题:php中的重写与重载 
  4.  * 首先来了解两个概念: 
  5.  *      重写/覆盖:  指子类重写了父类的同名方法,但重写后的同名方法的参数个数及类型没有限制             <span id="transmark"></span>发生在子类与父类之间  
  6.  *      重载:     指本类中存在多个同名方法,但参数类型/个数不同,当传不同的参数时调用不同的方法         发生在本类内部  
  7.  * PHP中,不允许存在多个同名方法. 因此,不能够完成java,c++中的这种重载;但是,PHP的灵活,可以模拟达到类似的效果  
  8. */  
  9.   
  10. class human{  
  11.       public function say($name){  
  12.             echo $name,' 吃了吗?<br />';  
  13.       }  
  14. }  
  15.   
  16. class stu extends human{  
  17.   
  18.       /* 
  19.        * 报错:Fatal error: Cannot redeclare stu::say() in D:\wamp\www\php\61.php on line 28,因为在PHP中,不允许存在多个同名方法,没有重载概念这一说。 
  20.        * public function say($a,$b,$c){ 
  21.        *        echo '哥仨好'; 
  22.        * } 
  23.       */  
  24.       public function say(){  
  25.             echo '切克闹,卡猫百比<br />';  
  26.       }  
  27.         
  28. }  
  29.   
  30. $li=new stu();  
  31. $li->say();//结果:切克闹,卡猫百比;  
  32. $li->say('binghui');//结果:切克闹,卡猫百比;上面这个过程叫重写  
  33.   
  34.   
  35.   
  36. //在PHP中模拟重载的方法  
  37. class Calc {   
  38.     public function area() {   
  39.         //判断一个调用area时,得到的参数个数   
  40.         $args = func_get_args();//获取参数个数   
  41.         if(count($args) == 1) {   
  42.             return 3.14 * $args[0] * $args[0];   
  43.         } else if(count($args) == 2) {   
  44.             return $args[0] * $args[1];   
  45.         } else {   
  46.             return '未知图形';   
  47.         }   
  48.     }   
  49. }   
  50. $calc = new Calc();   
  51. //计算圆的页面   
  52. echo $calc->area(10),'<br />';   
  53. //计算矩形的面积   
  54. echo $calc->area(5,8);  
  55. ?>  

 

[php] view plain copy
 
  1. <?php  
  2. /** 
  3.    第66题:static静态局部变量(不是数组)在函数中的使用特点: 
  4.  
  5.    (1)静态局部变量不会随着函数的调用和退出而发生变化; 
  6.  
  7.       不过,尽管该变量还继续存在,但确不能在函数外部直接使用它(获取不到值). 
  8.  
  9.       倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值. 
  10.  
  11.    (2)静态局部变量只会初始化一次. 
  12.  
  13.    (3)静态局部变量只能被初始化为一个字符值或一个常量,不能使用表达式. 
  14.  
  15.       即使静态局部变量定义时没有赋初值,系统会自动赋初值0. 
  16.  
  17.    (4)当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量. 
  18.  
  19.    (5)static $var=5;//【变量的赋值操作只会在变量第一次初始化时会被调用,在之后函数的执行过程中该操作不会被调用】 
  20.  
  21.    (6)静态变量是只存在于函数作用域的变量,不过,在函数执行完成后,这种变量的值不会丢失, 
  22.  
  23.       也就是说,在下一次调用这个函数时,变量仍然会记得原来的值. 
  24.  
  25.       要将某个变量定义为静态的,只需要在变量前加上static关键字即可 
  26.  
  27.  */  
  28. function test(){  
  29.     static $var=5;  //static $var = 1+1;就会报错,不能使用表达式  
  30.     $var++;  
  31.     echo $var.'<br/>';  
  32. }  
  33.    
  34. test(); //结果:6  
  35. test(); //结果:7  
  36. test(); //结果:8  
  37. echo $var;//Notice:Undefined variable: var 即:不能在函数外部使用静态局部变量,获取不到值  
  38.   
  39.   
  40. /** 
  41.     类中的static静态属性和方法用什么作用? 
  42.   
  43.     (1)无论你实例化了多少个对象,static定义的属性和方法,都只有一个,只占有一次内存,节省了系统的内存开销 
  44.      
  45.     (2)访问static属性和方法时,只能用::访问 
  46.  
  47.     (3)静态成员是一种类变量,可以把它看成时属于整个类而不是属于类的某个实例。 
  48.  
  49.        与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的 
  50.  
  51.        也就是说,所有的实例共享这个成员 
  52.  
  53.     (4)$this只表示类的当前实例, 
  54.       
  55.        self::表示的是类本身,在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置。 
  56.  
  57.        也就是说,在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。 
  58.  
  59.        与$this不同的是,在使用静态变量时,必须在作用域限定符后面加上$符号 
  60.  
  61.        如: 
  62.             $this->name;//调用非静态属性 
  63.  
  64.             self::$name;//调用静态属性 
  65.  
  66.     (5)扩展类中,在基类的方法被重写的情况下,使用 parent 作用域调用定义在基类中的方法。 
  67.        
  68.        静态成员也可以只属于父类。如果在子类和父类中同时声明了某个成员,也可以使用parant::在子类中访问父类中的变量。 
  69.         
  70.        在这种情况下,父类的静态成员和子类的静态成员保存的是不同的值 
  71.       
  72.     (6)可以在::操作符的左边写上类的名称来静态地访问某个成员,这样避免创建类的实例. 
  73.      
  74.        不仅可以省略掉实例化类的代码,而且还会更高效,因为类的每个实例都会占用一小部分的系统资源 
  75.      
  76.     (7)案例: 
  77.  
  78.         <?php 
  79.             class visitors{ 
  80.                 private static $visitors = 0; 
  81.                 function __construct() 
  82.                 { 
  83.                      self::$visitors++; 
  84.                 } 
  85.                 static function getVisitors() 
  86.                 { 
  87.                     return self::$visitors; 
  88.                 } 
  89.             } 
  90.             $visits = new visitors(); 
  91.             echo visitors::getVisitors()."<br />";//结果:1 
  92.             $visits2 = new visitors(); 
  93.             echo visitors::getVisitors()."<br />";//结果:2 
  94.         ?> 
  95.  
  96.         因为$visitors字段声明为static,所以对其值的任何改变都会反映到所有实例化对象中。 
  97.          
  98.         还要注意,静态字段和方法应使用self关键字和类名来引用,而不是通过this和箭头操作符。 
  99.          
  100.         这是因为使用“正常”方法引用静态字段是不可能的,会导致语法错误。 
  101.  
  102.         不能在类中使用$this来引用为static字段 
  103.  
  104.     (8)静态方法: 
  105.  
  106.         静态方法和非静态方法之间有一个重要的区别:在调用静态方法时,不再需要拥有类的实例。 
  107.  
  108.         静态方法和非静态方法使用原则: 
  109.  
  110.             (1)、是如果某个方法中不包含$this变量,就应该时静态方法; 
  111.  
  112.             (2)、如果不需要类的实例,可能还应该使用静态类,这样可以免去实例化类的工作。 
  113.              
  114.             (3)、在静态方法中时不能使用$this变量的,因为静态方法不属于某个特定的实例。 
  115.  */  
  116.   
  117. ?>  

第67题:session机制:

 

[php] view plain copy
 
  1. <?php  
  2.   
  3.     /** 
  4.      * 【session.save_handler = files】:默认的session处理机制 
  5.      *      (1)session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的, 
  6.                但是有的系统是 session.gc_probability = 0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收 
  7.                 session.gc_probability = 1  //垃圾回收机制 
  8.                 session.gc_divisor = 1000   //垃圾回收机制 
  9.                 session.gc_maxlifetime = 1440//过期时间 默认24分钟 
  10.                 //垃圾回收的几率为:session.gc_probability/session.gc_divisor,即:1/1000,  
  11.                 //不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。 
  12.                 session.save_path = //好像不同的系统默认不一样,有一种设置是 "N;/path" 
  13.                 //这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本 
  14.  
  15.      *      (2)session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值;这个值可以从php.ini找到,session.name = PHPSESSID //默认值PHPSESSID 
  16.      *      (3)如果不存在会生成一个session_id,然后把生成的session_id作为COOKIE的值传递到客户端;相当于执行了下面COOKIE 操作,注意的是,这一步执行了setcookie()操作,COOKIE是在header头中发送的, 
  17.      *         这之前是不能有输出的,PHP有另外一个函数 session_regenerate_id() 如果使用这个函数,这之前也是不能有输出的 
  18.                 setcookie( 
  19.                           session_name(),//PHPSESSID,对应php.ini中session.name = PHPSESSID配置选项 
  20.                           session_id(),  //生成的session_id值 
  21.                           session.cookie_lifetime,//默认0 
  22.                           session.cookie_path,//默认'/'当前程序跟目录下都有效 
  23.                           session.cookie_domain,//默认为空 
  24.                 ) 
  25.      *      (4)如果存在session_id,那么session_id = $_COOKIE[session_name];然后去session.save_path指定的文件夹里去找名字为'SESS_'. session_id()的文件,读取文件的内容反序列化,然后放到$_SESSION中 
  26.      *      (5)为$_SESSION赋值: 
  27.      *         比如新添加一个值$_SESSION['test'] = 'blah';那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,会把$_SESSION的值写入到session_id指定的文件夹中,然后关闭相关资源 
  28.                这个阶段有可能执行更改session_id的操作,比如销毁一个旧的的session_id,生成一个全新的session_id. 
  29.                if (isset($_COOKIE[session_name()])) {//如:匿名用户有一个SESSION的,当它登录后需要换用新的session_id 
  30.                     setcookie(session_name(), '', time() - 42000, '/');//旧session cookie过期 
  31.                } 
  32.                session_regenerate_id();//这一步会生成新的session_id,此时再通过session_id()返回的是新的值 
  33.      *      (6)写入SESSION:在脚本结束的时候会执行SESSION写入操作,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,可能需要创建新的文件 
  34.      *      (7)销毁SESSION:SESSION发出去的COOKIE一般属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,比如 退出登录,而不是关闭浏览器,那么就需要在代码里销毁SESSION,方法有很多: 
  35.                setcookie(session_name(), session_id(), time() - 8000000, ..);//退出登录前执行 
  36.                usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有COOKIE传过来,但是没有数据 
  37.                session_destroy();//这个作用更彻底,删除$_SESSION 删除session文件,和session_id 
  38.      * 
  39.      * 【session.save_handler = user】:用户自定义session处理机制 
  40.      *      (1)用户自定义session处理机制:session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');//【执行此函数将修改session默认的存储介质;修改是隐式的,所以不会体现在php.ini配置文件中的session.save_handler配置项】 
  41.                session_start(): 
  42.                     执行open($save_path, $session_name)打开session操作句柄,$save_path 在session.save_handler = files的情况下它就是session.save_path;但是如果用户自定的话,这个两个参数都用不上,直接返回TRUE 
  43.                     执行read($id)从中读取数据.//【这个参数是自动传递的就是session_id()】,可以通过这个值进行操作 
  44.             (2)脚本执行结束:执行write($id, $sess_data) //两个参数,很简单 
  45.             (3)假如用户需要session_destroy(),先执行destroy.在执行第2步 
  46.             (4)案例: 
  47.                 <?php 
  48.                 //SESSION初始化的时候调用 
  49.                 function open($save_path, $session_name){ 
  50.                         global $sess_save_path; 
  51.                         $sess_save_path = $save_path; 
  52.                         return(true); 
  53.                 } 
  54.  
  55.                 //关闭的时候调用 
  56.                 function close(){ 
  57.                         return(true); 
  58.                 } 
  59.  
  60.                 function read($id){//【参数会自动传递,就是session_id()】 
  61.                         global $sess_save_path; 
  62.                         $sess_file = "$sess_save_path/sess_$id"; 
  63.                         return (string) @file_get_contents($sess_file); 
  64.                 } 
  65.  
  66.                 //脚本执行结束之前,执行写入操作 
  67.                 function write($id, $sess_data){//【参数会自动传递,就是session_id()】 
  68.                         echo "sdfsf"; 
  69.                         global $sess_save_path; 
  70.  
  71.                         $sess_file = "$sess_save_path/sess_$id"; 
  72.                         if ($fp = @fopen($sess_file, "w")) { 
  73.                           $return = fwrite($fp, $sess_data); 
  74.                           fclose($fp); 
  75.                           return $return; 
  76.                         } else { 
  77.                           return(false); 
  78.                         } 
  79.  
  80.                 } 
  81.  
  82.                 function destroy($id){//【参数会自动传递,就是session_id()】 
  83.                         global $sess_save_path; 
  84.  
  85.                         $sess_file = "$sess_save_path/sess_$id"; 
  86.                         return(@unlink($sess_file)); 
  87.                 } 
  88.  
  89.                 function gc($maxlifetime){ 
  90.                         global $sess_save_path; 
  91.  
  92.                         foreach (glob("$sess_save_path/sess_*") as $filename) { 
  93.                           if (filemtime($filename) + $maxlifetime < time()) { 
  94.                             @unlink($filename); 
  95.                           } 
  96.                         } 
  97.                         return true; 
  98.                 } 
  99.                 ?> 
  100.      * 
  101.      */  
  102.   
  103.   
  104.     //【session.save_handler = user】:用户自定义session处理机制  
  105.     $SESS_DBHOST = "127.0.0.1";    
  106.     $SESS_DBNAME = "cms";     
  107.     $SESS_DBUSER = "root";    
  108.     $SESS_DBPASS = "";     
  109.     
  110.     $SESS_DBH = ""; //数据库连接句柄    
  111.     $SESS_LIFE = get_cfg_var("session.gc_maxlifetime");//默认:8M  
  112.     
  113.     //SESSION初始化的时候调用  
  114.     function sess_open($save_path, $session_name) {     
  115.         global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;     
  116.   
  117.         if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {     
  118.             echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER";     
  119.             echo "<li>MySQL Error: " . mysql_error();     
  120.             die;     
  121.         }     
  122.   
  123.         if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {     
  124.             echo "<li>Unable to select database $SESS_DBNAME";     
  125.             die;     
  126.         }     
  127.   
  128.         return true;     
  129.     }     
  130.   
  131.     //关闭的时候调用  
  132.     function sess_close() {     
  133.         return true;     
  134.     }     
  135.   
  136.     function sess_read($key) {     
  137.         global $SESS_DBH, $SESS_LIFE;     
  138.   
  139.         $qry = "SELECT value FROM session_tbl WHERE sesskey = '$key' AND expiry > " . time();     
  140.         $qid = mysql_query($qry, $SESS_DBH);     
  141.   
  142.         if (list($value) = mysql_fetch_row($qid)) {     
  143.             return $value;     
  144.         }     
  145.   
  146.         return false;     
  147.     }     
  148.   
  149.     //脚本执行结束之前,执行写入操作  
  150.     function sess_write($key, $val) {   <span id="transmark"></span>  
  151.         global $SESS_DBH, $SESS_LIFE;     
  152.   
  153.         $expiry = time() + $SESS_LIFE; //过期时间     
  154.         $value = addslashes($val);     
  155.   
  156.         $qry = "INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')";     
  157.         $qid = mysql_query($qry, $SESS_DBH);     
  158.   
  159.         if (! $qid) {     
  160.             $qry = "UPDATE session_tbl SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();     
  161.             $qid = mysql_query($qry, $SESS_DBH);     
  162.         }     
  163.   
  164.         return $qid;     
  165.     }     
  166.   
  167.     function sess_destroy($key) {     
  168.         global $SESS_DBH;     
  169.   
  170.         $qry = "DELETE FROM session_tbl WHERE sesskey = '$key'";     
  171.         $qid = mysql_query($qry, $SESS_DBH);     
  172.   
  173.         return $qid;     
  174.     }     
  175.   
  176.     function sess_gc($maxlifetime) {     
  177.         global $SESS_DBH;     
  178.   
  179.         $qry = "DELETE FROM session_tbl WHERE expiry < " . time();     
  180.         $qid = mysql_query($qry, $SESS_DBH);     
  181.   
  182.         return mysql_affected_rows($SESS_DBH);     
  183.     }     
  184.   
  185.     //【session.save_handler = user】:用户自定义session处理机制主要是通过session_set_save_handler()来进行协调执行  
  186.     //【执行此函数将修改session默认的存储介质;修改是隐式的,所以不会体现在php.ini配置文件中的session.save_handler配置项】  
  187.     session_set_save_handler(     
  188.         "sess_open",    //可以进行重写  
  189.         "sess_close",   //可以进行重写  
  190.         "sess_read",    //可以进行重写  
  191.         "sess_write",   //可以进行重写  
  192.         "sess_destroy", //可以进行重写    
  193.         "sess_gc"       //可以进行重写  
  194.     );     
  195.     session_start();    //除了以上被重写的session函数外,其它的session函数还是想以前一样调用  
  196.     ?>  

第68题:PHP 的垃圾回收机制:

 

[php] view plain copy
 
  1. PHP垃圾回收机制是php5之后才有的这<span id="transmark"></span>个东西,下面我来给大家介绍一下关于PHP垃圾回收机制一些理解,希望对各位同学有所帮助。  
  2.   
  3. php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器 1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。  
  4.   
  5. “引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露;  
  6.   
  7. php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露  

 

第69题:将外网图片本地化、将外网图片下载到本地的原理

 

[php] view plain copy
 
  1. <?php  
  2. //将外网图片本地化、将外网图片下载到本地的原理  
  3. copy("http://image.v1.cn/vodone/20150723/303862_0x0.jpg",'e:/wamp/www/303862_0x0.jpg');  
  4. ?>  

第70题:PHP缓存技术总结

 

 

[php] view plain copy
 
  1. <?php  
  2.   
  3. /** 
  4.  
  5. 1、全页面静态化缓存 
  6. 也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系 
  7. 统中比较常见,比如dedecms; 
  8. 一种比较常用的实现方式是用输出缓存: 
  9. Ob_start() 
  10. ******要运行的代码******* 
  11. $content = Ob_get_contents(); 
  12. ****将缓存内容写入html文件***** 
  13. Ob_end_clean(); 
  14.  
  15.  
  16. 2、页面部分缓存 
  17. 该种方式,是将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示;可以使用类似于 
  18. ob_get_contents的方式实现,也可以利用类似ESI之类的页面片段缓存策略,使其用来做动态页面中相对静态的片段部分的缓存 
  19. (ESI技术,请baidu,此处不详讲)。该种方式可以用于如商城中的商品页; 
  20.  
  21.  
  22. 3、数据缓存 
  23. 顾名思义,就是缓存数据的一种方式;比如,商城中的某个商品信息,当用商品id去请求时,就会得出包括店铺信息、商品信息 
  24. 等数据,此时就可以将这些数据缓存到一个php文件中,文件名包含商品id来建一个唯一标示;下一次有人想查看这个商品时,首 
  25. 先就直接调这个文件里面的信息,而不用再去数据库查询;其实缓存文件中缓存的就是一个php数组之类; 
  26. Ecmall商城系统里面就用了这种方式; 
  27.  
  28.  
  29. 4、查询缓存 
  30. 其实这跟数据缓存是一个思路,就是根据查询语句来缓存;将查询得到的数据缓存在一个文件中,下次遇到相同的查询时,就直 
  31. 接先从这个文件里面调数据,不会再去查数据库;但此处的缓存文件名可能就需要以查询语句为基点来建立唯一标示(用md5($sql)???); 
  32. 按时间变更进行缓存 
  33. 其实,这一条不是真正的缓存方式;上面的2、3、4的缓存技术一般都用到了时间变更判断;就是对于缓存文件您需要设一个有效 
  34. 时间,在这个有效时间内,相同的访问才会先取缓存文件的内容,但是超过设定的缓存时间,就需要重新从数据库中获取数据, 
  35. 并生产最新的缓存文件; 
  36. 比如,我将我们商城的首页就是设置2个小时更新一次; 
  37.  
  38.  
  39. 5、按内容变更进行缓存 
  40. 这个也并非独立的缓存技术,需结合着用;就是当数据库内容被修改时,即刻更新缓存文件; 
  41. 比如,一个人流量很大的商城,商品很多,商品表必然比较大,这表的压力也比较重;我们就可以对商品显示页进行页面缓存; 
  42. 当商家在后台修改这个商品的信息时,点击保存,我们同时就更新缓存文件;那么,买家访问这个商品信息时,实际上访问的是 
  43. 一个静态页面,而不需要再去访问数据库; 
  44. 是想,如果对商品页不缓存,那么每次访问一个商品就要去数据库查一次,如果有10万人在线浏览商品,那服务器压力就大了; 
  45.  
  46.  
  47. 6、内存式缓存 
  48. 提到这个,可能大家想到的首先就是Memcached;memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数 
  49. 据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。 
  50. 它就是将需要缓存的信息,缓存到系统内存中,需要获取信息时,直接到内存中取;比较常用的方式就是 key-->value方式; 
  51.      $memcachehost = '192.168.6.191'; 
  52.      $memcacheport = 11211; 
  53.      $memcachelife = 60; 
  54.      $memcache = new Memcache; 
  55.      $memcache->connect($memcachehost,$memcacheport) or die ("Could not connect"); 
  56.      $memcache->set('key','缓存的内容'); 
  57.      $get = $memcache->get($key);       //获取信息 
  58.  
  59.  
  60. 7、apache缓存模块 
  61. apache安装完以后,是不允许被cache的。如果外接了cache或squid服务器要求进行web加速的话,就需要在htttpd.conf里进行设 
  62. 置,当然前提是在安装apache的时候要激活mod_cache的模块。 
  63. 安装apache时:./configure --enable-cache --enable-disk-cache --enable-mem-cache 
  64.  
  65.  
  66. 8、php APC缓存扩展 
  67. Php有一个APC缓存扩展,windows下面为php_apc.dll,需要先加载这个模块,然后是在php.ini里面进行配置: 
  68. [apc]  
  69.      extension=php_apc.dll  
  70.      apc.rfc1867 = on  
  71.      upload_max_filesize = 100M  
  72.      post_max_size = 100M  
  73.      apc.max_file_size = 200M  
  74.      upload_max_filesize = 1000M  
  75.      post_max_size = 1000M  
  76.      max_execution_time = 600 ;   每个PHP页面运行的最大时间值(秒),默认30秒  
  77.      max_input_time = 600 ;       每个PHP页面接收数据所需的最大时间,默认60  
  78.      memory_limit = 128M ;       每个PHP页面所吃掉的最大内存,默认8M 
  79.  
  80.  
  81. 9、Opcode缓存 
  82. 我们知道,php的执行流程可以用下图来展示: 
  83. php的执行流程 
  84. 首先php代码被解析为Tokens,然后再编译为Opcode码,最后执行Opcode码,返回结果;所以,对于相同的php文件,第一次运行 
  85. 时可以缓存其Opcode码,下次再执行这个页面时,直接会去找到缓存下的opcode码,直接执行最后一步,而不再需要中间的步骤了。 
  86. 比较知名的是XCache、Turck MM Cache、PHP Accelerator等; 
  87.  
  88. **/  
  89.   
  90. ?>  

第71题:xml文档中的CDATA

 

[php] view plain copy
 
  1. <?php  
  2.   
  3. /** 
  4.  *   
  5.  *  xml文档中的CDATA: 
  6.  * 
  7.  *      1、所有xml文档中的文本均会被解析器解析,只有CDATA区段(CDATA section)中的文本会被解析器忽略 
  8.  *      2、术语CDATA指的是不应由xml解析器进行解析的文本数据(Unparsed Character Data) 
  9.  *      3、CDATA部分不能包含字符串 "]]>",也不允许嵌套的CDATA部分;标记CDATA 部分结尾的 "]]>" 不能包含空格或折行 
  10.  *      4、CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束,CDATA 部分中的所有内容都会被解析器忽略 
  11.  *      5、在 XML 元素中,"<" 和 "&" 是非法的; "<" 会产生错误,因为解析器会把该字符解释为新元素的开始;"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始 
  12.          
  13.         案例: 
  14.         <document> 
  15.             <webName>优酷网</webName> 
  16.             <webSite>www.youku.com</webSite> 
  17.             <item id="1">...</item> 
  18.             <item id="2">...</item> 
  19.             <item id="3"> 
  20.                 <title> 
  21.                     <![CDATA[ 唱说天下:银幕上“不搭配”的情侣档 ]]> 
  22.                 </title> 
  23.                 <category> 
  24.                     <![CDATA[ 娱乐 ]]> 
  25.                 </category> 
  26.                 <subcat> 
  27.                     <![CDATA[ 娱乐咨询 ]]> 
  28.                 </subcat> 
  29.                 <image> 
  30.                     <![CDATA[ 
  31.                     http://p01.youku.com/group2/M00/05/3D/ChQB0FW1udWAWwAHA16bTNZsaI03768-b.jpg 
  32.                     ]]> 
  33.                 </image> 
  34.                 <link> 
  35.                     <![CDATA[ 
  36.                     http://www.youku.com/player/youku/youku_player.swf?autoPlay=true&showAD=true&videoFrom=2345&videoUrl=http://f01.youku.com/group2/M00/05/3D/ChQB0FW1udWZs.flv 
  37.                     ]]> 
  38.                 </link> 
  39.                 <duration> 
  40.                     <![CDATA[ 00:02:27 ]]> 
  41.                 </duration> 
  42.                 <publish> 
  43.                     <![CDATA[ 2015-07-27 12:56:17 ]]> 
  44.                 </publish> 
  45.                 <tag> 
  46.                     <![CDATA[ 银幕,情侣档 ]]> 
  47.                 </tag> 
  48.                 <introduction> 
  49.                     <![CDATA[ 唱说天下:银幕上“不搭配”的情侣档 ]]> 
  50.                 </introduction> 
  51.                 <count> 
  52.                     <![CDATA[ 0 ]]> 
  53.                 </count> 
  54.             </item> 
  55.         </document> 
  56.  * 
  57.  */  
  58. ?>  

第72题:如何列出目录下的所有模板文件?遍历文件夹、遍历文件、遍历目录及子目录、遍历文件夹及子文件夹

 

[php] view plain copy
 
  1. <?php  
  2.   
  3. /** 
  4.  *  Array 
  5.     [0] => E:/wamp/www/phpcms/phpcms/templates/default/content/category.html 
  6.     [1] => E:/wamp/www/phpcms/phpcms/templates/default/content/category_download.html 
  7.     [2] => E:/wamp/www/phpcms/phpcms/templates/default/content/category_picture.html 
  8.     [3] => E:/wamp/www/phpcms/phpcms/templates/default/content/category_video.html 
  9.     [4] => E:/wamp/www/phpcms/phpcms/templates/default/content/download.html 
  10.     [5] => E:/wamp/www/phpcms/phpcms/templates/default/content/footer.html 
  11.     [6] => E:/wamp/www/phpcms/phpcms/templates/default/content/header.html 
  12.     [7] => E:/wamp/www/phpcms/phpcms/templates/default/content/header_min.html 
  13.     [8] => E:/wamp/www/phpcms/phpcms/templates/default/content/header_page.html 
  14.     [9] => E:/wamp/www/phpcms/phpcms/templates/default/content/index.html 
  15.     [10] => E:/wamp/www/phpcms/phpcms/templates/default/content/list.html 
  16.     [11] => E:/wamp/www/phpcms/phpcms/templates/default/content/list_download.html 
  17.     [12] => E:/wamp/www/phpcms/phpcms/templates/default/content/list_picture.html 
  18.     [13] => E:/wamp/www/phpcms/phpcms/templates/default/content/list_video.html 
  19.     [14] => E:/wamp/www/phpcms/phpcms/templates/default/content/message.html 
  20.     [15] => E:/wamp/www/phpcms/phpcms/templates/default/content/page.html 
  21.     [16] => E:/wamp/www/phpcms/phpcms/templates/default/content/play_list.html 
  22.     [17] => E:/wamp/www/phpcms/phpcms/templates/default/content/rss.html 
  23.     [18] => E:/wamp/www/phpcms/phpcms/templates/default/content/search.html 
  24.     [19] => E:/wamp/www/phpcms/phpcms/templates/default/content/show.html 
  25.     [20] => E:/wamp/www/phpcms/phpcms/templates/default/content/show_download.html 
  26.     [21] => E:/wamp/www/phpcms/phpcms/templates/default/content/show_picture.html 
  27.     [22] => E:/wamp/www/phpcms/phpcms/templates/default/content/show_video.html 
  28.     [23] => E:/wamp/www/phpcms/phpcms/templates/default/content/show_videolist.html 
  29.     [24] => E:/wamp/www/phpcms/phpcms/templates/default/content/tag.html 
  30.     [25] => E:/wamp/www/phpcms/phpcms/templates/default/content/tag_list.html 
  31.     [26] => E:/wamp/www/phpcms/phpcms/templates/default/content/video_album.html 
  32.     [27] => E:/wamp/www/phpcms/phpcms/templates/default/content/video_for_ck.html 
  33.  */  
  34. echo "<pre>";  
  35. print_r(glob('E:/wamp/www/phpcms/phpcms/templates/default/content/*.html'));  
  36. //print_r(glob('E:/wamp/www/phpcms/phpcms/templates/default/content/video_*.html'));  
  37.   
  38.   
  39. /**  
  40.  *  Array  
  41. (  
  42.     [0] => category.html  
  43.     [1] => category_download.html  
  44.     [2] => category_picture.html  
  45.     [3] => category_video.html  
  46.     [4] => download.html  
  47.     [5] => footer.html  
  48.     [6] => header.html  
  49.     [7] => header_min.html  
  50.     [8] => header_page.html  
  51.     [9] => index.html  
  52.     [10] => list.html  
  53.     [11] => list_download.html  
  54.     [12] => list_picture.html  
  55.     [13] => list_video.html  
  56.     [14] => message.html  
  57.     [15] => page.html  
  58.     [16] => play_list.html  
  59.     [17] => rss.html  
  60.     [18] => search.html  
  61.     [19] => show.html  
  62.     [20] => show_download.html  
  63.     [21] => show_picture.html  
  64.     [22] => show_video.html  
  65.     [23] => show_videolist.html  
  66.     [24] => tag.html  
  67.     [25] => tag_list.html  
  68.     [26] => video_album.html  
  69.     [27] => video_for_ck.html  
  70. )  
  71.  */  
  72. echo "<pre>";  
  73. print_r(@array_map('basename',glob('E:/wamp/www/phpcms/phpcms/templates/default/content/*.html')));//array_map()回调函数  
  74. //print_r(@array_map('basename',glob('E:/wamp/www/phpcms/phpcms/templates/default/content/video_*.html')));//array_map()回调函数  
  75.   
  76.   
  77. ?>  

第74题:遍历函数:scandir()与glob()函数的区别

 

[php] view plain copy
 
  1. <?php  
  2.   
  3. /** 
  4.  *  scandir()与glob()函数的区别: 
  5.  * 
  6.  *  遍历文件夹、遍历目录、遍历子文件夹、遍历子目录、遍历文件 
  7.  *  扫描单层文件夹的情况 
  8.         1、scandir('E:/wamp/www/phpcms/'); 
  9.  
  10.             案例: 
  11.  
  12.             Array( 
  13.                 [0] => . 
  14.                 [1] => .. 
  15.                 [2] => admin.php 
  16.                 [3] => api 
  17.                 [4] => api.php 
  18.                 [5] => caches 
  19.                 [6] => crossdomain.xml 
  20.                 [7] => favicon.ico 
  21.                 [8] => html 
  22.                 [9] => index.html 
  23.                 [10] => index.php 
  24.                 [11] => js.html 
  25.                 [12] => nbproject 
  26.                 [13] => phpcms 
  27.                 [14] => phpsso_server 
  28.                 [15] => plugin.php 
  29.                 [16] => robots.txt 
  30.                 [17] => statics 
  31.                 [18] => uploadfile 
  32.             ) 
  33.  
  34.         2、glob('E:/wamp/www/phpcms/*'); 
  35.  
  36.             案例: 
  37.  
  38.             Array( 
  39.                 [0] => E:/wamp/www/phpcms/admin.php 
  40.                 [1] => E:/wamp/www/phpcms/api 
  41.                 [2] => E:/wamp/www/phpcms/api.php 
  42.                 [3] => E:/wamp/www/phpcms/caches 
  43.                 [4] => E:/wamp/www/phpcms/crossdomain.xml 
  44.                 [5] => E:/wamp/www/phpcms/favicon.ico 
  45.                 [6] => E:/wamp/www/phpcms/html 
  46.                 [7] => E:/wamp/www/phpcms/index.html 
  47.                 [8] => E:/wamp/www/phpcms/index.php 
  48.                 [9] => E:/wamp/www/phpcms/js.html 
  49.                 [10] => E:/wamp/www/phpcms/nbproject 
  50.                 [11] => E:/wamp/www/phpcms/phpcms 
  51.                 [12] => E:/wamp/www/phpcms/phpsso_server 
  52.                 [13] => E:/wamp/www/phpcms/plugin.php 
  53.                 [14] => E:/wamp/www/phpcms/robots.txt 
  54.                 [15] => E:/wamp/www/phpcms/statics 
  55.                 [16] => E:/wamp/www/phpcms/uploadfile 
  56.             ) 
  57.  */  
  58. echo "<pre>";print_r(scandir('E:/wamp/www/phpcms/'));//跟glob相比多出来两个元素,分别是: "." 和 ".."  
  59. echo "<pre>";print_r(glob('E:/wamp/www/phpcms/*'));//以数组的形式返回与指定模式相匹配的文件名或目录  
  60. ?>  

第75题:var_export()函数用法:

 

[php] view plain copy
 
  1. <?php  
  2.   
  3. /** 
  4. * 将字符串转换为数组 
  5. * @param    string  $data   字符串 
  6. * @return   array   返回数组格式,如果,data为空,则返回空数组 
  7.  
  8.   结果: 
  9.  
  10.     Array( 
  11.         [ishtml] => 1 
  12.         [template_list] => default 
  13.         [page_template] => page 
  14.         [meta_title] =>  
  15.         [meta_keywords] =>  
  16.         [meta_description] =>  
  17.         [category_ruleid] => 1 
  18.         [show_ruleid] =>  
  19.         [repeatchargedays] => 1 
  20.     ) 
  21.  
  22. */  
  23. function string2array($data) {  
  24.     if($data == '') return array();  
  25.     @eval("\$array = $data;");  
  26.     return $array;  
  27. }  
  28.   
  29. $data='array (  
  30.   \'ishtml\' => \'1\',  
  31.   \'template_list\' => \'default\',  
  32.   \'page_template\' => \'page\',  
  33.   \'meta_title\' => \'\',  
  34.   \'meta_keywords\' => \'\',  
  35.   \'meta_description\' => \'\',  
  36.   \'category_ruleid\' => \'1\',  
  37.   \'show_ruleid\' => \'\',  
  38.   \'repeatchargedays\' => \'1\',  
  39. )';  
  40.   
  41. echo "<pre>";print_r(string2array($data));  
  42.   
  43.   
  44.   
  45.   
  46. $arr=array(  
  47.     'username'=>'admin',  
  48.     'password'=>'123'  
  49. );  
  50.   
  51. /** 
  52.  *  var_export()函数:返回字符串 
  53.  */  
  54.   
  55. $str=var_export($arr,true);//返回的是合法的php代码,是一个字符串,不是数组  
  56.   
  57. /** 
  58.  *  结果:数组格式的字符串 
  59.  
  60.         array ( 
  61.           'username' => 'admin', 
  62.           'password' => '123', 
  63.         ) 
  64.  */  
  65. echo $str;//正确  
  66. //echo $str['username'];//错误,因为此时$str是一个数组格式的字符串,不是数组  
  67.   
  68. @eval("\$str = $str;");//将数组格式的字符串转换为数组  
  69. print_r($str['username']);//结果:'admin',此时已将数组格式的字符串转化为数组  
  70.   
  71. ?>  
目录:
51、php中如何统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数
52、php中如何统计字符串中每种字符的出现次数并排序?
53、php中使用str_word_count()函数计算字符串中的单词数?
56、php中redis与memcached区别?
57、php中memcached的使用案例?
58、php中文件缓存的使用案例?
59、php中redis使用案例?
60、php如何读取php.ini配置文件中的配置选项的值?
61、php中如何动态的调用一个函数?
62、php中__call魔术方法的使用
63、php中如何解析php.ini配置文件?
65、php中的重写与重载的区别?
66、php中static静态局部变量(不是数组)在函数中的使用
67、php中session的内部机制实现原理
68、php中的垃圾回收机制
69、php如何将外网图片本地化或将外网图片下载到本地的原理?
70、php中缓存技术总结
71、php中xml文档的CDATA理解
72、php中如何列出目录下的所有模板文件?遍历文件夹、遍历文件、遍历目录及子目录、遍历文件夹及子文件夹
74、php中遍历函数:scandir()与glob()函数的区别?
75、php中通过var_export()函数返回数组格式的字符串
posted @ 2017-11-27 19:19  御世制人  阅读(218)  评论(0编辑  收藏  举报