PHP精华

PHP版本

echo phpversion();

“<td>”.$a."</td>" =“<td>{$a}</td>"

配置

display_errors
//ini_set("display_errors","On"); //显示所有错误信息*/
ini_set("display_errors","Off"); //屏蔽所有错误信息
通常服务器配置文件中,是屏蔽notice错误,只显示error错误,如果是这样的话,你打开错误显示,也不会显示notice错误

利用ini_set可以快速的修改php.ini配置设置哦,无需打开php.ini就可以了,特别是虚拟主机时你没有修改php.ini的权限时就会发现这个函数的作用了,下面看几个实例吧。
*/
//ini_set具有更改php.ini设置的功能。此函数接收两个参数:需要调整的配置变量名,以及变量的新值。


error_reporting()

设置 PHP 的报错级别并返回当前级别。


//禁用错误报告 error_reporting(0); //报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE); //报告所有错误 error_reporting(E_ALL);


output_buffering

默认是4096

;output_buffering = 4096
output_buffering = Off

这样出现echo在header之前就会报错“Warning: Cannot modify header information - headers already sent by (output started at xxx.php

所以php开启缓冲2种方法:

1.页面ob_start()

2.或者php.ini修改配置

--------------------------------------

output缓存--->程序缓存(不能控制)->输出->IE缓存(256字节)

Output Control 函数

  • flush— 刷新输出Apache的缓冲
  • ob_clean— 清空(擦掉)输出缓冲区
  • ob_end_clean— 清空(擦除)缓冲区并关闭输出缓冲
  • ob_end_flush— 冲刷出(送出)输出缓冲区内容并关闭缓冲
  • ob_flush先输出PHP的ob缓冲区中的内容,再清空缓冲区。如果以后调用ob_get_contents只能得到flush之后进入缓冲区的内容
  • ob_get_clean— 得到当前缓冲区的内容并删除当前输出缓。
  • ob_get_contents— 返回输出缓冲区的内容
  • ob_get_flush— 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
  • ob_get_length— 返回输出缓冲区内容的长度
  • ob_get_level— 返回输出缓冲机制的嵌套级别
  • ob_get_status— 得到所有输出缓冲区的状态
  • ob_gzhandler— 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
  • ob_implicit_flush— 打开/关闭绝对刷送
  • ob_list_handlers— 列出所有使用中的输出处理程序。
  • ob_start— 打开输出控制缓冲 ob不缓存header
  • output_add_rewrite_var— 添加URL重写器的值(Add URL rewriter values)
  • output_reset_rewrite_vars— 重设URL重写器的值(Reset URL rewriter values)
$contents=ob_get_contents();
file_put_contents("log.txt",$contents);

深入理解ob_flush和flush的区别

http://www.laruence.com/2010/04/15/1414.html


-----------------------------------

文件操作

file_exists() 函数检查文件或目录是否存在

file_get_contents()得到文件

file_put_contents()生成文件

----------------------------------

正则表达式

preg_match

preg_match 匹配到一次就会停止,设置匹配到的一个匹配

preg_match_all

preg_match_all() 返回的是所有匹配的数组
------------------------------------------------

防盗链

if(isset($_SERVER['HTTP_REFERER']){
if(strpos($_SERVER['HTTP_REFERER',"http://localhost/"==0){
}
}

-----------------------------------

ping的通却不能远程解析URL试试wget

HTTP request sent, awaiting response... 403 Forbidden
10:58:22 ERROR 403: Forbidden.

break和continue

break结束当前for,foreach,while,do..while 或者 switch 结构的执行。
break 可以接受一个可选的数字参数来决定跳出几重循环。


continue 在循环结构用用来跳过本次循环中剩余的代码并开始执行本循环结构的下一次循环。
注意在 PHP 中 switch 语句被认为是作为 continue 目的的循环结构。
continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。

输出1像素细的表格

if(!empty($datas)){
echo "<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\" bgcolor=\"#58CB64\"><tr><td width=\"100\" bgcolor=\"#FFFFFF\">id</td><td width=\"200\" bgcolor=\"#FFFFFF\">时间</td></tr>";
foreach($events as $event){
echo "<tr><td bgcolor=\"#FFFFFF\">".$datas['Id']."</td><td bgcolor=\"#FFFFFF\">".$datas['inTime']."</td></tr>";
}
echo "</table>";
}
----------------------------------

调试

通过set_error_handler来捕获线上运行错误,统一收集日志、报警
通过register_shutdown_function来捕获fatal errors、记录运行时间

Xdebug、xhprof

$start=microtime(true);

///

$cost=microtime(true)-$start

----------------------------------

1.PHP和JS交互

[html] view plain copy
  1. <?php
  2. $a=1;
  3. ?>
  4. <scripttype="text/javascript">
  5. vara=<?=$a?>;
  6. alert(a);
  7. </script>

拼凑HTML

<? if(1==1):?>
<div id='search'></div>
<?endif?>


2.PHP字符串技巧

  1. <?php
  2. $str="Hello";
  3. $number=123;
  4. $txt=sprintf("%sworld.Daynumber%u",$str,$number);
  5. echo$txt;
  6. ?>


输出:Hello world. Day number 123

单引号和双引号

单引号: ’a string’
不能内嵌变量, \’是唯一的转义码
双引号: ”a $better string\n”
可内嵌变量, 标准的转义码能正常使用
“Here-doc” 语法:
$foo = <<<END

END;
对于多行的大文本或html非常有用
支持内嵌变量
注意: 以<<<END开头,后面另起新行
END; 占用一行,不能有空格

重复输出
str_repeat("A",5);

字符串连接小技巧

逗号,也可以和点号.一样连接字符串,同时性能上逗号还好一些,但是非常有限。

字符串保护变量的时候使用双引号。

substr() 函数返回字符串的一部分

substr(string,start,length)

  1. <?php
  2. echosubstr("Helloworld!",6);
  3. ?>


输出:world!

strpos() 和strrpos()

strpos() 返回字符串在另一字符串中首次出现的位置【对大小写敏感】

stripos() 返回字符串在另一字符串中首次出现的位置【对大小写不敏感】

strrpos() 返回字符串在另一字符串中最后出现的位置【对大小写敏感】

strripos() 返回字符串在另一字符串中最后出现的位置【对大小写不敏感】

如果成功,则返回位置,否则返回 false。

  1. <?php
  2. echostrpos("Helloworld!","wo");
  3. ?>

输出:6

PHP界定符
<<<eot 和eot是界定符,他们之间的内容php将会识别为一段大的字符串,相当于""。

  1. <?php
  2. $a=1;
  3. echo<<<eot
  4. <scriptlanguage="JavaScript"type="text/JavaScript">
  5. vara=$a;
  6. alert(a);
  7. </script>
  8. eot;
  9. ?>


addslashes() 函数

在指定的预定义字符前添加反斜杠。防sql注入

返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL字符)。

$str = "Is \your name O'reilly?";
// 输出:Is \\your name O\'reilly?

echo addslashes($str);

使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。

  1. <p>$ip=gethostbyname('www.baidu.com');
  2. $long=ip2long($ip);</p><p>if($long==-1||$long===FALSE){
  3. echo'InvalidIP,pleasetryagain';
  4. }else{
  5. echo$ip."</br>";//192.0.34.166
  6. echo$long."</br>";//-1073732954
  7. printf("%u</br>",ip2long($ip));//3221234342
  8. }
  9. ?></p>
  1. 在验证email地址的时候使用checkdnsrr()函数验证域名是否存在。这个内置函数能够确认指定的域名能够解析成IP地址。该函数的PHP文档的用户评论部分有一个简单的用户自定义函数,这个函数基于checkdnsrr(),用来验证email地址的合法性。
strcmp() 函数比较两个字符串。
0 - 如果两个字符串相等;<0 - 如果 string1 小于 string2;>0 - 如果 string1 大于 string2

htmlspecialchars() 把一些预定义的字符转换为 HTML 实体

intval

本函数可将变量转成整数类型。可省略的参数 base 是转换的基底,默认值为 10。转换的变量 var 可以为数组或类之外的任何类型变量。

  1. <spanstyle="BACKGROUND-COLOR:#ffffff"><?php
  2. echointval(42);//42
  3. echointval(4.2);//4
  4. echointval('42');//42
  5. echointval('+42');//42
  6. echointval('-42');//-42
  7. echointval(042);//34
  8. echointval('042');//42
  9. echointval(1e10);//1410065408
  10. echointval('1e10');//1
  11. echointval(0x1A);//26
  12. echointval(42000000);//42000000
  13. echointval(420000000000000000000);//0
  14. echointval('420000000000000000000');//2147483647
  15. echointval(42,8);//42
  16. echointval('42',8);//34
  17. echointval(array());//0
  18. echointval(array('foo','bar'));//1
  19. ?>
  20. </span>

3.PHP数组技巧

http://www.cnblogs.com/kym/archive/2010/03/04/1678726.html

PHP默认就是不定长数组,php中的数组,是数组(array),是队列(queue),是堆栈(stack),也是哈希(hash table),还是向量(vector)。

$arr[1]=123;
$arr['b']=124;

print_r($arr);

$a="abc";
echo $a[1];

  1. <html>
  2. <head>
  3. <title>测试</title>
  4. <metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
  5. </head>
  6. <body>
  7. <?php
  8. $a=array('aa','bb','cc');
  9. $a[3]="dd";
  10. for($i=0;$i<4;$i++)
  11. {
  12. echo$a[$i]."</br>";
  13. }
  14. $b=array('a'=>0,'b'=>1,'c'=>2);
  15. echo$b['a']."</br>";
  16. foreach($bas$key=>$value)
  17. {
  18. echo$key."-".$value."</br>";
  19. }
  20. //each()函数生成一个由数组当前内部指针所指向的元素的键名和键值组成的数组,并把内部指针向前移动。
  21. //返回的数组中包括的四个元素:键名为0,1,key和value。单元0和key包含有数组单元的键名,1和value包含有数据。
  22. //如果内部指针越过了数组范围,本函数将返回FALSE。
  23. //注释:list()函数只用于数字索引的数组,且假定数字索引从0开始。
  24. while(list($c1,$c2,$c3)=each($a))
  25. {
  26. echo"$c1-$c2-$c3</br>";
  27. }
  28. ?>
  29. </body></html>


输出:

aa
bb
cc
dd
0
a-0
b-1
c-2
0-aa-
1-bb-
2-cc-
3-dd-

说明:对于foreach其实 用$key=>$value和$i => $g 是效果一样的,并不仅限于key value

  1. <?php
  2. echo"<br/>\n";
  3. $arr=array("one","two","three");
  4. foreach($arras$i=>$g){
  5. echo"Key:$i;Value:$g<br/>\n";
  6. }
  7. ?>
reset() 函数

reset() 函数把数组的内部指针指向第一个元素,并返回这个元素的值。

  1. <?php
  2. $people=array("Peter","Joe","Glenn","Cleveland");
  3. echocurrent($people)."<br/>";
  4. echonext($people)."<br/>";
  5. echoreset($people);
  6. ?>


输出:
Peter
Joe
Peter

array_fill()函数

用给定的值填充数组

  1. <?php
  2. $a=array_fill(5,6,'banana');
  3. print_r($a);
  4. ?>


输出:

Array ( [5] => banana [6] => banana [7] => banana [8] => banana [9] => banana [10] => banana )

4.打印数组(PHP模式和JSON模式)

  1. $data=array(
  2. 'firstname'=>'Tom',
  3. 'lastname'=>'Smith',
  4. 'age'=>40
  5. );
  6. print_r($data);
  7. echojson_encode($data);

输出:

Array ( [firstname] => Tom [lastname] => Smith [age] => 40 )

{"firstname":"Tom","lastname":"Smith","age":40}

说明:print_r($data,true);这样才可以把数组写到日志

$a = array ("a", "b", "c");
$c= print_r($a,true);

$logfile = "t.txt";

error_log("{$c}\r\n\r\n",3,$logfile);

  1. <?php
  2. $hello=array('1','2','3');
  3. $helloJson=json_encode($hello);
  4. echo$helloJson;
  5. ?>


输出:["1","2","3"]

说明:如果是一维数组json后是[],二维是{}

implode() 函数

implode() 函数把数组元素组合为一个字符串。

  1. <?php
  2. $arr=array('Hello','World!','Beautiful','Day!');
  3. echoimplode("",$arr);
  4. ?>


输出:

Hello World! Beautiful Day!

join() 函数是 implode() 函数的别名。

var_dump()

$a = array ("a", "b", "c");
var_dump ($a);
echo "<br>";
print_r($a);
echo "<br>";

输出:

array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
Array ( [0] => a [1] => b [2] => c )


5.判断是否数组

if(is_array($ac))

6.类与引用

  1. classcommon
  2. {
  3. public$Name=3;
  4. publicfunctionshow()
  5. {
  6. echo($this->Name);
  7. }
  8. }
  9. $am=newcommon();
  10. $am->show();


注意是$this->Name 不是$this->$Name

7.静态变量(不同于C#,java等的全局变量)

  1. classcommon
  2. {
  3. publicfunctionshow()
  4. {
  5. static$ap=1;
  6. $ap*=2;
  7. echo$ap;
  8. }
  9. }
  10. $am=newcommon();
  11. $am->show();
  12. $am->show();

输出:2 4


8.函数中的静态成员

  1. classcommon
  2. {
  3. publicstatic$ap=1;
  4. publicfunctionshow()
  5. {
  6. self::$ap*=2;
  7. echoself::$ap;
  8. }
  9. }
  10. $am=newcommon();
  11. $am->show();

和$this不同,静态变量引用必须加$

  1. classMyObject
  2. {
  3. publicstatic$myVar=0;
  4. functionmyMethod()
  5. {
  6. self::$myVar+=2;
  7. echoself::$myVar."/n";
  8. }
  9. }
  10. classMyOtherObjectextendsMyObject
  11. {
  12. functionmyMethod()
  13. {
  14. echo"基类myMethod被重写";
  15. }
  16. functionmyOtherMethod()
  17. {
  18. echo"myExtendsedMethod"."/n";
  19. self::myMethod();//在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法.
  20. parent::myMethod();//如果基类的方法被重写的情况下,你希望调用定义在基类的方法,可以使用parent作用域.
  21. parent::myMethod();//静态成员
  22. }
  23. }
  24. MyOtherObject::myOtherMethod();

9.常量

http://www.php.net/manual/zh/language.constants.php

//合法的常量名
define("FOO","something");

//使用

echo FOO

10.文件路径

dirname(__FILE__);//当前文件所在文件夹

dirname(dirname(__FILE__));//当前文件所在文件夹的上一层文件夹,这样如果是和当前路径平行的目录可以直接后面加上即可,如果是更上面的需要再网上回溯。

11.引入文件

require_once(dirname(__FILE__).文件名);//引入当前目录的某文件


12.执行远程文件

echo file_get_contents("http://www.baidu.com");

13.error_log记日志

$logfile = "/www/ws.txt";
$dd = '时间'.date("Y-m-d H:i:s").'| 来源:'.$_SERVER['HTTP_REFERER'].'| IP:'.$_SERVER['REMOTE_ADDR'].'|主机名:'.$_SERVER['REMOTE_HOST'] ;
error_log("{$dd}\r\n\r\n",3,$logfile);

14.常用时间


echo date('Ymd');
echo date("[Y-m-d H:i:s]");

php拆分日期时间,因为日期的长度是固定的,所以可直接用substr来做

echo substr(date("Y-m-d H:i:s"),0,10);//日期

echo substr(date("Y-m-d H:i:s"),10);//时间

unix时间戳和当前时差几天

select datediff(now(),FROM_UNIXTIME(1328803108))

15.sprintf() 函数

把格式化的字符串写写入一个变量中。

$str = "Hello";$number = 123;$txt =sprintf("%s world. Day number %u",$str,$number);

16.isset()函数

isset()函数一般用来检测变量是否设置,使用 unset() 释放变量之后,它将不再是 isset()。

empty()函数 判断值为否为空


17.class_exists陷阱

if(class_exists("类名"));

如果由class_name所指的类已经定义,此函数返回TRUE,否则返回FALSE

只要代码中有就是True,而不是new一个

18.implementsInterface

//如果该类实现 了IController接口
if($rc->implementsInterface('接口名'))

19.ReflectionClass

//利用反射api构造一个控制器类对应的反射类
$rc = new ReflectionClass(‘类名’);

20.hasMethod

//该类拥有解析后的action字符串所指向的方法名
if($rc->hasMethod('方法名'))

21.newInstance

//构造一个控制器类的实例
$controller = $rc->newInstance();

22.getMethod

获取该类$action参数所指向的方法对象
$method = $rc->getMethod('方法');

23.isStatic

//如果方法是静态的
if($rc->isStatic())

24.invoke

PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象.使用反射api 来调用一个方法.

注意静态和非静态不同

if($plugin->hasMethod('getMenuItems')) {
/*实例化一个方法实例(注意当你将类和方法看成概念时,它们就可以有实例,
就像“人”这个概念一样),该方法返回的是ReflectionMethod 的实例*/
$reflectionMethod = $plugin->getMethod('getMenuItems');
//如果方法是静态的
if($reflectionMethod->isStatic()) {
//调用静态方法,注意参数是null 而不是一个反射类实例
$items = $reflectionMethod->invoke(null);
} else {
//如果方法不是静态的,则先实例化一个反射类实例所代表的类的实例。
$pluginInstance = $plugin->newInstance();
//使用反射api 来调用一个方法,参数是通过反射实例化的对象引用
$items = $reflectionMethod->invoke($pluginInstance);
}

25.explode()

可以讲字符串打散为数组的格式

explode(separator,string,limit)

参数分析:
separator:指定以什么字符来打散
string: 需要被打散的字符串
limit: 限制被打散的数组元素最多为多少个

26.chunk_split()

chunk_split() 函数能够把字符串分割为一块一块的更小的字符串块。
下面写了一个可以分割中文字符串的函数。

/**
* 分割字符串
* @param String $str 要分割的字符串
* @param int $length 指定的长度
* @param String $end 在分割后的字符串块追加的内容
* @param String $charset 字符编码,默认为utf-8
*/
function mb_chunk_split($str,$length, $end, $charset='utf-8')
{
if (empty($str)) return false;
if ( $charset != 'utf-8' ) $length = $length*2;
return chunk_split($str, $length, $end);
}


$str = '六一马上就要到了';
$str1 = 'aabbccddeefff';
echo mb_chunk_split($str, 2, '...', 'gb2312'); // 六一...马上...就要...到了...
echo mb_chunk_split($str1, 2, '...'); // aa...bb...cc...dd...ee...ff...f...

$str = 'one|two|three|four';
print_r(explode('|', $str, 2)); // Array( [0] => one [1] => two|three|four)

print_r(explode('|', $str, -1)); // Array( [0] => one [1] => two [2] => three)

27.microtime() 函数

microtime() 函数返回当前 Unix 时间戳和微秒数。

如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。

echo(microtime());

0.32491200 1321251369

28.die()函数

die() 函数输出一条消息,并退出当前脚本。


将类传给函数是引用

<?php
class per{
public $name;
}
$a=new per();
$a->name="AAA";


function t($a)
{
$a->name="CCC";
}
t($a);
echo $a->name;
?>

输出:CCC


析构函数

__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.
析构函数允许你在使用一个对象之后执行任意代码来清除内存.
当PHP决定你的脚本不再与对象相关时,析构函数将被调用.

<?php
class per{
public $name;
function __destruct(){
echo $this->name."销毁资源<br/>";
}
}


$a=new per();
$a->name="AAA";
$b=new per();
$b->name="CCC";
?>

输出:

CCC销毁资源
AAA销毁资源

因为栈是先入后出$a先入,$b后入

析构方法小结:

php5加入析构方法function __destruct()

析构方法没有返回值

一个类最多一个析构方法

析构方法会自动调用

析构方法自身主要用于销毁资源,而并不消耗对象,在销毁对象前,系统自动的调用该类的析构方法

析构方法调用顺序是先创建的对象后被销毁!

析构方法什么时候被调用?

当程序进程结束退出时;

当一个对象成为垃圾对象的时候,该对象的析构方法也会被调用;

所谓垃圾对象,就是指没有任何变量再引用它

一旦一个对象成为垃圾对象,析构方法就会立即调用!(C#和java不会立即)



php垃圾回收器

在php中,当一个对象没有任何引用指向它的时候,就会成为一个垃圾对象,php将启用垃圾回收器将对象销毁,从而回收该对象占用的内存

当程序退出前,php也将启用垃圾回收器,销毁对象


<?php
class per{
public $name;
function __destruct(){
echo $this->name."销毁资源<br/>";
}
}


$a=new per();
$a->name="AAA";
//$d=$a;
$a=null;
$b=new per();
$b->name="BBB";
$c=new per();
$c->name="CCC";
?>

输出:

AAA销毁资源
CCC销毁资源
BBB销毁资源


看出差异

<?php
class per{
public $name;
function __destruct(){
echo $this->name."销毁资源<br/>";
}
}


$a=new per();
$a->name="AAA";
$d=$a;
$a=null;
$b=new per();
$b->name="BBB";
$c=new per();
$c->name="CCC";
?>

输出:

CCC销毁资源
BBB销毁资源
AAA销毁资源


构造函数

构造函数对对象的引用是$this-> 而不可直接赋值!

class per{
public $name;

public function __construct($iname)

{

$this->name=$iname;

//$name=$iname;//这样会认为是一个新的对象!

}

系统会给每个对象分配this,this代表当前对象的地址,谁调用代表谁,那个对象使用到$this就是那个对象地址,this在代码区

this不能在类定义的外部使用,只能在类定义的方法中使用

php4构造方法和类同名,php5也可以__construct

构造方法没有返回值,主要作用是完成对象初始化,并不创建对象本身

在创建新对象以后,系统自动调用该类的构造方法

一个类只能有一个构造方法,自定义构造方法会覆盖默认的构造方法

构造函数默认修饰符是public

你可能感兴趣的:(PHP)