PHP常见面试题汇总(二)

PHP常见面试题汇总(二),第1张

概述PHP常见面试题汇总(二)  //第51题:统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数  $array=array(4,5,1,2,3,1,2,"a","a");    $ac=array_count_values($array);    /**  * 输出结果:  * A PHP常见面试题汇总(二)  @H_301_1@//第51题:统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数  $array=array(4,5,1,2,3,1,2,"a","a");  @H_301_1@  $ac=array_count_values($array);  @H_301_1@  /** @H_301_1@ * 输出结果:  * Array( @H_301_1@ *   [4] => 1  *   [5] => 1 @H_301_1@ *   [1] => 2  *   [2] => 2 @H_301_1@ *   [3] => 1  *   [a] => 2 @H_301_1@ * )  */  @H_301_1@echo "<pre>";print_r($ac);  [PHP] view plain copy @H_301_1@//第52题:如何统计字符串中每种字符的出现次数并排序?  function countStr($str){   @H_301_1@    $str_array=str_split($str);//str_split()函数能将字符串中每个字符都转化为数组的元素       $str_array=array_count_values($str_array);   @H_301_1@    arsort($str_array);//arsort()函数对数组进行逆向排序并保持索引关系      return $str_array;  @H_301_1@}   $str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas";  @H_301_1@/**  * 输出结果: @H_301_1@ * Array(     [$] => 7 @H_301_1@    [3] => 6     [*] => 6 @H_301_1@    [4] => 5     [f] => 5 @H_301_1@    [s] => 4     [d] => 4 @H_301_1@    [5] => 3     [a] => 3 @H_301_1@    [6] => 2     [2] => 2 @H_301_1@    [g] => 2     [#] => 2 @H_301_1@  )  */  @H_301_1@echo "<pre>";print_r(countStr($str));   [PHP] view plain copy @H_301_1@//第53题:str_word_count() 函数计算字符串中的单词数?    @H_301_1@/**  * 输出结果:2 @H_301_1@ */  echo str_word_count("Hello world!");//参数二:默认0,返回单词的数目  @H_301_1@  /** @H_301_1@ * 输出结果:    Array( @H_301_1@    [0] => Hello     [1] => world @H_301_1@   )  */  @H_301_1@echo "<pre>";print_r(str_word_count("Hello world!",1));//参数二:1-返回包含字符串中的单词的数组    @H_301_1@/**  * 输出结果: @H_301_1@   Array(     [0] => Hello @H_301_1@    [6] => world    ) @H_301_1@ */  echo "<pre>";print_r(str_word_count("Hello world!",2));//参数二:2-返回一个数组,其中的键是单词在字符串中的位置,值是实际的单词.  [PHP] view plain copy @H_301_1@<?PHP  /** @H_301_1@ *  第56题:redis与memcached区别?  * @H_301_1@ *  不同点:  * @H_301_1@ *      (1)redis中并不是所有数据在有效期内只能常驻内存的(如果需要,可定期同步持久化到磁盘),这是和memcached相比一个最大的区别(memcached中的数据在有效期内是以键值对的形式常驻内存的)  *      (2)redis不仅仅支持简单的键值对类型的数据,同时还提供List,set,hash等数据结构的存储;memcached仅支持简单的键值对类型的数据,但是memcached却可以缓存图片、视频等等数据 @H_301_1@ *      (3)redis支持数据的备份,即master-slave模式的数据备份  *      (4)redis支持数据的持久化和数据同步,可以将内存中的数据保存在磁盘中,重启系统后可以再次加载进行使用,缓存数据不会因此而丢失.memached缓存数据是常驻内存的,重启系统后数据就没了 @H_301_1@ *      (5)redis可以通过expire设定有效期,memcached在set数据的时候可以指定要缓存的数据永不过期  *      (6)redis可以做一主多从;memcached也可以做一主多从 @H_301_1@ *      (7)redis当物理内存用完时,可以将一些很久没用到的value交换到磁盘;memcached当物理内存用完后就会自动清理一些早期的数据  * @H_301_1@ *  相同点:  * @H_301_1@ *      (1)redis和memcached都是将数据存放在内存中,都是内存数据库  *      (2)redis和memcached都可以做一主多从 @H_301_1@ *  *  性能: @H_301_1@ *  *      (1)redis根据其官方的测试结果:在50个并发的情况下请求10w次,写的速度是110000次/s,读的速度是81000次/s @H_301_1@ *      (2)redis将键名与值的最大上限各自设定为512MB;memcached则<span ID="transmark"></span>将键名限制在250字节,值也被限制在不超过1MB,且只适用于普通字符串.  * @H_301_1@ *      何时使用memcached:  * @H_301_1@ *      (1)小型静态数据:当我们需要缓存小型静态数据的时候可以考虑memcached,最具代表性的例子就是HTML代码片段;因为memcached的内部内存管理机制虽然不像redis的那样复杂,但却更具实际效率,这是因为memcached在处理元数据时所消耗的内存资源相对更少.作为memcached所支持的惟一一种数据类型,字符串非常适合用于保存那些只需要进行读取 *** 作的数据,因为字符串本身无需进行进一步处理<span ID="transmark"></span>.  * @H_301_1@ */  ?>  @H_301_1@   
[PHP] view plain copy @H_301_1@<?PHP  //第57题:memcached的使用案例  @H_301_1@  //第一步:获取数据  @H_301_1@function get_data(){      $sql = "SELECT * from order_master ";//一般来说都是超级复杂的SQL语句  @H_301_1@    return $this->db->cache_all($sql);//获取缓存数据(如果缓存数据过期,则重新查询数据库并将查询到的数据放到memcache中并返回)  }  @H_301_1@  //第二步:获取memcache中缓存数据  @H_301_1@public function cache_all($sql, $reload = false, $limit = null) {//参数1-SQL语句、参数2-是否从数据库中重新获取数据并写入memcache、参数3-每次获取记录数量      $this->reload = $reload;  @H_301_1@    $sql = $this->get_query_sql($sql, $limit);//拼接SQL语句,如:'select * from order_master limit 0,10'      return $this->get_cache($sql, 'get_all');//参数1-拼接的sql、参数2-要执行的方法名;将SQL语句作为参数调用get_all()方法  @H_301_1@}    @H_301_1@//第三步:从memcache中获取缓存数据 提示:1、如果缓存数据过期,则重新查询数据库并将查询结果放到memcache缓存中,返回数据. 2、如果缓存数据未过期,则直接获取缓存数据  protected function get_cache($sql,$method) {  @H_301_1@    $cache_file = md5($sql.$method);//memcache中缓存数据的键名,格式:键名=md5(SQL语句+方法名) 提示:一定要保证键名唯一      $res = $this->cache->get($cache_file);//根据缓存数据的键名获取键值  @H_301_1@    if(!$res) {//memcache中缓存数据过期的情况//如果memcache中缓存数据过期,则重新从数据库中获取数据,并将结果以键值对形式存储到memcache中          $res= $this->$method($sql);//调用 $this->get_all($sql);//直接从数据库中获取数据并返回  @H_301_1@        if($res && $this->cache_mark && !$this->reload) {              $this->cache->set($cache_file, $res);//将数据库中查询到的数据以键值对形式set到memcache缓存中  @H_301_1@        }      }  @H_301_1@    return $res;//返回数据  }  @H_301_1@  //第四步:直接从数据库中获取数据并返回  @H_301_1@public function get_all($sql, $limit = null, $fetch_mode = MysqLI_ASSOC) {      $this->query($sql, $limit);  @H_301_1@    $all_rows = array();      $this->fetch_mode = $fetch_mode;  @H_301_1@    while($rows = $this->fetch()) {          $all_rows[] = $rows;  @H_301_1@    }      $this->free();  @H_301_1@    return $all_rows;  }  @H_301_1@?>  
[PHP] view plain copy @H_301_1@//第58题:文件缓存的使用案例  public function &get($key, $cache_time = '') {  @H_301_1@        if(empty ($cache_time)) {              $cache_time = $this->cache_time;//缓存时间  @H_301_1@        } else {              $cache_time = intval($cache_time);//缓存时间  @H_301_1@        }          $cache_encode_key  = $this->get_key($key);//获取一个唯一的长字符串  @H_301_1@                //缓存文件的命名和缓存文件的存放位置          $filename = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/'.$cache_encode_key.".cache.PHP";  @H_301_1@        if(!is_file($filename) || time() - filemtime($filename) > $cache_time) {//如果缓存文件不存在或者缓存文件过期,则返回false              return false;  @H_301_1@        } else {              return unserialize(file_get_contents($filename));//如果缓存文件存在且未过期,那么读取缓存文件内容并返回  @H_301_1@        }      }  @H_301_1@    public function set($key,$data) {          $cache_encode_key  = $this->get_key($key);  @H_301_1@        $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";//缓存文件名  @H_301_1@        if( $this->mkpath($cache_dir) ) {//递归创建缓存目录              $out    = serialize($data);//将要缓存的数据序列化  @H_301_1@            file_put_contents($filename, $out);//将序列化的数据写入到缓存文件中          }  @H_301_1@    }      public function add($key, $data) {  @H_301_1@        $cache_encode_key   = $this->get_key($key);          $cache_dir  = $this->cache_dir.'/'.substr($cache_encode_key,0,2).'/'.substr($cache_encode_key,2,2).'/';//缓存目录  @H_301_1@        $filename   = $cache_dir.$cache_encode_key.".cache.PHP";//缓存文件名          if(is_file($filename)) {//如果缓存文件存在,则返回false  @H_301_1@            return false;          } else {//如果缓存文件不存在,则生成一个新的缓存文件到缓存目录  @H_301_1@            $this->set($key, $data);          }  @H_301_1@    }      public function del($key) {  @H_301_1@        $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>  @H_301_1@        $filename   = $cache_dir.$cache_encode_key.".cache.PHP";//缓存文件名          if(is_file($filename)) {//如果缓存文件存在则返回false<span ID="transmark"></span>  @H_301_1@            return false;          } else {//如果缓存文件不存在,则删除缓存文件  @H_301_1@            @unlink($filename);          }  @H_301_1@    }    @H_301_1@        public function get_key($key){                  return md5(CACHE_KEY.$key);//md5加密字符串  @H_301_1@        }  [PHP] view plain copy @H_301_1@//第59题:redis使用案例  //推送活动商品上线  @H_301_1@      public function push_activity_goods_online($data) {  @H_301_1@        $key = sprintf($this->config->item('activity_goods_push_key'), $data['goods_ID']);    @H_301_1@        $this->cache->redis->delete($key);          $this->load->driver('cache', array('adapter' => 'redis'));  @H_301_1@        return $this->cache->redis->hmset($key, $data);      }  @H_301_1@      //拉取上线活动商品  @H_301_1@      public function pull_activity_goods_online($key) {  @H_301_1@        $key = sprintf($this->config->item('activity_goods_push_key'), $key);          $this->load->driver('cache', array('adapter' => 'redis'));  @H_301_1@          return $this->cache->redis->hgetall($key);  @H_301_1@    }    @H_301_1@    //删除上线的活动商品    @H_301_1@    public function del_activity_goods_online($key) {          $key = sprintf($this->config->item('activity_goods_push_key'), $key);  @H_301_1@        $this->load->driver('cache', array('adapter' => 'redis'));          return $this->cache->redis->delete($key);  @H_301_1@    }    @H_301_1@    //推送活动上线    @H_301_1@    public function push_activity_online($data) {    @H_301_1@        $activity_push_key = $this->config->item('activity_push_key');          //非通用平台作用哉活动,活动前缀+平台作用域  @H_301_1@        if (isset($data['plateform']) && ($data['plateform']) != 'all') {              $activity_push_key = $data['plateform'] . ':' . $activity_push_key;  @H_301_1@        }    @H_301_1@        //订单促销          if ($data['activity_range'] == 1) {  @H_301_1@            $key = sprintf($activity_push_key, 'order');          } else {  @H_301_1@            $key = sprintf($activity_push_key, $data['activity_ID']);          }  @H_301_1@          $this->cache->redis->delete($key);  @H_301_1@        $this->load->driver('cache', array('adapter' => 'redis'));          return $this->cache->redis->hmset($key, $data);  @H_301_1@    }    @H_301_1@    //拉取上线活动    @H_301_1@    public function pull_activity_online($key) {          if ($key == 'order') {  @H_301_1@            $key = sprintf($this->config->item('activity_push_key'), 'order');          }if ($key == 'mobile:order') {  @H_301_1@            $key = "mobile:" . sprintf($this->config->item('activity_push_key'), 'order');          } else {  @H_301_1@            $key = sprintf($this->config->item('activity_push_key'), $key);          }  @H_301_1@          $this->load->driver('cache', array('adapter' => 'redis'));  @H_301_1@          return $this->cache->redis->hgetall($key);  @H_301_1@    }    @H_301_1@    //删除上线的活动    @H_301_1@    public function del_activity_online($key, $activity = array()) {          $activity_push_key = $this->config->item('activity_push_key');  @H_301_1@          //非通用平台作用哉活动,活动前缀+平台作用域  @H_301_1@        if (isset($activity['plateform']) && ($activity['plateform']) != 'all') {              $activity_push_key = $activity['plateform'] . ':' . $activity_push_key;  @H_301_1@        }          $key = sprintf($activity_push_key, $key);  @H_301_1@        $this->load->driver('cache', array('adapter' => 'redis'));          //echo "redis->delete:" . $key . "\r\n<br>";  @H_301_1@        return $this->cache->redis->delete($key);      }  @H_301_1@      //获取全部活动  @H_301_1@    public function pull_all_activity_online() {          $aIDs = array();  @H_301_1@        $key = "*" . sprintf($this->config->item('activity_push_key'), "*");          $this->load->driver('cache', array('adapter' => 'redis'));  @H_301_1@        $hashname = $this->cache->redis->keys($key);          if (is_array($hashname)) {  @H_301_1@            $prefix_key = str_replace("%s", '', $this->config->item('activity_push_key'));              foreach ($hashname as $key => $value) {  @H_301_1@                /* if ($value == ($prefix_key . "order")) {                   continue; @H_301_1@                  } */                  $aID = str_replace($prefix_key, "", $value);  @H_301_1@                $aIDs[] = $aID;              }  @H_301_1@            return $aIDs;          } else {  @H_301_1@            return null;          }  @H_301_1@    }    @H_301_1@    //获取所有活动商品      public function pull_all_activity_goods_online() {  @H_301_1@        $aIDs = array();          $key = sprintf($this->config->item('activity_goods_push_key'), "*");  @H_301_1@        $this->load->driver('cache', array('adapter' => 'redis'));          $hashname = $this->cache->redis->keys($key);  @H_301_1@        if (is_array($hashname)) {              $prefix_key = str_replace("%s", '', $this->config->item('activity_goods_push_key'));  @H_301_1@            foreach ($hashname as $key => $value) {                  $aID = str_replace($prefix_key, "", $value);  @H_301_1@                $aIDs[] = $aID;              }  @H_301_1@            return $aIDs;          } else {  @H_301_1@            return null;          }  @H_301_1@    }    @H_301_1@    //获取线上活动商品by goods_ID      public function get_activity_goods_online($product_ID) {  @H_301_1@        if (empty($product_ID)) {              return false;  @H_301_1@        }          $activity_goods = $this->pull_activity_goods_online($product_ID);  @H_301_1@          if (!empty($activity_goods)) {  @H_301_1@            return $activity_goods;          }  @H_301_1@          return false;  @H_301_1@    }  [PHP] view plain copy @H_301_1@//第60题:PHP如何读取PHP.ini配置文件中的配置选项的值  echo ini_get('post_max_size');//获取上传文件的最大尺寸  @H_301_1@echo get_cfg_var('post_max_size');//获取上传文件的最大尺寸  [PHP] view plain copy @H_301_1@//第61题:PHP中如何动态的调用一个函数  $name_List = '小强,张三,李四,王五,马六';  @H_301_1@$funname = 'explode';//函数名当作字符串  echo "<pre>";print_r($funname(',',$name_List));  @H_301_1@echo "<pre>";print_r(call_user_func_array($funname,array(',',$name_List)));    @H_301_1@/**  * 结果: @H_301_1@ *  Array(  *      [0] => 小强  @H_301_1@ *      [1] => 张三  *      [2] => 李四 @H_301_1@ *      [3] => 王五  *      [4] => 马六 @H_301_1@ *  )  * @H_301_1@ *  Array(  *      [0] => 小强 @H_301_1@ *      [1] => 张三   *      [2] => 李四 @H_301_1@ *      [3] => 王五  *      [4] => 马六 @H_301_1@ *  )  */  [PHP] view plain copy @H_301_1@/**  *第62题:__call是魔术方法 @H_301_1@ *      __call是魔术方法是指请求的方法不存在的时候采用的哪种处理方式;如果请求的方法名存在(跟参数列表无关),则不会调用此魔术方法  */  @H_301_1@class MethodTest {       /** @H_301_1@      * 再如:       *       public function __call($funname, $args){//参数1-要调用的方法名   参数2-传递给要调用方法的参数列表 @H_301_1@      *             switch (count($args)) {       *                 case 0: @H_301_1@      *                     return $this->$funname();       *                 case 1: @H_301_1@      *                     return $this->$funname($args[0]);       *                 case 2: @H_301_1@      *                     return $this->$funname($args[0], $args[1]);       *                 case 3: @H_301_1@      *                     return $this->$funname($args[0], $args[1], $args[2]);       *                 case 4: @H_301_1@      *                     return $this->$funname($args[0], $args[1], $args[2], $args[3]);       *                 case 5: @H_301_1@      *                     return $this->$funname($args[0], $args[1], $args[2], $args[3], $args[4]);       *                 default: @H_301_1@      *                     return call_user_func_array($this->$funname, $args);       *             } @H_301_1@      *     }       */  @H_301_1@     public function __call($name,$arguments) {//参数1-调用的方法名 参数2-传递给调用方法的参数列表          if(method_exists($this,$name)){  @H_301_1@            return $this->$name();          }else{    @H_301_1@            echo "调用的方法 $name() 不存在;传递给 $name() 方法的参数列表如下:".implode(',',$arguments)."\n";          }  @H_301_1@     }  }  @H_301_1@$obj = new Methodtest();  //结果:调用的方法 runtest() 不存在;传递给 runtest() 方法的参数列表如下:李四,张三   @H_301_1@$obj->runTest('李四','张三');//方法名、参数列表  [PHP] view plain copy @H_301_1@//第63题:PHP.ini配置文件的解析    @H_301_1@    (1)如:配置文件 test.ini    @H_301_1@        [names]          me = Robert  @H_301_1@        you = Peter    @H_301_1@        [urls]          first = "http://www.example.com"  @H_301_1@        second = "http://www.w3school.com.cn"        @H_301_1@    (2)代码:<?PHP   print_r(parse_ini_file("test.ini"));   ?>    @H_301_1@       结果:              Array(  @H_301_1@                [me] => Robert                  [you] => Peter  @H_301_1@                [first] => http://www.example.com                  [second] => http://www.w3school.com.cn  @H_301_1@            )        @H_301_1@    (3)代码:<?PHP   print_r(parse_ini_file("test.ini",true));   ?>    @H_301_1@       结果:              Array(  @H_301_1@                [names] => Array(                      [me] => Robert  @H_301_1@                    [you] => Peter                  )  @H_301_1@                [urls] => Array(                      [first] => http://www.example.com  @H_301_1@                    [second] => http://www.w3school.com.cn                  )  @H_301_1@            )  
[PHP] view plain copy @H_301_1@<?PHP  /**  @H_301_1@ * 第65题:PHP中的重写与重载  * 首先来了解两个概念: @H_301_1@ *      重写/覆盖:  指子类重写了父类的同名方法,但重写后的同名方法的参数个数及类型没有限制             <span ID="transmark"></span>发生在子类与父类之间   *      重载:     指本类中存在多个同名方法,但参数类型/个数不同,当传不同的参数时调用不同的方法         发生在本类内部  @H_301_1@ * PHP中,不允许存在多个同名方法. 因此,不能够完成java,c++中的这种重载;但是,PHP的灵活,可以模拟达到类似的效果  */  @H_301_1@  class human{  @H_301_1@      public function say($name){              echo $name,' 吃了吗?<br />';  @H_301_1@      }  }  @H_301_1@  class stu extends human{  @H_301_1@        /* @H_301_1@       * 报错:Fatal error: Cannot redeclare stu::say() in D:\wamp\www\PHP\61.PHP on line 28,因为在PHP中,不允许存在多个同名方法,没有重载概念这一说。        * public function say($a,$b,$c){ @H_301_1@       *        echo '哥仨好';        * } @H_301_1@      */        public function say(){  @H_301_1@            echo '切克闹,卡猫百比<br />';        }  @H_301_1@        }  @H_301_1@  $li=new stu();  @H_301_1@$li->say();//结果:切克闹,卡猫百比;  $li->say('binghui');//结果:切克闹,卡猫百比;上面这个过程叫重写  @H_301_1@    @H_301_1@  //在PHP中模拟重载的方法  @H_301_1@class Calc {       public function area() {   @H_301_1@        //判断一个调用area时,得到的参数个数           $args = func_get_args();//获取参数个数   @H_301_1@        if(count($args) == 1) {               return 3.14 * $args[0] * $args[0];   @H_301_1@        } else if(count($args) == 2) {               return $args[0] * $args[1];   @H_301_1@        } else {               return '未知图形';   @H_301_1@        }       }   @H_301_1@}   $calc = new Calc();   @H_301_1@//计算圆的页面   echo $calc->area(10),'<br />';   @H_301_1@//计算矩形的面积   echo $calc->area(5,8);  @H_301_1@?>  

 

