引言
本文将罗列我在快速阅读代码时所接触到的模棱两可的概念及实操讲解。
Q&A
- 1. rand(5, 15)
例如,想要 5 到 15(包括 5 和 15)之间的随机数,用rand(5, 15)。
- 2. $strlen=mb_strlen($str,$charset);
function mbsta($str) {
$cut_len=rand(2,5);
$charset='utf-8';
$inter="͏";
$strlen=mb_strlen($str,$charset);
$array=array();
while($strlen){
$array[]=mb_substr($str,0,$cut_len,$charset);
$str=mb_substr($str,$cut_len,$strlen-$cut_len,$charset);
$strlen=mb_strlen($str,$charset);
}
implode($inter,$array);
return rand_in_str(implode($inter,$array),urldecode('%F0%9F'.$GLOBALS['emoji'][array_rand($GLOBALS['emoji'],1)]),'utf-8');
}
PHP strlen()和mb_strlen()简单解析
strlen():获取字符串长度
说明:
int strlen ( string $string
)
返回给定的字符串 string 的长度。
参数
string 需要计算长度的字符串。
返回值
成功则返回字符串 string 的长度;如果 string 为空,则返回 0。
mb_strlen:获取字符串的长度
说明
mixed mb_strlen ( string $str
[, string $encoding
= mb_internal_encoding() ] )
获取一个 string 的长度。
参数
str 要检查长度的字符串。
encoding encoding参数为字符编码。如果省略,则使用内部字符编码。
返回值
返回具有 encoding 编码的字符串 str 包含的字符数。 多字节的字符被计为 1。
如果给定的 encoding 无效则返回 FALSE。
上面是手册中关于两个函数的解释,乍一看,好像都差不多。
下面通过实例,来讲解两者之间的区别。
//文件的编码方式为UTF8
$str='字a符1串b长2度';
echo strlen($str).'
';//19
echo mb_strlen($str,'utf-8').'
';//9
再看下一个例子
';//14
echo mb_strlen($str,'utf-8').'
';//9
?>
结果分析:在strlen字符长度时,一个UTF8的中文字符算3个长度,
所以“字a符1串b长2度”长度是3+1+3+1+3+1+3+1+3=19,
在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“字a符1串b长2度”长度是9 .
在gb2312中,strlen计算字符长度时,一个中文字符算2个长度。
另外,需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载php_mbstring.dll,否则会出现未定义函 数的问题。
- 3. mb_substr
mb_substr — 获取部分字符串
说明
string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )
根据字符数执行一个多字节安全的 substr() 操作。 位置是从 str
的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1,以此类推。
参数
str
从该 string 中提取子字符串。
start
如果 start 不是负数,返回的字符串会从 str 第 start 的位置开始,从 0 开始计数。举个例子,字符串 'abcdef',位置 0 的字符是 'a',位置 2 的字符是 'c',以此类推。
如果 start 是负数,返回的字符串是从 str 末尾处第 start 个字符开始的。
length
str 中要使用的最大字符数。如果省略了此参数或者传入了 NULL,则会提取到字符串的尾部。
encoding
encoding 参数为字符编码。如果省略,则使用内部字符编码。
返回值
mb_substr() 函数根据 start 和 length 参数返回 str 中指定的部分。
- 4. php array_push 与 $arr[]=$value 性能比较
array_push方法
array_push 方法,将一个或多个元素压入数组的末尾。
int array_push ( array &$array , mixed $var [, mixed $... ] )
array_push() 将array当成一个栈,并将传入的变量压入array的末尾。array的长度将根据入栈变量的数目增加。
与下效果相同:
比较array_push与 $arr[]=$value性能
使用array_push压入1000000个元素
执行时间:2735.545158 ms
使用$arr[] = $value压入100000个元素
执行时间:417.458057 ms
结果:每次压入一个元素,使用$arr[]=$value比使用array_push方法快7倍。
同时压入多个元素比较
使用array_push方法,压入100000个元素,每次压入50个元素
执行时间:250.149012 ms
结果:使用array_push一次压入多个元素,比多次使用$arr[]=$value压入快。array_push一次压入的元素越多,则效率越高。
总结:
如果是压入一个元素,使用$arr[]=$value效率高,因为可以节省调用函数的额外负担。
如果同时压入多个元素,使用array_push效率高,因为不用重复获取文件尾的指针。
- 5. implode()
把数组元素组合为字符串:
implode() 函数返回由数组元素组合成的字符串。
注释:implode() 函数接受两种参数顺序。但是由于历史原因,explode() 是不行的,您必须保证 separator 参数在 string 参数之前才行。
注释:implode() 函数的 separator 参数是可选的。但是为了向后兼容,推荐您使用使用两个参数。
注释:该函数是二进制安全的。
implode(separator,array)
参数 | 描述 |
---|---|
separator | 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。 |
array | 必需。要组合为字符串的数组。 |
用不同的字符分隔数组元素:
";
echo implode("+",$arr)."
";
echo implode("-",$arr)."
";
echo implode("X",$arr);
?>
结果为:
Hello World! I love Shanghai!
Hello+World!+I+love+Shanghai!
Hello-World!-I-love-Shanghai!
HelloXWorld!XIXloveXShanghai!
- 6. array_rand()
返回包含随机键名的数组:
";
echo $a[$random_keys[1]]."
";
echo $a[$random_keys[2]];
?>
说明
array_rand() 函数从数组中随机选出一个或多个元素,并返回。
第二个参数用来确定要选出几个元素。如果选出的元素不止一个,则返回包含随机键名的数组,否则返回该元素的键名。
- 7. PHP urldecode()与urlencode()函数
urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%,对字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原理就是把十六进制字符串转换为中文字符。
For example:
index.html
insert into title
urlencode演示
url输出结果:http://localhost/namespace2/space2/index3.php?par=%E6%BC%94%E7%A4%BAPHP-MYSQL
index.php
$parValue=$_GET['par'];
echo urldecode($parValue);
OutPut: 演示PHP-MYSQL
- 8. base64_encode
base64_encode算法原理
Base64编码,是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!
可逆转的加密为:base64_encode()、urlencode()
相对应的解密函数:base64_decode() 、urldecode()
不可逆的加密函数为:md5()、crypt()
- 9. cache::
PHP中::
是个什么意思?
类中 静态方法和静态属性的引用方法
例如:
class Test{
public static $test = 1;
public static function test(){
}
}
可以不用实例化对象直接使用 Test::$test 来取得$test属性的值
静态方法调用也同理Test::test(); 直接调用静态方法test
- 10. php 中self,this的区别和实际操作
先初步解释一下,this是指向当前对象的指针(可以看成C里面的指针),self是指向当前类的指针。
self
可以访问本类中的静态属性和静态方法,可以访问父类中的静态属性和静态方法。用self时,可以不用实例化的
class self_test {
static $instance;
public function __construct(){
self::$instance = 'instance';//静态属性只能通过self来访问
}
public function tank(){
return self::$instance;//访问静态属性
}
}
$str = new self_test();
echo $str->tank();
页面输出:instance
class self_test {
static $instance;
public function __construct(){
self::$instance = 'dell';
}
static public function pentium(){
return self::$instance;//静态方法也可以继续访问静态变量,访问时需要加$
}
public function tank(){
return self::pentium();//访问静态方法pentium()
}
}
$str = new self_test();
echo $str->tank();
页面输出:dell
self可以访问const定义的常量
class self_test {
const NAME = 'tancy';
public function tank(){
return self::NAME;
}
}
$str = new self_test();
echo $str->tank();
this可以调用本类中的方法和属性,也可以调用父类中的可以调的方法和属性,可以说除了静态和const常量,基本上其他都可以使用this访问到
class self_test {
public $public;
private $private;
protected $protected;
public function __construct(){
$this->public = 'public';
$this->private = 'private';
$this->protected = 'protected';
}
public function tank(){
return $this->public;
}
public function dell(){
return $this->private;
}
public function datesrt(){
return $this->protected;
}
}
$str = new self_test();
echo $str->tank();
echo "";
echo $str->dell();
echo "";
echo $str->datesrt();
一句话,self是引用静态类的类名,而$this是引用非静态类的实例名。
- 11. PHP引用(&)使用详解
php的引用(就是在变量或者函数、对象等前面加上&符号)
在PHP 中引用的意思是:不同的名字访问同一个变量内容。
与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容,在内存中存放的地址。
1.变量的引用
PHP 的引用允许你用两个变量来指向同一个内容
2.函数的引用传递(传址调用)
传址调用我就不多说了 下面直接给出代码
";
echo $b;//输出101
?>
要注意的是,在这里test(1);的话就会出错,原因自己去想。
注意:
上面的“ test($b); ” 中的$b前面不要加 & 符号,但是在函数“call_user_func_array”中,若要引用传参,就得需要 & 符号,如下代码所示:
3.函数的引用返回
下面解释下:
通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别
至于原因: 这是PHP的规定
PHP规定通过$a=&test(); 方式得到的才是函数的引用返回
至于什么是引用返回呢(PHP手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂
用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&$b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
$a=&test();
$a=5;
以后,$b的值变为了5
这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中
另附一个php官方例子:
This is the way how we use pointer to access variable inside the class.
data;
}
public function out(){
echo $this->data;
}
}
$aa = new talker();
$d = &$aa->get();
$aa->out();
$d = 'How';
$aa->out();
$d = 'Are';
$aa->out();
$d = 'You';
$aa->out();
?>
the output is "HiHowAreYou"
4.对象的引用
abc;//这里输出ABC
echo $c->abc;//这里输出ABC
$b->abc="DEF";
echo $c->abc;//这里输出DEF
?>
在PHP5中 对象的赋值是个引用的过程。上列中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
5.引用的作用
如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。
6.取消引用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
不会 unset $b,只是 $a。
- 12. PHP rtrim() 函数
从字符串右侧移除字符:
";
echo rtrim($str,"World!");
?>
运行结果:
Hello World!
Hello
rtrim() 函数移除字符串右侧的空白字符或其他预定义字符。
ltrim() - 移除字符串左侧的空白字符或其他预定义字符
trim() - 移除字符串两侧的空白字符或其他预定义字符
rtrim(string,charlist)
charlist:可选。规定从字符串中删除哪些字符。如果省略,则移除下列所有字符:
"\0" - NULL
"\t" - 制表符
"\n" - 换行
"\x0B" - 垂直制表符
"\r" - 回车
" " - 空格
- 13. php中var_export的使用
1.var_export用于将数组转换成字符串
'val1',
'key2'=>'val2',
'key3'=>'val3',
'key4'=>'val4',
'key5'=>'val5'
];
$str = var_export($arr,true);
echo $str;//结果 array ( 'key1' => 'val1', 'key2' => 'val2', 'key3' => 'val3', 'key4' => 'val4', 'key5' => 'val5', )
?>
2.什么地方会用到该方法?
(1)通常,在数据库里面会创建一张表,用于存放所有配置项的信息(该表往往只有两个字段:name和value)
(2)我们在后台修改配置项的值以后,除了保存到数据表以外,还要保存到文件中,以方便读取,这里就要用到该方法了
(3)将修改后的配置表所有数据取出,存放到数组$data中
$path = 'web.php';
$str = '
这样就将数组保存成字符串了
- 14. $f = @fopen($file, 'ab+');
定义和用法
fopen() 函数打开文件或者 URL。
如果打开失败,本函数返回 FALSE。
fopen(filename,mode,include_path,context)
$f = @fopen($file, 'ab+');
@
在PHP中叫错误抑制符,也就是用来屏蔽错误的。
@之后的表达式如果出错误,是不提示错误信息的,如果不加@出错之后一般是会在浏览器中显示错误信息,加上之后浏览器中就不显示错误信息了。
你可以尝试下,看看加与不加的区别。
b指的是换行
"a+" 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
说明
fopen() 将 filename 指定的名字资源绑定到一个流上。如果 filename 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,PHP 将发出一条消息来帮助检查脚本中潜在的问题并将 filename 当成一个普通的文件名继续执行下去。
如果 PHP 认为 filename 指定的是一个本地文件,将尝试在该文件上打开一个流。该文件必须是 PHP 可以访问的,因此需要确认文件访问权限允许该访问。如果激活了安全模式或者 open_basedir 则会应用进一步的限制。
提示和注释
注释:不同的操作系统家族具有不同的行结束习惯。当写入一个文本文件并想插入一个新行时,需要使用符合操作系统的行结束符号。基于 Unix 的系统使用 \n 作为行结束字符,基于 Windows 的系统使用 \r\n 作为行结束字符,基于 Macintosh 的系统使用 \r 作为行结束字符。 如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。
Windows 下提供了一个文本转换标记("t")可以透明地将 \n 转换为 \r\n。与此对应还可以使用 "b" 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 "b" 或者用 "t" 作为 mode 参数的最后一个字符。
默认的转换模式依赖于 SAPI 和所使用的 PHP 版本,因此为了便于移植鼓励总是指定恰当的标记。如果是操作纯文本文件并在脚本中使用了 \n 作为行结束符,但还要期望这些文件可以被其它应用程序例如 Notepad 读取,则在 mode 中使用 "t"。在所有其它情况下使用 "b"。
在操作二进制文件时如果没有指定 "b" 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 \r\n 字符的奇怪问题。
注释:为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 "b" 标记。
注释:再一次,为移植性考虑,强烈建议你重写那些依赖于 "t" 模式的代码使其使用正确的行结束符并改成 "b" 模式。
例子
- 15. @flock($f, LOCK_EX)
定义和用法
flock() 函数锁定或释放文件。
若成功,则返回 true。若失败,则返回 false。
语法
flock(file,lock,block)
参数 | 描述 |
---|---|
file | 必需。规定要锁定或释放的已打开的文件。 |
lock | 必需。规定要使用哪种锁定类型。 |
block | 可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。 |
说明
flock() 操作的 file 必须是一个已经打开的文件指针。
lock 参数可以是以下值之一:
要取得共享锁定(读取的程序),将 lock 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
要取得独占锁定(写入的程序),将 lock 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
要释放锁定(无论共享或独占),将 lock 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
如果不希望 flock() 在锁定时堵塞,则给 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。
提示和注释
提示:可以通过 fclose() 来释放锁定操作,代码执行完毕时也会自动调用。
注释:由于 flock() 需要一个文件指针, 因此可能不得不用一个特殊的锁定文件来保护打算通过写模式打开的文件的访问(在 fopen() 函数中加入 "w" 或 "w+")。
例子:
- 16. fseek($f, 0);
定义和用法
fseek() 函数在打开的文件中定位。
该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量。
成功则返回 0;否则返回 -1。注意,移动到 EOF 之后的位置不会产生错误。
语法:
fseek(file,offset,whence)
offset 必需。规定新的位置(从文件头开始以字节数度量)。
例子
- 17. ftruncate($f, 0);
ftruncate() 函数把文件截断到指定的长度。
ftruncate(file,size)
参数 | 描述 |
---|---|
file | 必需。规定要截断的打开文件。 |
size | 必需。规定新的文件大小。 |
接受文件指针 file 作为参数,并将文件大小截取为 size。如果成功则返回 TRUE,否则返回 FALSE。
- 18.@fwrite($f, $string);
fwrite() 函数写入文件(可安全用于二进制文件)。
fwrite(file,string,length)
参数 | 描述 |
---|---|
file | 必需。规定要写入的打开文件。 |
string | 必需。规定要写入文件的字符串。 |
length | 可选。规定要写入的最大字节数。 |
fwrite() 把 string 的内容写入文件指针 file 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。
fwrite() 返回写入的字符数,出现错误时则返回 false。
- 19.chmod
定义和用法
chmod() 函数改变文件模式。
如果成功则返回 TRUE,否则返回 FALSE。
chmod(file,mode)
mode
可选。规定新的权限。
mode 参数由 4 个数字组成:
第一个数字永远是 0
第二个数字规定所有者的权限
第二个数字规定所有者所属的用户组的权限
第四个数字规定其他所有人的权限
可能的值(如需设置多个权限,请对下面的数字进行总计):
1 - 执行权限
2 - 写权限
4 - 读权限
例子
- 20. return include $file;
php有一个include,顾名思义,就是用来包含文件的。相应的还有require,以及两个带once的。不知道大家有没有注意过include的 返回值。通常情况下,包含成功返回1,包含失败返回false。但是,如果被包含文件中用return返回,那么这个值就是return的值。比如:
1.php
2.php
从1.php的输出就可以看到,这里include的返回值就是2.php中return的那个'wakaka'。
这个特性有什么用呢? 我是利用它来方便地使用php文件来做配置。比如,一个配置文件可以这么写:
config.php
array(
'host' => 'localhost',
'user' => 'root',
'password' => 'wakaka',
'name' => 'test',
'encoding' => 'utf8'
)
);
?>
载入的时候,只需要$conf = include 'config.php';就可以了。 Thinkphp 的配置文件就是这样返回的。
- 21. 如何在html文件中嵌入php代码
在html文件中嵌入php代码时会发现页面显示并没有达到预期效果,原因是服务器在解析html文件时没有解析php代码部分,除了修改后缀名为php之外还可以修改httpd.conf文件,具体修改如下:
将
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .pps
修改为
AddType application/x-httpd-php .html .htm .php .phtml
AddType application/x-httpd-php-source .html .htm .phps
原先httpd.conf中只有AddType application/x-httpd-php .php
需要加入
AddType application/x-httpd-php .php
AddType application/x-httpd-php .html
两行,
你也可以加入更多,实质就是添加可以执行php的文件类型,比如你再加上一行
AddType application/x-httpd-php .htm
,则.htm文件也可以执行php程序了,你甚至还可以添加上一行
AddType application/x-httpd-php .txt
,让普通的文本文件格式也能运行php程序。
实操下来,发现httpd.conf中没有AddType application/x-httpd-php .php
这是怎么回事呢?
让apache支持php文件的解释,有2种方法配置,RPM装的默认配置是:
AddHandler php5-script .php
AddType text/html .php
网上很多人的配置方法是:
AddType application/x-httpd-php .php
AddHandler 指令的作用是: 在文件扩展名与特定的处理器之间建立映射
比如: AddHandler php5-script .php 指定扩展名为 .php 的文件应被 php5-srcipt 处理器来处理。AddType 指令 作用:在给定的文件扩展名与特定的内容类型之间建立映射 语法:AddType MIME-type extension [extension] ...
AddType指令在给定的文件扩展名与特定的内容类型之间建立映射关系。
MIME-type指明了包含extension扩展名的文件的媒体类型。
AddType 是与类型表相关的,描述的是扩展名与文件类型之间的关系。
AddHandler 说明什么样的扩展名使用什么样的程序来处理,描述的是扩展名与处理程序之间的关系。
因此,html内嵌php代码无法解析出现了另外一种解法:
现象:
php, apache都安装完成,但是这样的代码,浏览器无法解析其的php代码.
d
echo "test";
?>
问题解决:
在httpd.conf中加入以下二条, 重启.OK!
AddHandler php5-script .php .html
AddType text/html .php .html