/** * 第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);