[PHP] view plain copy @H_301_1@<?PHP  /** @H_301_1@   第66题:static静态局部变量(不是数组)在函数中的使用特点:  @H_301_1@   (1)静态局部变量不会随着函数的调用和退出而发生变化;  @H_301_1@      不过,尽管该变量还继续存在,但确不能在函数外部直接使用它(获取不到值).  @H_301_1@      倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值.  @H_301_1@   (2)静态局部变量只会初始化一次.  @H_301_1@   (3)静态局部变量只能被初始化为一个字符值或一个常量,不能使用表达式.  @H_301_1@      即使静态局部变量定义时没有赋初值,系统会自动赋初值0.  @H_301_1@   (4)当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量.  @H_301_1@   (5)static $var=5;//【变量的赋值 *** 作只会在变量第一次初始化时会被调用,在之后函数的执行过程中该 *** 作不会被调用】  @H_301_1@   (6)静态变量是只存在于函数作用域的变量,不过,在函数执行完成后,这种变量的值不会丢失,  @H_301_1@      也就是说,在下一次调用这个函数时,变量仍然会记得原来的值.  @H_301_1@      要将某个变量定义为静态的,只需要在变量前加上static关键字即可  @H_301_1@ */  function test(){  @H_301_1@    static $var=5;  //static $var = 1+1;就会报错,不能使用表达式      $var++;  @H_301_1@    echo $var.'<br/>';  }  @H_301_1@   test(); //结果:6  @H_301_1@test(); //结果:7  test(); //结果:8  @H_301_1@echo $var;//Notice:Undefined variable: var 即:不能在函数外部使用静态局部变量,获取不到值    @H_301_1@  /** @H_301_1@    类中的static静态属性和方法用什么作用?   @H_301_1@    (1)无论你实例化了多少个对象,static定义的属性和方法,都只有一个,只占有一次内存,节省了系统的内存开销      @H_301_1@    (2)访问static属性和方法时,只能用::访问  @H_301_1@    (3)静态成员是一种类变量,可以把它看成时属于整个类而不是属于类的某个实例。  @H_301_1@       与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的  @H_301_1@       也就是说,所有的实例共享这个成员  @H_301_1@    (4)$this只表示类的当前实例,       @H_301_1@       self::表示的是类本身,在类之外的代码中不能使用这个 *** 作符,而且它不能识别自己在继承树层次结构中的位置。  @H_301_1@       也就是说,在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。  @H_301_1@       与$this不同的是,在使用静态变量时,必须在作用域限定符后面加上$符号  @H_301_1@       如:             $this->name;//调用非静态属性 @H_301_1@             self::$name;//调用静态属性 @H_301_1@     (5)扩展类中,在基类的方法被重写的情况下,使用 parent 作用域调用定义在基类中的方法。 @H_301_1@              静态成员也可以只属于父类。如果在子类和父类中同时声明了某个成员,也可以使用parant::在子类中访问父类中的变量。 @H_301_1@               在这种情况下,父类的静态成员和子类的静态成员保存的是不同的值 @H_301_1@          (6)可以在:: *** 作符的左边写上类的名称来静态地访问某个成员,这样避免创建类的实例. @H_301_1@            不仅可以省略掉实例化类的代码,而且还会更高效,因为类的每个实例都会占用一小部分的系统资源 @H_301_1@         (7)案例: @H_301_1@         <?PHP @H_301_1@            class visitors{                 private static $visitors = 0; @H_301_1@                function __construct()                 { @H_301_1@                     self::$visitors++;                 } @H_301_1@                static function getVisitors()                 { @H_301_1@                    return self::$visitors;                 } @H_301_1@            }             $visits = new visitors(); @H_301_1@            echo visitors::getVisitors()."<br />";//结果:1             $visits2 = new visitors(); @H_301_1@            echo visitors::getVisitors()."<br />";//结果:2         ?> @H_301_1@         因为$visitors字段声明为static,所以对其值的任何改变都会反映到所有实例化对象中。 @H_301_1@                 还要注意,静态字段和方法应使用self关键字和类名来引用,而不是通过this和箭头 *** 作符。 @H_301_1@                 这是因为使用“正常”方法引用静态字段是不可能的,会导致语法错误。 @H_301_1@         不能在类中使用$this来引用为static字段 @H_301_1@     (8)静态方法: @H_301_1@         静态方法和非静态方法之间有一个重要的区别:在调用静态方法时,不再需要拥有类的实例。 @H_301_1@         静态方法和非静态方法使用原则: @H_301_1@             (1)、是如果某个方法中不包含$this变量,就应该时静态方法; @H_301_1@             (2)、如果不需要类的实例,可能还应该使用静态类,这样可以免去实例化类的工作。 @H_301_1@                         (3)、在静态方法中时不能使用$this变量的,因为静态方法不属于某个特定的实例。 @H_301_1@ */    @H_301_1@?>  

第67题:session机制:

 

[PHP] view plain copy @H_301_1@<?PHP    @H_301_1@    /**      * 【session.save_handler = files】:默认的session处理机制 @H_301_1@     *      (1)session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据PHP.ini的配置决定的,                但是有的系统是 session.gc_probability = 0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收 @H_301_1@                session.gc_probability = 1  //垃圾回收机制                 session.gc_divisor = 1000   //垃圾回收机制 @H_301_1@                session.gc_maxlifetime = 1440//过期时间 默认24分钟                 //垃圾回收的几率为:session.gc_probability/session.gc_divisor,即:1/1000,  @H_301_1@                //不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。                 session.save_path = //好像不同的系统默认不一样,有一种设置是 "N;/path" @H_301_1@                //这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本  @H_301_1@     *      (2)session会判断当前是否有$_cookie[session_name()];session_name()返回保存session_ID的cookie键值;这个值可以从PHP.ini找到,session.name = PHPSESSID //默认值PHPSESSID      *      (3)如果不存在会生成一个session_ID,然后把生成的session_ID作为cookie的值传递到客户端;相当于执行了下面cookie  *** 作,注意的是,这一步执行了setcookie() *** 作,cookie是在header头中发送的, @H_301_1@     *         这之前是不能有输出的,PHP有另外一个函数 session_regenerate_ID() 如果使用这个函数,这之前也是不能有输出的                 setcookie( @H_301_1@                          session_name(),//PHPSESSID,对应PHP.ini中session.name = PHPSESSID配置选项                           session_ID(),  //生成的session_ID值 @H_301_1@                          session.cookie_lifetime,//默认0                           session.cookie_path,//默认'/'当前程序跟目录下都有效 @H_301_1@                          session.cookie_domain,//默认为空                 ) @H_301_1@     *      (4)如果存在session_ID,那么session_ID = $_cookie[session_name];然后去session.save_path指定的文件夹里去找名字为'SESS_'. session_ID()的文件,读取文件的内容反序列化,然后放到$_SESSION中      *      (5)为$_SESSION赋值: @H_301_1@     *         比如新添加一个值$_SESSION['test'] = 'blah';那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,会把$_SESSION的值写入到session_ID指定的文件夹中,然后关闭相关资源                这个阶段有可能执行更改session_ID的 *** 作,比如销毁一个旧的的session_ID,生成一个全新的session_ID. @H_301_1@               if (isset($_cookie[session_name()])) {//如:匿名用户有一个SESSION的,当它登录后需要换用新的session_ID                     setcookie(session_name(), '', time() - 42000, '/');//旧session cookie过期 @H_301_1@               }                session_regenerate_ID();//这一步会生成新的session_ID,此时再通过session_ID()返回的是新的值 @H_301_1@     *      (6)写入SESSION:在脚本结束的时候会执行SESSION写入 *** 作,把$_SESSION中值写入到session_ID命名的文件中,可能已经存在,可能需要创建新的文件      *      (7)销毁SESSION:SESSION发出去的cookie一般属于即时cookie,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,比如 退出登录,而不是关闭浏览器,那么就需要在代码里销毁SESSION,方法有很多: @H_301_1@               setcookie(session_name(), session_ID(), time() - 8000000, ..);//退出登录前执行                usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有cookie传过来,但是没有数据 @H_301_1@               session_destroy();//这个作用更彻底,删除$_SESSION 删除session文件,和session_ID      * @H_301_1@     * 【session.save_handler = user】:用户自定义session处理机制      *      (1)用户自定义session处理机制:session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');//【执行此函数将修改session默认的存储介质;修改是隐式的,所以不会体现在PHP.ini配置文件中的session.save_handler配置项】 @H_301_1@               session_start():                     执行open($save_path, $session_name)打开session *** 作句柄,$save_path 在session.save_handler = files的情况下它就是session.save_path;但是如果用户自定的话,这个两个参数都用不上,直接返回TRUE @H_301_1@                    执行read($ID)从中读取数据.//【这个参数是自动传递的就是session_ID()】,可以通过这个值进行 *** 作             (2)脚本执行结束:执行write($ID, $sess_data) //两个参数,很简单 @H_301_1@            (3)假如用户需要session_destroy(),先执行destroy.在执行第2步             (4)案例: @H_301_1@                <?PHP                 //SESSION初始化的时候调用 @H_301_1@                function open($save_path, $session_name){                         global $sess_save_path; @H_301_1@                        $sess_save_path = $save_path;                         return(true); @H_301_1@                }  @H_301_1@                //关闭的时候调用                 function close(){ @H_301_1@                        return(true);                 } @H_301_1@                 function read($ID){//【参数会自动传递,就是session_ID()】 @H_301_1@                        global $sess_save_path;                         $sess_file = "$sess_save_path/sess_$ID"; @H_301_1@                        return (string) @file_get_contents($sess_file);                 } @H_301_1@                 //脚本执行结束之前,执行写入 *** 作 @H_301_1@                function write($ID, $sess_data){//【参数会自动传递,就是session_ID()】                         echo "sdfsf"; @H_301_1@                        global $sess_save_path;  @H_301_1@                        $sess_file = "$sess_save_path/sess_$ID";                         if ($fp = @fopen($sess_file, "w")) { @H_301_1@                          $return = fwrite($fp, $sess_data);                           fclose($fp); @H_301_1@                          return $return;                         } else { @H_301_1@                          return(false);                         } @H_301_1@                 } @H_301_1@                 function destroy($ID){//【参数会自动传递,就是session_ID()】 @H_301_1@                        global $sess_save_path;  @H_301_1@                        $sess_file = "$sess_save_path/sess_$ID";                         return(@unlink($sess_file)); @H_301_1@                }  @H_301_1@                function gc($maxlifetime){                         global $sess_save_path; @H_301_1@                         foreach (glob("$sess_save_path/sess_*") as $filename) { @H_301_1@                          if (filemtime($filename) + $maxlifetime < time()) {                             @unlink($filename); @H_301_1@                          }                         } @H_301_1@                        return true;                 } @H_301_1@                ?>      * @H_301_1@     */    @H_301_1@      //【session.save_handler = user】:用户自定义session处理机制  @H_301_1@    $SESS_DBHOST = "127.0.0.1";        $SESS_DBname = "CMS";     @H_301_1@    $SESS_DBUSER = "root";        $SESS_DBPASS = "";     @H_301_1@        $SESS_DBH = ""; //数据库连接句柄    @H_301_1@    $SESS_liFE = get_cfg_var("session.gc_maxlifetime");//默认:8M      @H_301_1@    //SESSION初始化的时候调用      function sess_open($save_path, $session_name) {     @H_301_1@        global $SESS_DBHOST, $SESS_DBname, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;       @H_301_1@        if (! $SESS_DBH = MysqL_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {                 echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER";     @H_301_1@            echo "<li>MysqL Error: " . MysqL_error();                 dIE;     @H_301_1@        }       @H_301_1@        if (! MysqL_select_db($SESS_DBname, $SESS_DBH)) {                 echo "<li>Unable to select database $SESS_DBname";     @H_301_1@            dIE;             }     @H_301_1@          return true;     @H_301_1@    }       @H_301_1@    //关闭的时候调用      function sess_close() {     @H_301_1@        return true;         }     @H_301_1@      function sess_read($key) {     @H_301_1@        global $SESS_DBH, $SESS_liFE;       @H_301_1@        $qry = "SELECT value FROM session_tbl WHERE sesskey = '$key' AND expiry > " . time();             $qID = MysqL_query($qry, $SESS_DBH);     @H_301_1@          if (List($value) = MysqL_fetch_row($qID)) {     @H_301_1@            return $value;             }     @H_301_1@          return false;     @H_301_1@    }       @H_301_1@    //脚本执行结束之前,执行写入 *** 作      function sess_write($key, $val) {   <span ID="transmark"></span>  @H_301_1@        global $SESS_DBH, $SESS_liFE;       @H_301_1@        $expiry = time() + $SESS_liFE; //过期时间             $value = addslashes($val);     @H_301_1@          $qry = "INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')";     @H_301_1@        $qID = MysqL_query($qry, $SESS_DBH);       @H_301_1@        if (! $qID) {                 $qry = "UPDATE session_tbl SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();     @H_301_1@            $qID = MysqL_query($qry, $SESS_DBH);             }     @H_301_1@          return $qID;     @H_301_1@    }       @H_301_1@    function sess_destroy($key) {             global $SESS_DBH;     @H_301_1@          $qry = "DELETE FROM session_tbl WHERE sesskey = '$key'";     @H_301_1@        $qID = MysqL_query($qry, $SESS_DBH);       @H_301_1@        return $qID;         }     @H_301_1@      function sess_gc($maxlifetime) {     @H_301_1@        global $SESS_DBH;       @H_301_1@        $qry = "DELETE FROM session_tbl WHERE expiry < " . time();             $qID = MysqL_query($qry, $SESS_DBH);     @H_301_1@          return MysqL_affected_rows($SESS_DBH);     @H_301_1@    }       @H_301_1@    //【session.save_handler = user】:用户自定义session处理机制主要是通过session_set_save_handler()来进行协调执行      //【执行此函数将修改session默认的存储介质;修改是隐式的,所以不会体现在PHP.ini配置文件中的session.save_handler配置项】  @H_301_1@    session_set_save_handler(             "sess_open",    //可以进行重写  @H_301_1@        "sess_close",   //可以进行重写          "sess_read",    //可以进行重写  @H_301_1@        "sess_write",   //可以进行重写          "sess_destroy", //可以进行重写    @H_301_1@        "sess_gc"       //可以进行重写      );     @H_301_1@    session_start();    //除了以上被重写的session函数外,其它的session函数还是想以前一样调用      ?>  

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

 

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

 

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

 

[PHP] view plain copy @H_301_1@<?PHP  //将外网图片本地化、将外网图片下载到本地的原理  @H_301_1@copy("http://image.v1.cn/vodone/20150723/303862_0x0.jpg",'e:/wamp/www/303862_0x0.jpg');  ?>  
第70题:PHP缓存技术总结

 

 

[PHP] view plain copy @H_301_1@<?PHP    @H_301_1@/**  @H_301_1@1、全页面静态化缓存 也就是将页面全部生成HTML静态页面,用户访问时直接访问的静态页面,而不会去走PHP服务器解析的流程。此种方式,在CMS系 @H_301_1@统中比较常见,比如Dedecms; 一种比较常用的实现方式是用输出缓存: @H_301_1@Ob_start() ******要运行的代码******* @H_301_1@$content = Ob_get_contents(); ****将缓存内容写入HTML文件***** @H_301_1@Ob_end_clean();  @H_301_1@ 2、页面部分缓存 @H_301_1@该种方式,是将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示;可以使用类似于 ob_get_contents的方式实现,也可以利用类似ESI之类的页面片段缓存策略,使其用来做动态页面中相对静态的片段部分的缓存 @H_301_1@(ESI技术,请baIDu,此处不详讲)。该种方式可以用于如商城中的商品页;  @H_301_1@ 3、数据缓存 @H_301_1@顾名思义,就是缓存数据的一种方式;比如,商城中的某个商品信息,当用商品ID去请求时,就会得出包括店铺信息、商品信息 等数据,此时就可以将这些数据缓存到一个PHP文件中,文件名包含商品ID来建一个唯一标示;下一次有人想查看这个商品时,首 @H_301_1@先就直接调这个文件里面的信息,而不用再去数据库查询;其实缓存文件中缓存的就是一个PHP数组之类; Ecmall商城系统里面就用了这种方式; @H_301_1@  @H_301_1@4、查询缓存 其实这跟数据缓存是一个思路,就是根据查询语句来缓存;将查询得到的数据缓存在一个文件中,下次遇到相同的查询时,就直 @H_301_1@接先从这个文件里面调数据,不会再去查数据库;但此处的缓存文件名可能就需要以查询语句为基点来建立唯一标示(用md5($sql)???); 按时间变更进行缓存 @H_301_1@其实,这一条不是真正的缓存方式;上面的2、3、4的缓存技术一般都用到了时间变更判断;就是对于缓存文件您需要设一个有效 时间,在这个有效时间内,相同的访问才会先取缓存文件的内容,但是超过设定的缓存时间,就需要重新从数据库中获取数据, @H_301_1@并生产最新的缓存文件; 比如,我将我们商城的首页就是设置2个小时更新一次; @H_301_1@  @H_301_1@5、按内容变更进行缓存 这个也并非独立的缓存技术,需结合着用;就是当数据库内容被修改时,即刻更新缓存文件; @H_301_1@比如,一个人流量很大的商城,商品很多,商品表必然比较大,这表的压力也比较重;我们就可以对商品显示页进行页面缓存; 当商家在后台修改这个商品的信息时,点击保存,我们同时就更新缓存文件;那么,买家访问这个商品信息时,实际上访问的是 @H_301_1@一个静态页面,而不需要再去访问数据库; 是想,如果对商品页不缓存,那么每次访问一个商品就要去数据库查一次,如果有10万人在线浏览商品,那服务器压力就大了; @H_301_1@  @H_301_1@6、内存式缓存 提到这个,可能大家想到的首先就是Memcached;memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数 @H_301_1@据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。 它就是将需要缓存的信息,缓存到系统内存中,需要获取信息时,直接到内存中取;比较常用的方式就是 key-->value方式; @H_301_1@     $memcachehost = '192.168.6.191';      $memcacheport = 11211; @H_301_1@     $memcachelife = 60;      $memcache = new Memcache; @H_301_1@     $memcache->connect($memcachehost,$memcacheport) or dIE ("Could not connect");      $memcache->set('key','缓存的内容'); @H_301_1@     $get = $memcache->get($key);       //获取信息  @H_301_1@ 7、apache缓存模块 @H_301_1@apache安装完以后,是不允许被cache的。如果外接了cache或squID服务器要求进行web加速的话,就需要在htttpd.conf里进行设 置,当然前提是在安装apache的时候要激活mod_cache的模块。 @H_301_1@安装apache时:./configure --enable-cache --enable-disk-cache --enable-mem-cache  @H_301_1@ 8、PHP APC缓存扩展 @H_301_1@PHP有一个APC缓存扩展,windows下面为PHP_apc.dll,需要先加载这个模块,然后是在PHP.ini里面进行配置: [apc]  @H_301_1@     extension=PHP_apc.dll       apc.rfc1867 = on  @H_301_1@     upload_max_filesize = 100M       post_max_size = 100M  @H_301_1@     apc.max_file_size = 200M       upload_max_filesize = 1000M  @H_301_1@     post_max_size = 1000M       max_execution_time = 600 ;   每个PHP页面运行的最大时间值(秒),默认30秒  @H_301_1@     max_input_time = 600 ;       每个PHP页面接收数据所需的最大时间,默认60       memory_limit = 128M ;       每个PHP页面所吃掉的最大内存,默认8M @H_301_1@  @H_301_1@9、Opcode缓存 我们知道,PHP的执行流程可以用下图来展示: @H_301_1@PHP的执行流程 首先PHP代码被解析为Tokens,然后再编译为Opcode码,最后执行Opcode码,返回结果;所以,对于相同的PHP文件,第一次运行 @H_301_1@时可以缓存其Opcode码,下次再执行这个页面时,直接会去找到缓存下的opcode码,直接执行最后一步,而不再需要中间的步骤了。 比较知名的是XCache、Turck MM Cache、PHP Accelerator等; @H_301_1@ **/  @H_301_1@  ?>  

第71题:xml文档中的cdaTA

 

[PHP] view plain copy @H_301_1@<?PHP    @H_301_1@/**  *   @H_301_1@ *  xml文档中的cdaTA:  * @H_301_1@ *      1、所有xml文档中的文本均会被解析器解析,只有cdaTA区段(cdaTA section)中的文本会被解析器忽略  *      2、术语cdaTA指的是不应由xml解析器进行解析的文本数据(Unparsed Character Data) @H_301_1@ *      3、cdaTA部分不能包含字符串 "]]>",也不允许嵌套的cdaTA部分;标记cdaTA 部分结尾的 "]]>" 不能包含空格或折行  *      4、cdaTA 部分由 "<![cdaTA[" 开始,由 "]]>" 结束,cdaTA 部分中的所有内容都会被解析器忽略 @H_301_1@ *      5、在 XML 元素中,"<" 和 "&" 是非法的; "<" 会产生错误,因为解析器会把该字符解释为新元素的开始;"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始          @H_301_1@        案例:         <document> @H_301_1@            <webname>优酷网</webname>             <webSite>www.youku.com</webSite> @H_301_1@            <item ID="1">...</item>             <item ID="2">...</item> @H_301_1@            <item ID="3">                 <Title> @H_301_1@                    <![cdaTA[ 唱说天下:银幕上“不搭配”的情侣档 ]]>                 </Title> @H_301_1@                <category>                     <![cdaTA[ 娱乐 ]]> @H_301_1@                </category>                 <subcat> @H_301_1@                    <![cdaTA[ 娱乐咨询 ]]>                 </subcat> @H_301_1@                <image>                     <![cdaTA[ @H_301_1@                    http://p01.youku.com/group2/M00/05/3D/ChQB0FW1uDWAWwAHA16bTNZsaI03768-b.jpg                     ]]> @H_301_1@                </image>                 <link> @H_301_1@                    <![cdaTA[                     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 @H_301_1@                    ]]>                 </link> @H_301_1@                <duration>                     <![cdaTA[ 00:02:27 ]]> @H_301_1@                </duration>                 <publish> @H_301_1@                    <![cdaTA[ 2015-07-27 12:56:17 ]]>                 </publish> @H_301_1@                <tag>                     <![cdaTA[ 银幕,情侣档 ]]> @H_301_1@                </tag>                 <introduction> @H_301_1@                    <![cdaTA[ 唱说天下:银幕上“不搭配”的情侣档 ]]>                 </introduction> @H_301_1@                <count>                     <![cdaTA[ 0 ]]> @H_301_1@                </count>             </item> @H_301_1@        </document>  * @H_301_1@ */  ?>  

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

 

[PHP] view plain copy @H_301_1@<?PHP    @H_301_1@/**  *  Array @H_301_1@(     [0] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/category.HTML @H_301_1@    [1] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/category_download.HTML     [2] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/category_picture.HTML @H_301_1@    [3] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/category_vIDeo.HTML     [4] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/download.HTML @H_301_1@    [5] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/footer.HTML     [6] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/header.HTML @H_301_1@    [7] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/header_min.HTML     [8] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/header_page.HTML @H_301_1@    [9] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/index.HTML     [10] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/List.HTML @H_301_1@    [11] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/List_download.HTML     [12] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/List_picture.HTML @H_301_1@    [13] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/List_vIDeo.HTML     [14] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/message.HTML @H_301_1@    [15] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/page.HTML     [16] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/play_List.HTML @H_301_1@    [17] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/RSS.HTML     [18] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/search.HTML @H_301_1@    [19] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/show.HTML     [20] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/show_download.HTML @H_301_1@    [21] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/show_picture.HTML     [22] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/show_vIDeo.HTML @H_301_1@    [23] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/show_vIDeoList.HTML     [24] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/tag.HTML @H_301_1@    [25] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/tag_List.HTML     [26] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/vIDeo_album.HTML @H_301_1@    [27] => E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/vIDeo_for_ck.HTML ) @H_301_1@ */  echo "<pre>";  @H_301_1@print_r(glob('E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/*.HTML'));  //print_r(glob('E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/vIDeo_*.HTML'));  @H_301_1@    @H_301_1@/**   *  Array  @H_301_1@(      [0] => category.HTML  @H_301_1@    [1] => category_download.HTML      [2] => category_picture.HTML  @H_301_1@    [3] => category_vIDeo.HTML      [4] => download.HTML  @H_301_1@    [5] => footer.HTML      [6] => header.HTML  @H_301_1@    [7] => header_min.HTML      [8] => header_page.HTML  @H_301_1@    [9] => index.HTML      [10] => List.HTML  @H_301_1@    [11] => List_download.HTML      [12] => List_picture.HTML  @H_301_1@    [13] => List_vIDeo.HTML      [14] => message.HTML  @H_301_1@    [15] => page.HTML      [16] => play_List.HTML  @H_301_1@    [17] => RSS.HTML      [18] => search.HTML  @H_301_1@    [19] => show.HTML      [20] => show_download.HTML  @H_301_1@    [21] => show_picture.HTML      [22] => show_vIDeo.HTML  @H_301_1@    [23] => show_vIDeoList.HTML      [24] => tag.HTML  @H_301_1@    [25] => tag_List.HTML      [26] => vIDeo_album.HTML  @H_301_1@    [27] => vIDeo_for_ck.HTML  )  @H_301_1@ */  echo "<pre>";  @H_301_1@print_r(@array_map('basename',glob('E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/*.HTML')));//array_map()回调函数  //print_r(@array_map('basename',glob('E:/wamp/www/PHPCMS/PHPCMS/templates/default/content/vIDeo_*.HTML')));//array_map()回调函数  @H_301_1@    @H_301_1@?>  

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

 

[PHP] view plain copy @H_301_1@<?PHP    @H_301_1@/**  *  scandir()与glob()函数的区别: @H_301_1@ *  *  遍历文件夹、遍历目录、遍历子文件夹、遍历子目录、遍历文件 @H_301_1@ *  扫描单层文件夹的情况         1、scandir('E:/wamp/www/PHPCMS/'); @H_301_1@             案例: @H_301_1@             Array( @H_301_1@                [0] => .                 [1] => .. @H_301_1@                [2] => admin.PHP                 [3] => API @H_301_1@                [4] => API.PHP                 [5] => caches @H_301_1@                [6] => crossdomain.xml                 [7] => favicon.ico @H_301_1@                [8] => HTML                 [9] => index.HTML @H_301_1@                [10] => index.PHP                 [11] => Js.HTML @H_301_1@                [12] => nbproject                 [13] => PHPCMS @H_301_1@                [14] => phpsso_server                 [15] => plugin.PHP @H_301_1@                [16] => robots.txt                 [17] => statics @H_301_1@                [18] => uploadfile             ) @H_301_1@         2、glob('E:/wamp/www/PHPCMS/*'); @H_301_1@             案例: @H_301_1@             Array( @H_301_1@                [0] => E:/wamp/www/PHPCMS/admin.PHP                 [1] => E:/wamp/www/PHPCMS/API @H_301_1@                [2] => E:/wamp/www/PHPCMS/API.PHP                 [3] => E:/wamp/www/PHPCMS/caches @H_301_1@                [4] => E:/wamp/www/PHPCMS/crossdomain.xml                 [5] => E:/wamp/www/PHPCMS/favicon.ico @H_301_1@                [6] => E:/wamp/www/PHPCMS/HTML                 [7] => E:/wamp/www/PHPCMS/index.HTML @H_301_1@                [8] => E:/wamp/www/PHPCMS/index.PHP                 [9] => E:/wamp/www/PHPCMS/Js.HTML @H_301_1@                [10] => E:/wamp/www/PHPCMS/nbproject                 [11] => E:/wamp/www/PHPCMS/PHPCMS @H_301_1@                [12] => E:/wamp/www/PHPCMS/phpsso_server                 [13] => E:/wamp/www/PHPCMS/plugin.PHP @H_301_1@                [14] => E:/wamp/www/PHPCMS/robots.txt                 [15] => E:/wamp/www/PHPCMS/statics @H_301_1@                [16] => E:/wamp/www/PHPCMS/uploadfile             ) @H_301_1@ */  echo "<pre>";print_r(scandir('E:/wamp/www/PHPCMS/'));//跟glob相比多出来两个元素,分别是: "." 和 ".."  @H_301_1@echo "<pre>";print_r(glob('E:/wamp/www/PHPCMS/*'));//以数组的形式返回与指定模式相匹配的文件名或目录  ?>  

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

 

[PHP] view plain copy @H_301_1@<?PHP    @H_301_1@/** * 将字符串转换为数组 @H_301_1@* * @param    string  $data   字符串 @H_301_1@* @return   array   返回数组格式,如果,data为空,则返回空数组  @H_301_1@  结果:  @H_301_1@    Array(         [isHTML] => 1 @H_301_1@        [template_List] => default         [page_template] => page @H_301_1@        [Meta_Title] =>          [Meta_keywords] =>  @H_301_1@        [Meta_description] =>          [category_ruleID] => 1 @H_301_1@        [show_ruleID] =>          [repeatchargedays] => 1 @H_301_1@    )  @H_301_1@*/  function string2array($data) {  @H_301_1@    if($data == '') return array();      @eval("\$array = $data;");  @H_301_1@    return $array;  }  @H_301_1@  $data='array (  @H_301_1@  \'isHTML\' => \'1\',    \'template_List\' => \'default\',  @H_301_1@  \'page_template\' => \'page\',    \'Meta_Title\' => \'\',  @H_301_1@  \'Meta_keywords\' => \'\',    \'Meta_description\' => \'\',  @H_301_1@  \'category_ruleID\' => \'1\',    \'show_ruleID\' => \'\',  @H_301_1@  \'repeatchargedays\' => \'1\',  )';  @H_301_1@  echo "<pre>";print_r(string2array($data));  @H_301_1@    @H_301_1@    @H_301_1@$arr=array(      'username'=>'admin',  @H_301_1@    'password'=>'123'  );  @H_301_1@  /** @H_301_1@ *  var_export()函数:返回字符串  */  @H_301_1@  $str=var_export($arr,true);//返回的是合法的PHP代码,是一个字符串,不是数组  @H_301_1@  /** @H_301_1@ *  结果:数组格式的字符串  @H_301_1@        array (           'username' => 'admin', @H_301_1@          'password' => '123',         ) @H_301_1@ */  echo $str;//正确  @H_301_1@//echo $str['username'];//错误,因为此时$str是一个数组格式的字符串,不是数组    @H_301_1@@eval("\$str = $str;");//将数组格式的字符串转换为数组  print_r($str['username']);//结果:'admin',此时已将数组格式的字符串转化为数组  @H_301_1@  ?>  目录:
51、PHP中如何统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数
52、PHP中如何统计字符串中每种字符的出现次数并排序?
53、PHP中使用str_word_count()函数计算字符串中的单词数?
56、PHP中redis与memcached区别?
57、PHP中memcached的使用案例?
58、内存溢出件缓存的使用案例?
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()函数返回数组格式的字符串
总结

以上是内存溢出为你收集整理的PHP常见面试题汇总(二)全部内容,希望文章能够帮你解决PHP常见面试题汇总(二)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1167375.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存