php權威編程有趣部分
1.isset empty
如果遇到null,isset判斷為false;empty 判斷為true
isset(var1, var2,...) 可以判斷多個變量
2.unset
unset可以取消之前定義的變量,如果該變量沒有被其他變量引用的話,就會釋放這個變量占用的內存空間.
3.php5中對象的傳遞是一個引用傳遞
4.== 和 ===
==比較時,執行類型轉換,再比較;
===不僅比較類型,還比較數值.
5.++$var 和 $var++的區別
++$var: 前加操作,$val的值+1,表達式返回$val新值(增加1);前加意思就是先對變量+1,再返回該變量的值
$var++: 後加操作,$val的值+1,表達式返回$val原來的值;後加就是先返回變量的值,再對變量+1
字符串也可以遞增/遞減:
$a = ‘A‘;
echo $a++; // 輸出 A
echo ++$a; // 輸出 B
6.""和‘‘區別
"":替換變量,進行轉義
‘‘:不對變量進行替換,僅對\‘轉義和在單引號前面的\\進行轉義
7.include和require
include:如果包含文件或URL不存在,僅發出一個警告,不會終止程序運行;
require:如果包含文件或URL不存在,停止程序運行;
除此外,兩者再無區別;
8.global
global $val1, $val2...;
不建議使用,運行時造成賦值混亂,不支持unset()等.
9.通過引用返回值:
在函數名前加&,將返回變量的地址;而不是變量的拷貝.
<?php function & getNum($name) { return $GLOBALS[$name]; } $num = 100; $val = & getNum(‘num‘); // 返回了$num的地址 print $val; $num = 500; // $num的更改,引起了$val的更改,因為$val通過引用指向了$num的地址. echo ‘<br>‘; echo $val; ?>
輸出:
100
500
不經常用到,如果使用,請小心使用.
10.按值傳遞和按引用傳遞:
使用按值傳遞還是按引用傳遞,是在函數定義的時候設置,而不是在調用的時候設置.
function func(&$val) { ....... } func(100);
11.靜態變量僅在局部函數域中存在且只被初始化一次,當程序執行離開此作用域時,其值不會消失,會使用上次執行的結果。
12.因為構造函數不能產生返回值,從構造函數內產生錯誤最常用的做法是拋出一個異常.
13.php並不能保證析構函數調用的準確時間點.
14.接口是可以包含常量的
<?php interface Log { const LOG_NAME = ‘log‘; public function log(); } class Dog implements Log { public function log() { echo Log::LOG_NAME . ‘:‘ . date(‘Y-m-d‘); } } $dog = new Dog(); $dog->log();
15.接口可以多重繼承,接口也可以繼承接口.
16.異常就是異常,異常應該被用來處理問題,而不是控制流程
17.可以設置參數類型:
function func(MyClass $obj) { .... }
18.call 和 call_user_function_array()
<?php class Hello { public function say() { echo ‘hello world‘; } } class HelloDelegator { private $obj; public function __construct() { $this->obj = new Hello(); } public function __call($method, $args) { return call_user_func_array(array($this->obj, $method), $args); } } $hello = new HelloDelegator(); $hello->say();
19.__autoload和spl_autoload_registe:自動註冊類文件
20.ArrayAccess接口:用數組的方式訪問對象
代碼示例:
class User implements ArrayAccess { private $users; // 是否存在 public function offsetExists($offset) { return isset($this->users[$offset]); } // 取值 public function offsetGet($offset) { return $this->users[$offset]; } // 賦值 public function offsetSet($offset, $value) { return $this->users[$offset] = $value; } public function offsetUnset($offset) { unset($this->users[$offset]); } } $user = new User(); if (isset($user[‘100‘])) { echo ‘no set‘; } else { $user[‘100‘] = ‘hello‘; } echo $user[‘100‘]; unset($user[‘100‘]);
20.settype(&val, type) // 通用類型轉換
<?php $a = ‘100‘; settype($a, ‘int‘); echo $a;
21.在session被修改或賦值後,為防止session被鎖,應該使用session_write_close()關閉session文件.
22.DirectoryIterator:文件夾遍歷
<?php $files = new DirectoryIterator(‘c:/‘); foreach ($files as $f) { echo $f . "\n"; } 23.proc_open與進程交互: <?php $fin = fopen(‘code.php‘, ‘r‘); $fou = fopen(‘a.php‘, ‘w‘); $desc = array(0 => $fin, 1 => $fou); $res = proc_open(‘php‘, $desc, $pipe); if ($res) { proc_close($res); } // 執行 php code.php 並將其結果寫入a.php <?php $fou = fopen(‘a.php‘, ‘w‘); $desc = array(1 => $fou); $res = proc_open(‘ping www.baidu.com‘, $desc, $pipe); if ($res) { proc_close($res); } //執行ping,將結果寫入a.php
24.正則表達式定界符可以用|和@
php權威編程有趣部分