<code><code>
11.異常處理
<code><code>用戶可以用自定義的異常類來擴展。以下的程式碼說明了在內建的異常處理類別中,哪些屬性和方法在子類別中是可存取和可繼承的。譯者註:以下這段程式碼只為說明內建異常處理類別的結構,它並不是一段有實際意義的可用程式碼。
<code><?php <br />class Exception{<br>protected $message <br>protected $file ; // 發生例外狀況的檔案名稱<br>protected $line; // 發生例外的程式碼行號<br>function __construct($message = null, $code = 0); function getCode(); // 回傳例外碼<br>final function getFile(); // 回傳發生例外的檔案名稱<br>final function getLine(); // 傳回發生異常的程式碼行號<br>final function getTrace(unction getTrace(unction getTrace)(unction getTrace)( backtrace() 陣列<br>final function getTraceAsString(); // 已格成化成字串的getTrace() 訊息<br>/* 可重載的方法*/<br>function __toString(); // 可輸出的字串<br>function __toString(); // 可輸出的字串?><br><br><br><br>
如果使用自定義的類來擴展內置異常處理類,並且要重新定義構造函數的話,建議同時調用 parent::__construct()來檢查所有的變量是否已被調用被賦值。當物件要輸出字串的時候,可以重載 __toString() 並自訂輸出的樣式。擴充PHP 內建的異常處理類別
🎎? ends Exception{ // 重新定義建構器使message 變成必須指定的屬性 public function __construct($message, $code = 0) { // :: $code);}
// 自訂字串輸出的樣式
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}n";
}n";
}<code>public function customFunction() {
echo "A Custom function for this type of exceptionn";
}
}
//public> const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __conswstruct($avalue = CUSTOM:
// 拋出自定義例外
throw new MyException('1 is an invalid parameter', 5);
break;
case self::THROW_DEFAULT:
// 拋出預設的例外情況
throw new isception('c is. 6);
break;default:// 沒有異常的情況下,建立一個物件
$this->var = $avalue;
break;
}
}
}
// 範例1
break;
}
}
}
// 範例1
try1
o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // 捕捉例外
echo "Caught my exceptionn", $e; e) { // 忽略
echo "Caught Default Exceptionn", $e;
}
// 執行後續程式碼
var_dump($o);
echo "nn";
/// 範例 {2
= new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // 不能匹配異常的種類,被忽略
echo "Caught my exceptionn",$e;
echo "Caught my exceptionn",$e; } catch (Exception $e) { // 捕獲異常
echo "Caught Default Exceptionn", $e;
}
// 執行後續程式碼
var_dump($o);
echo "nn"; try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // 擷取例外
echo "Default Exception caughtn", $e; $o);
echo "nn";
// 例4
try {
$o = new TestException();
} catch (Exception $e) { // 沒有異常,被忽略
echo , $e;
}
// 執行後續程式碼
var_dump($o);
echo "nn";
?>
12.<code><code>
生成器允許你在 foreach代碼塊中寫代碼來迭代一組數據而不需要在內存中創建一個數組, 那會使你的內存達到上限,或者會佔據可觀的處理時間。相反,你可以寫一個生成器函數,就像一個普通的自定義函數一樣, 和普通函數只返回一次不同的是, 生成器可以根據需要 yield 多次,以便生成需要迭代的值。
<code><?php <br />function xrange($start, $limit, $step =$1) {1) { ($step throw new LogicException('Step must be +ve');<br>}<br> for ($i $h; yield $i;<br> }<br> } else {<br> if ($step >= 0) {<br> throw new LogicException('Step must be - '); i >= $limit; $i += $step) {<br> yield $i;<br> }<br> }<br>}<br>/* Note that both range() and xrange() <br>}<br>/* Note that both range() and xrange() 關鍵詞range(): '; <br>foreach (range(1, 9, 2) as $number) {<br> echo "$number ";<br>}<br>echo "n";<br>echo 'Sorgit odd numbers from xrange(ddn; 1, 9, 2) as $number) {<br> echo "$number ";<br>}<br>?><br><br><br><br><br><br>
Comparing generators with Iterator objects The primary advantage of generators is their simplicity. Much less boilerplate code has to beritator compared to itenment classOter le, the following function and class are equivalent: function getLinesFromFile($fileName) {. return;}
while (false !== $line = fgets($fileHandle)) {
yield $line;
}
fclose($fileHandle);}// versustec...atorI.Ipterator ; protected $line;protected $i;
public function __construct($fileName) {
if (!$this->fileHandle= popen($file) RuntimeException('Couldn't open file "' . $fileName . '"');
}
}
public function rewind() {<code> 長度 fgets($this->fileHandle);
$this->i = 0;
}
public function valid() {
{
return $this->line;
}
public function key() {
return $this->i;
}
public function next() {
= fgets($this-> fileHandle);
$this->i++;
}
}
public function __destruct() {含
}
?>
13.引用
<code><code>
<code><?php <br />$a =& $b; 了同一個變數。 <var><var>$a</var></var> 和 <var><var>$b</var></var> 在這裡是完全相同的,這並不是 <var><var>$a</var></var> <var><var>$a</var> </var> 和 <var><var>$b</var></var> 指向了同一個地方。 <var>?><var></var></var><var><var></var></var><var><var></var></var><br>
如果具有引用的數組被引用,其值不會解除引用。對於數組傳值給函數也是如此。如果對一個未定義的變數進行引用賦值、參考參數傳遞或參考傳回,則會自動建立該變數。 <code>function foo(&$var) { }foo($a); // $a is "
foo($a); // $a 是 "created" ();foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)?
?同樣的語法可以用在函數中,它回傳引用,以及用在
new運算子中(PHP 4.0.4 以及以後版本):
? bar =&變數賦於一個引用,該引用只在函數內部可見。可以透過使用 $GLOBALS
數組來避免這一點。函數內引用全域變數:
($use_globals){
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible only inside the function) $ $var1; // visible also in global context
}
}<code>global_references(false);<span>echo "var2 is set to '$var2'n"; // var2 is set to ''<br>glovar_reences(true); $var2'n"; // var2 is set to 'Example variable'<br>?><br></span>
OBALS[ 'var'];
的簡寫。從而將其它引用賦給
$var
只改變了對本地變數的引用。
如果在 foreach語句中給一個具有引用的變數賦值,被引用的物件也被改變。
$ref = 0;
<code><span><br>$row =& $ref }<br><br><br><br>echo $ref; // 3 - last element of the iterated array<br><br><br><br>?><br><br><br><br><br><br>?></span>
這是透過在函數內建立一個本地變數並且該變數在呼叫範圍內引用了同一個內容來實現的。例如:function foo(&$var){?
會讓
$a
變成6。這是因為在foo
函數中變數$var
指向了和$a
所指向的同一個內容。更多詳細解釋請見引用傳遞。引用做的第三件事是引用返回。引用不是指針。
可以將一個變數透過引用傳遞給函數,這樣函數就可以修改其參數的值。
function foo(&$var){
$++; here
?>
<code><span><br><br><br><br><br><br>注意在函數呼叫時沒有引用符號-只有函數定義中有。光是函數定義就足以使參數透過引用來正確傳遞了</span>
以下內容可以透過引用傳遞:
變量,例如 foo($a);New 語句,例如 foo(new foobar());從函數傳回的引用
結果未定義。
<code><span><br><br><br><br><br><br><br><?php <br />function bar(){ // Note the missing &</span>$a = 5;return $a;
}foo(bar()); / / 自PHP 5.0.5 起導致致命錯誤foo($a = 5) // 表達式,不是變量foo(5) // 導致致命錯誤?>引用回傳用在當想用函數找到引用應該被綁定在哪一個變數上面。
不要
用返回引用來增加效能,引擎足夠聰明來自己進行最佳化。僅在有合理的技術原因時才返回引用!若要回傳引用,請使用此語法:
<code><span><br><br><br><br><br><br><br><?php <br />class foo {<br> <br><?php <br />class foo {) </span> return $this->value; }
}$obj = new foo;$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.> ;echo $myValue; // prints the new value of $obj->value, i.e. 2.?>傳回的對象的屬性將被賦值,而不是拷貝,就和沒有用引用語法一樣。和參數傳遞不同,這裡必須在兩個地方都用 &符號──指出回傳的是一個引用,而不是通常的一個拷貝,同樣也指出 $myValue是作為引用的綁定,而不是通常的賦值。當 unset 一個引用,只是斷開了變數名稱和變數內容之間的綁定。這並不意味著變數內容被銷毀了。
=$com
?>
<code><span> <br><br><br><br></span>
不會unset $b,只$a
。引用定位:global引用:當用 global $var 宣告一個變數時實際上建立了一個到全域變數的引用。也就是說和這樣做是相同的:
$var =& $GLOBALS["var"]; //這意味著,例如,unset
不會unset 全域變數。
?>
<code><span><br><var><var></var></var>$this:在一個物件的方法中,<br></span>$this
永遠是調用它的物件的引用。 14.預定義變量超全局變量 — 超全局變量是在全部作用域中始終可用的內置變量PHP 中的許多預定義變量都是"超全局的",這意味著它們在一個腳本的全部作用域中都可用。在函數或方法中無需執行 global $variable; 就可以存取它們。這些超全域變數分別是:
$GLOBALS;$_SERVER;$_GET;$_POST;$_FILES;$_COOKIE;$_SESSION;$_GET;$_POST;$_FILES;$_COOK;$_SESSION;
預設情況下,所有的超全域變數都是可用的。但是,有一些指令會影響這種可用性。
$GLOBALS
$GLOBALS 域包含了全局作用域中全部的引用數字變數的名字就是數組的鍵。f. $GLOBALS["foo" ] . "n";//$foo in global scope: Example contentecho '$foo in current scope: ' . $foo . "n";//$foo in current scope: local v.able "Example content";test();?>
<code><span><br><br><br><br><br><br>"Superglobal"又稱為自動化的全域變數。這表示其在腳本的所有作用域中都是可用的。不需要在函數或方法中用global $variable; 來存取它。與所有其他超全局變數不同,<br><br>$GLOBALS</span>在PHP中總是可用的。
$_SERVER這個陣列中的項目由
Web 伺服器建立。在 $_SERVER 中,你或許能夠,也許無法找到下面的這些元素。列舉:
'PHP_SELF':目前執行腳本的檔案名,與 document root 有關。例如,在位址為 http://example.com/test.php/foo.bar 的腳本中使用
php/foo.bar。
'SERVER_ADDR':目前運作腳本所在的伺服器的 IP 位址。
'SERVER_NAME':目前運行腳本所在的伺服器的主機名稱。如果腳本執行虛擬主機,則該名稱是由該虛擬主機所設定的值決定。
'SERVER_PROTOCOL':要求頁面時通訊協定的名稱和版本。例如,"HTTP/1.0"。
'REQUEST_METHOD':造訪頁面使用的請求方法;例如,"GET", "HEAD","PO"HEAD"PUT"。
'REQUEST_TIME':要求開始時的時間戳。從 PHP 5.1.0 起可用。
'QUERY_STRING':query string(查詢字串),如果有的話,透過它進行頁面存取。
'HTTP_HOST':目前請求頭中 Host: 項的內容,如果存在的話。
'HTTP_REFERER':引導使用者代理到目前頁面的前一頁的位址(如果存在)。由 user agent 設定決定。並不是所有的用戶代理都會設定該項,有的還提供了修改 HTTP_REFERER 的功能。簡言之,該數值並不可信。
'HTTP_USER_AGENT':當前請求頭中 User-Agent: 項的內容,如果存在的話。該字串表明了訪問該頁面的用戶代理的資訊。
'REMOTE_ADDR':瀏覽目前頁面的使用者的 IP 位址。
'REMOTE_HOST':瀏覽目前頁面的使用者的主機名稱。 DNS 反向解析不依賴使用者的 REMOTE_ADDR。
'SERVER_PORT':Web 伺服器使用的連接埠。預設值為 "80"。如果使用 SSL 安全連接,則這個值為使用者設定的 HTTP 連接埠。
$_GET:透過腳本
$_GET:透過腳本腳本的數字傳遞給目前的腳本。 GET 是透過 urldecode() 傳遞的。
$_POST:透過 HTTP POST 方法傳遞給目前腳本的變數的陣列。
$_FILES:透過 HTTP POST 方式上傳到目前腳本的項目的陣列。
$_REQUEST — HTTP Request 變量,以命令列方式運作時,將數組。
ST」遠端用戶篡改而並不可信。這個陣列的項目及其順序取決於 PHP 的 variables_order 指令的配置。
$_SESSION:目前腳本可用 SESSION 變數的數組。
move_uploaded_file() - 將上傳的檔案移至新位置;import_request_variables() - 將上傳的檔案移到新位置;重複使用現有會話;getenv() - 取得環境變數的值;
$_ENV:透過環境方式傳遞給目前腳本的變數的陣列。這些變數被從 PHP 解析器的運行環境匯入到 PHP 的全域命名空間。很多是由支援 PHP 運行的 Shell 提供的,不同的系統很可能運行著不同種類的 Shell,所以不可能有一個確定的清單。請查看你的 Shell 文件來取得定義的環境變數清單。其他環境變數包含了 CGI 變量,而不管 PHP 是以伺服器模組還是 CGI 處理器的方式運作。
$_COOKIE:透過 HTTP Cookies 方式傳遞給目前腳本的變數的陣列。 setcookie() - Send a cookie
$php_errormsg — 前一個錯誤訊息;$php_errormsg 變數包含由 PHP 產生的最新錯誤資訊。這個變數只在錯誤發生的作用域內可用,並且要求 track_errors 配置項目是開啟的(預設是關閉的)。如果使用者定義了錯誤處理句柄(set_error_handler())並且回傳 <code>FALSE 的時候,$php_errormsg 就會被設定。
<code><span><?php <br />@strpos();<br>echo) for$m/dm. <br></span>
$HTTP_RAW_POST_DATA — 原生POST資料。
$HTTP_RAW_POST_DATA 包含 POST 提交的原始資料。參見 always_populate_raw_post_data一般而言,使用 php://input代替 $HTTP_RAW_POST_DATA。
$http_response_header — HTTP 反應頭:
$_response_header)。使用HTTP 包裝器時,$http_response_header 將會被 HTTP 回應頭資訊填入。 $http_response_header 將會被建立在局部作用域中。
function get_contents() {
<code><?php <span>function get_contents() {<br><br><?php <br />function get_contents() {<br>); $http_response_header);<br>}<br>get_contents( );<br>var_dump($http_response_header);?>
參數的數目。腳本的檔案名稱總是作為參數傳遞給目前腳本,因此
$argc 的最小值為 1。這個變數只在 register_argc_argv 開啟時可用。
getopt() -
Exception是所有異常的基類。類別摘要:
Exception {
Exception {Exception {
Exception { ing$message
;protectedint$code
;protectedstring$file
;/* 方法*/
<code> public__construct ([ string$message<code> = " " [, int$code<code> = 0 [, Exception$previous<code> = NULL ]]] )
) finalpublicExceptiongetPrevious ( void )
finalpublicintgetCode ( void )
finalpublicstringgetFile ( void )
finalpublicintgetLine ( void finalpublicstringgetTraceAsString ( void )
publicstring__toString ( void¢ }
屬性:message:異常訊息內容;code:異常代碼;file:拋出異常的檔案名稱;line:拋出例外在該檔案中的行號
Exception::__construct — 異常建構子
參數:message:拋出的異常訊息內容。 code:異常代碼。 previous:異常鏈中的前一個異常。
Exception::getMessage — 取得異常訊息內容
參數:此函數沒有參數。
Exception::getPrevious — 回傳異常鏈中的前一個異常
参数:Exception::getPrevious — 返回异常链中的前一个异常。追踪异常,并循环打印。
<code><span><?php<br />class MyCustomException extends Exception {}<br />function doStuff() {<br /> try {<br /> throw new InvalidArgumentException("You are doing it wrong!", 112);<br /> } catch(Exception $e) {<br /> throw new MyCustomException("Something happend", 911, $e);<br /> }<br />}<br />try {<br /> doStuff();<br /> } catch(Exception $e) {<br /> do {<br /> printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e- >getCode(), get_class($e));<br> } while($e = $e->getPrevious());<br> }<br>?></span>
以上例程的输出类似于:
<span>/home/bjori/ex.php:8 Something happend (911) [MyCustomException] /home/bjori/ex.php:6 You are doing it wrong! (112) [InvalidArgumentException] </span>
Exception::getCode — 获取异常代码
参数:此函数没有参数。Exception::getFile — 获取发生异常的程序文件名称
参数:此函数没有参数。Exception::getLine — 获取发生异常的代码在文件中的行号
参数:此函数没有参数。Exception::getTrace — 获取异常追踪信息
参数:此函数没有参数。Exception::getTraceAsString — 获取字符串类型的异常追踪信息
参数:此函数没有参数。Exception::__toString — 将异常对象转换为字符串
参数:此函数没有参数。Exception::__clone — 异常克隆
参数:此函数没有参数。没有返回值,异常被不允许克隆。ErrorException::__construct — 异常构造函数
参数:message:抛出的异常消息内容。code:异常代码。severity:异常的严重级别。filename:抛出异常所在的文件名。lineno:抛出异常所在的行号。previous:异常链中的前一个异常。ErrorException::getSeverity — 获取异常的严重程度
参数:此函数没有参数。<code><span><?php<br />try {<br /> throw new ErrorException("Exception message", 0, 75);<br />} catch(ErrorException $e) {<br /> echo "This exception severity is: " . $e->getSeverity();<br>}<br>?></span>
16.预定义接口
Traversable(遍历)接口:
检测一个类是否可以使用 foreach 进行遍历的接口。无法被单独实现的基本抽象接口。相反它必须由 IteratorAggregate 或 Iterator 接口实现。实现此接口的内建类可以使用 foreach 进行遍历而无需实现 IteratorAggregate 或 Iterator 接口。这是一个无法在 PHP 脚本中实现的内部引擎接口。IteratorAggregate 或 Iterator 接口可以用来代替它。
Traversable { } 这个接口没有任何方法,它的作用仅仅是作为所有可遍历类的基本接口。
Iterator(迭代器)接口:
可在内部迭代自己的外部迭代器或类的接口。
IteratorextendsTraversable {
/* 方法 */
abstractpublicmixedcurrent ( void )
abstractpublicscalarkey ( void )
abstractpublicvoidnext ( void )
abstractpublicvoidrewind ( void )
abstractpublicbooleanvalid ( void )
}Iterator::current — 返回当前元素:没有参数,可返回任何类型。
Iterator::key — 返回当前元素的键:没有参数,成功返回标量,失败则返回null。
Iterator::next — 向前移动到下一个元素:没有参数,任何返回都将被忽略。此方法在 foreach 循环之后被调用。
Iterator::rewind — 返回到迭代器的第一个元素:当开始一个 foreach 循环时,这是第一个被调用的方法。它将不会在 foreach 循环之后被调用。没有参数,任何返回都将被忽略。
Iterator::valid — 检查当前位置是否有效:此方法在 Iterator::rewind() 和 Iterator::next() 方法之后被调用以此用来检查当前位置是否有效。没有参数,返回将被转换为布尔型。成功时返回 <code>TRUE, 或者在失败时返回 <code>FALSE。
IteratorAggregate::getIterator — 获取一个外部迭代器:没有参数,实现了 Iterator 或 Traversable 接口的类的一个实例。
ArrayAccess(数组式访问)接口:
提供像访问数组一样访问对象的能力的接口。
ArrayAccess {
/* 方法 */
abstractpublicbooleanoffsetExists ( mixed<code>$offset )
abstractpublicmixedoffsetGet ( mixed<code>$offset )
abstractpublicvoidoffsetSet ( mixed<code>$offset , mixed<code>$value )
abstractpublicvoidoffsetUnset ( mixed<code>$offset )
}ArrayAccess::offsetExists — 检查一个偏移位置是否存在:对一个实现了 ArrayAccess 接口的对象使用 isset() 或 empty() 时,此方法将执行。当使用 empty() 并且仅当 ArrayAccess::offsetExists() 返回 <code>TRUE 时,ArrayAccess::offsetGet() 将被调用以检查是为否空。参数:offset 需要检查的偏移位置。成功时返回 <code>TRUE, 或者在失败时返回 <code>FALSE。如果一个非布尔型返回值被返回,将被转换为布尔型。
<code><span><?php<br />class obj implements arrayaccess {<br /> public function offsetSet($offset, $value) {<br /> var_dump(__METHOD__);<br />}<br />public function offsetExists($var) {<br /> var_dump(__METHOD__);<br /> if ($var == "foobar") {<br /> return true;<br /> }<br /> return false;<br />}<br />public function offsetUnset($var) {<br /> var_dump(__METHOD__);<br /> }<br />public function offsetGet($var) {<br /> var_dump(__METHOD__);<br /> return "value";<br /> }<br />}<br />$obj = new obj;<br />echo "Runs obj::offsetExists()\n";<br />var_dump(isset($obj["foobar"]));<br />echo "\nRuns obj::offsetExists() and obj::offsetGet()\n";<br />var_dump(empty($obj["foobar"]));<br />echo "\nRuns obj::offsetExists(), *not* obj:offsetGet() as there is nothing to get\n";<br />var_dump(empty($obj["foobaz"]));<br />?></span>
以上例程的输出类似于:
<span>Runs obj::offsetExists() string(17) "obj::offsetExists" bool(true) Runs obj::offsetExists() and obj::offsetGet() string(17) "obj::offsetExists" string(14) "obj::offsetGet" bool(false) Runs obj::offsetExists(), *not* obj:offsetGet() as there is nothing to get string(17) "obj::offsetExists" bool(true) </span>
ArrayAccess::offsetGet — 获取一个偏移位置的值:当检查一个偏移位置是否为 empty() 时,此方法被执行。
參數:offset 需要取得的偏移位置。傳回值:可傳回任何類型。ArrayAccess::offsetSet — 設定一個偏移位置的值:參數:offset 待設定的偏移位置。 value 需要設定的值。沒有回傳值。
如果另一個值不可用,那麼 <code>offset 參數將被設定為 <code>NULL。
ArrayAccess::offsetUnset — 復位一個偏移位置的值:當使用 (unset) 進行型別轉換時,此方法不會被呼叫。
<code>參數:offset 待復位的偏移位置。沒有回傳值。序列化介面:
Serializable::serialize — 物件的字串表示。這個方法擔當著對象析構器的角色。在此方法之後,__destruct() 方法將不會被呼叫。此函數沒有參數,傳回值:傳回物件的字串表示或 <code>NULL 。
Serializable::unserialize — 構造物件。這個方法擔當著物件構造器的角色。在此方法之後,__construct() 將不會被呼叫。參數:serialized 物件的字串表示。
Closure::__construct — 用於禁止實例化的建構子。這個方法只用來禁止實例化一個 Closure 類別的物件。這個類別的物件的創建方法寫在 匿名函數 頁。此函數沒有參數,沒有傳回值。
Closure::bind — 複製一個閉包,並綁定指定的$this物件和類別作用域。這個方法是 Closure::bindTo() 的靜態版本。
參數:closure 需要綁定的匿名函數。 newthis 需要綁定到匿名函數的對象,或 <code>NULL 建立未綁定的閉包。 newscope 想要綁定給閉包的類別作用域,或 'static' 表示不改變。如果傳入一個對象,則使用這個對象的型別名稱。 類別作用域用來決定在閉包中 $this 物件的 私有、保護方法 的可見性。回傳一個新的 Closure 物件或失敗時回傳 <code>FALSE<code><span><php></php>}<br>$ cl1 = static function() {<br> return A::$sfoo;<br>};<br>$cl2 = function() {<br> return $this->ifoo;<br>};<br> return $this->ifoo;<br>};<br> return $this->ifoo;<br>}; , 'A');<br>$bcl2 = Closure::bind($cl2, new A(), 'A');<br>echo $bcl1(), "n"; //1<br>echo "2( n"; //2<br>?></span>
Closure::bind建立並傳回一個 匿名函數, 它與目前物件的函數體相同、綁定了相同變量,但可以綁定不同的對象,也可以綁定新的類別作用域。 "綁定的物件"決定了函數體內的 $this的取值,"類別作用域"代表一個型別、決定在這個匿名函式中能夠呼叫哪些 私有 和 保護 的方法。 也就是說,此時 $this 可以呼叫的方法,與 <code>newscope 類別的成員函數是相同的。靜態閉包不能有綁定的物件( <code>newthis 參數的值應該設為 <code>NULL)不過仍可用 bubdTo 方法來改變它們的類別作用域。如果你只是想要複製一個匿名函數,可以用 cloning 代替。
參數:newthis 綁定給匿名函數的一個對象,或是 <code>NULL 來取消綁定。 newscope 關聯到匿名函數的類別作用域,或 'static' 保持目前狀態。如果是一個對象,則使用這個對象的型別為心得類別作用域。 這會決定綁定的物件的 保護、私有成員 方法的可見性。回傳值:傳回新建立的 Closure 物件或失敗時傳回 <code>FALSE<code> $this->val = $ val;<span> }<br> function getClosure() {<br> //returns closure bound to this object and scope<br> $ob1 = new A(1); <br>$ob2 = new A(2);<br>$cl = $ob1->getClosure();<br>echo $cl(), "n"; //1<br>$cl= $cl- ($$cl- <br>echo $cl(), "n"; //2<br>?><br><br><br><br><br><br><br></span>
17.字選和參數套接字上的封裝協議,像 tcp, http 和ftp
.
to the internet using the '192.168 .0.100' IP$opts = array( 'socket' => array( 'bindto' => '192.168.0.100:0',,inter7, connŜing 7/com); .168. 0.100' IP and port '7000'$opts = array( 'socket' => array( 'bindto' => '192.168.0.100:7000 internet using port '7000'
$opts = array( 'socket' => array( 'bindto' => '0:7000', ),);// create the context...
$context = stream_context_create ($opts);
// ...and use it to fetch the data
echo file_get_contents('http://www.example.com', false, $context);
?>
<code>
HTTP context 選項 — HTTP context 的選項清單。提供給
http://
和
https://
傳輸協定的 context 選項。 transports.可選項:
SSL 上下文選項 — SSL 上下文選項清單。 ssl://
和
tls://
傳輸協定上下文選項清單。可選項:好多。
CURL context options — CURL 上下文選項清單。 CURL 上下文選項在 CURL 擴充被編譯(透過 --with-curlwrappers configure選項)時可用。可選:
method
string
GET
,
<code><span><?php <br />$postdata = http_build_query(<br> ' => 'doh'<br> )<br>);<br>$opts = array('http' =><br> array(<br> 'method' => 'POST',<br> '為> $postdata <br> )<br>);<br>$context = stream_context_create($opts);<br>$result = file_get_contents('http://example.com/submit.php', = file_get_contents('http://example.com/submit.php', = file_get_contents('http://example.com/submit.php', <br> <br><br><br></span>
Phar 上下文(context)選項 — Phar 上下文(context)選項清單。 phar:// 封裝(wrapper)的上下文(context)選項。可選:compressint Phar compression constants 中的一個。
metadata
mixed Phar 元資料(metadata)。查看 Phar::setMetadata()。
<code><code>
Context 參數 — Context 參數清單。這些參數(parameters)可以設定為由函數 stream_context_set_params() 傳回的 context。參數:
notification
callable 當一個流(stream)上發生事件時,callable 將被呼叫。
18.支援的協定與封裝協定<code>
file:// — 存取本機檔案系統。 檔案系統 是 PHP 使用的預設封裝協議,展現了本地檔案系統。 當指定了一個相對路徑(不以/、、\或 Windows 磁碟機代為開頭的路徑)提供的路徑將基於目前的工作目錄。 在很多情況下是腳本所在的目錄,除非被修改了。 使用 CLI 的時候,目錄預設是腳本被呼叫時所在的目錄。在某些函數裡,例如 fopen() 和 file_get_contents(), include_path 會可選地搜尋,也作為相對的路徑。
封裝約定
No | 允許讀取 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
允許寫入 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
允許同時讀取和寫入 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
支援stat() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
支援rename() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Yes | 支持mkdir() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Yes | rmdir() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
rmdir() |
http:// -- https:// — 存取 HTTP(s) 網址。允許透過 HTTP 1.0 的 GET方法,以唯讀存取檔案或資源。 HTTP 請求會附帶一個 Host: 頭,用於相容於網域為基礎的虛擬主機。 如果在你的 php.ini 檔案或位元組流上下文(context)配置了 user_agent 字串,它也會被包含在請求之中。資料流允許讀取資源的 body,而 headers 則儲存在了 $http_response_header 變數裡。 如果需要知道文件資源來自哪個 URL(經過所有重定向的處理後), 需要處理資料流傳回的系列回應標頭(response headers)。
封裝約 PHP 5受allow_url_fopen 影響 Yes Yes允許讀取
|