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