PHP精华
PHP性能優化?
1.使用靜態方法
2避免函數調用
- time() – $_SERVER[REQUEST_TIME];
- phpversion() – PHP_VERSION
- get_class – __CLASS__
- is_null – NULL ===
- print() – echo
3.使用include代替include_once,include_once內部會做一次hash查找
4.避免使用@屏蔽錯誤
@func()等效于:
$old = ini_set(“error_reporting”, 0);
func();
ini_set(“error_reporting”, $old);
5.避免使用臨時變量
6.避免是喲PCRE系列函數,用strpos, str_replace, strstr, strrchr等函數代替
Oracle建表最好帶的默認字段
字段名 | 注釋 | 默認值 | 怎樣獲取 |
ADD_DATE | 創建時間 | SYSDATE | 新增的時候系統自動獲取不用寫可以精確到2012-08-03 16:28:12 |
ADD_USER_ID | 創建人ID | ? | ? |
LAST_DATE | 最后修改時間 | SYSDATE | Sql語句中直接寫LAST_DATE =? SYSDATE只會精確到2012-08-03 16:28:12 |
LAST_USER_ID | 修改人 | ? | ? |
LATEST_TIME | ? | Systimestamp (分數秒精度6) | 新增的時候系統自動獲取不用寫,編輯的時候sql語句直接寫LATEST_TIME = systimestamp可以精確到2012-08-16 11:27:49:550780 ? |
?
=======
PHP替換字符串指定位數為特定字符*
$a=123456789012;
$a=substr_replace($a,"******",2).substr($a,8);
echo $a;
===========
empty 認為0為空
判斷含0的值不為空要用
if($a!="") {
?
保留2位小數
?number_format($goods_price, 2, '.', '')
==================
smarty foreach 技巧
foreach 在模板時簡單使用使用方法為:<{foreach name=test from=$test item=item key=key}>
???? <{$item.name}>
<{/foreach}>
其在$smarty內部有幾個值可供使用.
$smarty.foreach.test.name???????? 名稱
$smarty.foreach.test.total?????????? 迭代總數
$smarty.foreach.test.iteration??? 當前迭代index
?
=================
?uniqid() 函數基于以微秒計的當前時間,生成一個唯一的 ID。echo uniqid();
本例產生 32 個字符的獨一無二字符串。
<?php
$token = md5(uniqid(rand()));
echo $token;
?>
?
?自動加載
dc.php
=================================
dc.php
<?php
class dc
{
?public static function delivery_status($key=NULL)
?{
??$arr = array(0=>'待發貨',1=>'已發貨');
??if($key!=NULL)
??{
???return $arr[$key];
??}
??return $arr;
?}
}
?>
=============require_once====================
test.php
<?php
//require 'dc.php';
require_once 'dc.php';
$obj? = new dc();
print_r($obj::delivery_status());
?>
=============autoload====================
<?php
function __autoload($classname) {
? require_once ("class/$classname.php");
}
$obj? = new dc();
print_r($obj::delivery_status());
?>
=============spl_autoload_register====================
<?php
function loader($class)
{
$file = 'class/'.$class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');
$obj? = new dc();
print_r($obj::delivery_status());
?>
=================================
?
?
PHP版本
echo phpversion();
?
$_REQUEST
HTTP請求有POST和GET。在寫表單form時可以指定action為post或get。數組$_POST中保存POST方法傳遞的變量, $_GET保存GET方法傳遞的變量。$_REQUEST中包含二者。例如 <form action="t.php" action="get"><input type="text" name="aaa"></form>在t.php中,可以使用$_GET['aaa']獲得網頁表單中填寫的數據.當form中的action為get時使用$_GET;action為post時用$_POST。二者都可用 $_REQUEST
?
array_push()
<?php$a=array("a"=>"Dog","b"=>"Cat");array_push($a,"Horse","Bird");print_r($a);?>
Array ( [a] => Dog [b] => Cat [0] => Horse [1] => Bird )
注釋:即使數組中有字符串鍵名,您添加的元素也始終是數字鍵
?
保留小數
$a=112222123;
echo number_format($a,2);
echo ("</br>");
echo(round($a, 2));
echo ("</br>");
echo sprintf("%.2f", $a);
$a=112222123;
echo number_format($a,2);
echo ("</br>");
echo(round($a, 2));
echo ("</br>");
echo sprintf("%.2f", $a);$a=112222123;
echo number_format($a,2);
echo ("</br>");
echo(round($a, 2));
echo ("</br>");
echo sprintf("%.2f", $a);
empty 如果 變量 是非空或非零的值,則 empty() 返回 FALSE。換句話說,”"、0、”0″、NULL、FALSE、array()、var $var、未定義;以及沒有任何屬性的對象都將被認為是空的,如果 var 為空,則返回 TRUE。isset 如果 變量 存在(非NULL)則返回 TRUE,否則返回 FALSE(包括未定義)。變量值設置為:null,返回也是false;unset一個變量后,變量被取消了。注意,isset對于NULL值變量,特殊處理。is_null 檢測傳入值【值,變量,表達式】是否是null,只有一個變量定義了,且它的值是null,它才返回TRUE . 其它都返回 FALSE 【未定義變量傳入后會出錯!】
“<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)
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 plaincopy- <?php??
- $a=1;??
- ?>??
- <script?type="text/javascript">??
- var?a=<?=$a?>;??
- alert(a);??
- </script>??
拼湊HTML
<? if(1==1):?>
??? <div id='search'></div>
? <?endif?>
2.PHP字符串技巧
- <?php??
- $str?=?"Hello";??
- $number?=?123;??
- $txt?=?sprintf("%s?world.?Day?number?%u",$str,$number);??
- echo?$txt;??
- ?>??
輸出: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)
[php]?view plaincopy- <?php??
- echo?substr("Hello?world!",6);??
- ?>??
輸出:world!
?
strpos() 和strrpos()
strpos() 返回字符串在另一字符串中首次出現的位置【對大小寫敏感】
stripos() 返回字符串在另一字符串中首次出現的位置【對大小寫不敏感】
strrpos() 返回字符串在另一字符串中最后出現的位置【對大小寫敏感】
strripos() 返回字符串在另一字符串中最后出現的位置【對大小寫不敏感】
?
如果成功,則返回位置,否則返回 false。
[php]?view plaincopy- <?php??
- echo?strpos("Hello?world!","wo");??
- ?>??
輸出:6
?
PHP界定符
<<<eot 和eot是界定符,他們之間的內容php將會識別為一段大的字符串,相當于""。
?
[php]?view plaincopy- <?php??
- $a=1;??
- echo?<<<eot??
- <script?language="JavaScript"?type="text/JavaScript">??
- var?a?=?$a;??
- alert(a);??
- </script>??
- eot;??
- ?>???
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 個字節),計算一個特定的地址是不是在一個區段內頁更簡單了,而且加快了搜索和排序的速度(雖然有時僅僅是快了一點)。
[php]?view plaincopy- <p>$ip???=?gethostbyname('www.baidu.com');??
- $long?=?ip2long($ip);</p><p>if?($long?==?-1?||?$long?===?FALSE)?{??
- ????echo?'Invalid?IP,?please?try?again';??
- }?else?{??
- ????echo?$ip???.?"</br>";???????????//?192.0.34.166??
- ????echo?$long?.?"</br>";???????????//?-1073732954??
- ????printf("%u</br>",?ip2long($ip));?//?3221234342??
- }??
- ?>?</p>??
- ???
- 在驗證?email?地址的時候使用?checkdnsrr()?函數驗證域名是否存在。這個內置函數能夠確認指定的域名能夠解析成?IP?地址。該函數的PHP?文檔的用戶評論部分有一個簡單的用戶自定義函數,這個函數基于?checkdnsrr(),用來驗證?email?地址的合法性。??
- ???
strcmp() 函數比較兩個字符串。
0 - 如果兩個字符串相等;<0 - 如果 string1 小于 string2;>0 - 如果 string1 大于 string2
?
htmlspecialchars() 把一些預定義的字符轉換為 HTML 實體
?
intval
本函數可將變量轉成整數類型。可省略的參數 base 是轉換的基底,默認值為 10。轉換的變量 var 可以為數組或類之外的任何類型變量。
[php]?view plaincopy- <span?style="BACKGROUND-COLOR:?#ffffff"><?php??
- echo?intval(42);??????????????????????//?42??
- echo?intval(4.2);?????????????????????//?4??
- echo?intval('42');????????????????????//?42??
- echo?intval('+42');???????????????????//?42??
- echo?intval('-42');???????????????????//?-42??
- echo?intval(042);?????????????????????//?34??
- echo?intval('042');???????????????????//?42??
- echo?intval(1e10);????????????????????//?1410065408??
- echo?intval('1e10');??????????????????//?1??
- echo?intval(0x1A);????????????????????//?26??
- echo?intval(42000000);????????????????//?42000000??
- echo?intval(420000000000000000000);???//?0??
- echo?intval('420000000000000000000');?//?2147483647??
- echo?intval(42,?8);???????????????????//?42??
- echo?intval('42',?8);?????????????????//?34??
- echo?intval(array());?????????????????//?0??
- echo?intval(array('foo',?'bar'));?????//?1??
- ?>???
- </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];
- <html>??
- ????<head>??
- ????????<title>測試</title>??
- ????????<meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8">??
- ????</head>??
- ????<body>??
- <?php??
- $a=array('aa','bb','cc');??
- $a[3]="dd";??
- for($i=0;$i<4;$i++)??
- {??
- ???echo?$a[$i]."</br>";??
- }??
- ??
- $b=array?('a'=>0,'b'=>1,'c'=>2);??
- echo?$b['a']."</br>";??
- foreach($b?as?$key=>$value)??
- {??
- ???echo?$key."-".$value."</br>";??
- }??
- ??
- //each()函數生成一個由數組當前內部指針所指向的元素的鍵名和鍵值組成的數組,并把內部指針向前移動。??
- //返回的數組中包括的四個元素:鍵名為?0,1,key?和?value。單元?0?和?key?包含有數組單元的鍵名,1?和?value?包含有數據。??
- //如果內部指針越過了數組范圍,本函數將返回?FALSE。??
- ??
- //注釋:list()函數只用于數字索引的數組,且假定數字索引從?0?開始。??
- while(list($c1,$c2,$c3)=each($a))??
- {??
- ????echo?"$c1-$c2-$c3</br>";??
- }??
- ?>???
- </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
[php]?view plaincopy- <?php??
- ????echo?"<br?/>\n";??
- $arr?=?array("one",?"two",?"three");??
- ??
- ??
- foreach?($arr?as?$i?=>?$g)?{??
- ????echo?"Key:?$i;?Value:?$g<br?/>\n";??
- }??
- ?>??
- ???
[php]?view plaincopyreset() 函數把數組的內部指針指向第一個元素,并返回這個元素的值。
- <?php??
- $people?=?array("Peter",?"Joe",?"Glenn",?"Cleveland");??
- ??
- echo?current($people)?.?"<br?/>";??
- echo?next($people)?.?"<br?/>";??
- echo?reset($people);??
- ?>??
?
輸出:
Peter
Joe
Peter
?
array_fill?()函數
用給定的值填充數組
?
[php]?view plaincopy- <?php??
- $a?=?array_fill(5,?6,?'banana');??
- print_r($a);??
- ?>??
輸出:
Array ( [5] => banana [6] => banana [7] => banana [8] => banana [9] => banana [10] => banana )
?
4.打印數組(PHP模式和JSON模式)
[php]?view plaincopy- $data?=?array(??
- 'firstname'=>'Tom',??
- 'lastname'=>'Smith',??
- 'age'=>40??
- );??
- ??
- print_r($data);??
- echo?json_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);
?
[php]?view plaincopy- <?php??
- $hello?=?array('1','2','3');??
- $helloJson?=?json_encode($hello);??
- echo?$helloJson;??
- ?>??
輸出:["1","2","3"]
說明:如果是一維數組json后是[],二維是{}
?
implode() 函數
implode() 函數把數組元素組合為一個字符串。
?
[php]?view plaincopy- <?php??
- $arr?=?array('Hello','World!','Beautiful','Day!');??
- echo?implode("?",$arr);??
- ?>??
輸出:
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.類與引用
[php]?view plaincopy- class?common??
- {??
- ??public?$Name?=?3;??
- ??public?function?show()??
- ????{??
- ????????echo?($this->Name);??
- ????????}??
- }??
- $am=new?common();??
- $am->show();??
注意是$this->Name? 不是$this->$Name
?
7.靜態變量(不同于C#,java等的全局變量)
[php]?view plaincopy- class?common??
- {??
- ????public?function?show()??
- ????{??
- ????????static?$ap=1;??
- ????????$ap*=2;??
- ????????echo?$ap;??
- ????????}??
- }??
- ??
- $am=new?common();??
- $am->show();??
- $am->show();??
輸出:2?? 4
?
8.函數中的靜態成員
[php]?view plaincopy- class?common??
- {??
- ????public?static?$ap=1;??
- ??public?function?show()??
- ????{??
- ?????????????????
- ????????self::$ap*=2;??
- ????????echo?self::$ap;??
- ????????}??
- }??
- ??
- $am=new?common();??
- $am->show();??
和$this不同,靜態變量引用必須加$
?
- class?MyObject????
- {????
- ????public?static?$myVar?=?0;????
- ????????
- ????function?myMethod()????
- ????{????
- ????????self::$myVar+=2;????
- ????????echo?self::$myVar?.?"/n";????
- ????}????
- }????
- ????
- class?MyOtherObject?extends?MyObject????
- {????
- ????function?myMethod()????
- ????{????
- ????????echo?"基類myMethod被重寫";????
- ????}????
- ????????
- ????????
- ????function?myOtherMethod()????
- ????{????
- ????????echo?"myExtendsedMethod"?.?"/n";????
- ????????self::myMethod();?//在擴展類中使用self作用域時,self可以調用基類中聲明的方法,但它調用的總是已經在擴展類中重寫的方法.?????
- ????????parent::myMethod();//如果基類的方法被重寫的情況下,你希望調用定義在基類的方法,可以使用parent作用域.?????
- ????????parent::myMethod();//靜態成員?????
- ????}????
- }????
- ????
- 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
?
?PHP中date()函數與Oracle的to_date()和to_char()的使用
在Oracle中的日期類型為DATE,無法和字符串直接進行匹配,需要轉化,或者把字符串通過to_date()轉化為日期格式進行比較,或者使 用to_char
('column_name','yyyy-mm-dd')等方法轉化為字符串后進行比較。就獲得正確的記錄了。
to_date( '".$params['ORDER_TIME']."','YYYY-MM-DD')
TO_DATE(:BEGIN_DATE,'yyyy-mm-dd hh24:mi:ss')
當前時間
to_date('".date('Y-m-d H:i:s')."','yyyy-mm-dd hh24:mi:ss')
?
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
總結
- 上一篇: 求我和我的祖国电影资源
- 下一篇: 等不到我爱的人是什么歌呢