首頁 > 後端開發 > php教程 > PHP中文手冊2

PHP中文手冊2

WBOY
發布: 2016-07-30 13:31:54
原創
1061 人瀏覽過

<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 isc​​eption('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 開啟時可用。

    $argv — 傳遞給腳本的參數陣列:包含執行於命令列下時傳遞給目前腳本的參數的陣列。第一個參數總是目前腳本的檔名,因此 
  • $argv[0]
  •  就是腳本檔名。這個變數只在 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.可選項:

<code>methodstring 遠端伺服器支援的 <code>GET,<code>POST 或其它 HTTP 方法。預設值是 <code>GET。
<code>headerstring 請求期間發送的額外 header 。在此選項的數值將會覆寫其他數值 (諸如 User-agent:, Host: 和 Authentication:)。
<code>user_agentstring 要傳送的 header User-Agent: 的值。如果在上方的 header context 選項中沒有指定 user-agent,此值將會使用。預設使用 php.ini中設定的 user_agent。
<code>contentstring 在 header 後面要傳送的額外資料。通常使用POST或PUT請求。
<code>proxystring URI 指定的代理伺服器的位址。 (e.g. tcp://proxy.example.com:5100).
<code>request_fulluriboolean 當設定為 <code>TRUE (i.e. GET http://www.example.com/path/to/file.html HTTP/1.0)。 雖然這是一個非標準的請求格式,但某些代理伺服器需要它。預設值是 <code>FALSE.
<code>follow_locationinteger 跟隨 Location header 的重定向。設定為 0 以停用。預設值是 1
<code>max_redirectsinteger 跟隨重定向的最大次數。值為 1 或更少則意味著不跟隨重定向。預設值是 20
<code>protocol_versionfloat HTTP 協定版本。預設值是 1.0。 PHP 5.3.0 先前的版本沒有實作分割傳輸解碼。 如果此值設定為 1.1 ,與 1.1 的相容將是你的責任。
<code>timeoutfloat 讀取逾時時間,單位為秒(s),以 float 指定(e.g. 10.5)。預設使用 php.ini 中設定的 default_socket_timeout。
<code>ignore_errorsboolean 即使是故障狀態碼依然取得內容。預設值為 <code>FALSE.

SSL 上下文選項 — SSL 上下文選項清單。 ssl://

 和 

tls://

傳輸協定上下文選項清單。可選項:好多。

CURL context options — CURL 上下文選項清單。 CURL 上下文選項在 CURL 擴充被編譯(透過 --with-curlwrappers configure選項)時可用。可選:

method

string 

GET

POST
,或其他遠端伺服器支援的 HTTP 方法。預設為 GET<code>.<code><code>header<code>string 額外的請求標頭。這個值會覆寫透過其他選項所設定的值(如: User-agent:
Host:
, ,Authentication:<code>)。 user_agentstring 設定請求時 User-Agent 標頭的值。預設為 php.ini 中的 user_agent設定。
<code>contentstring 在頭部之後發送的額外資料。這個選項在 GET 和 
HEAD
請求中並沒有使用。 <code><code>proxy<code>string URI,用於指定代理伺服器的位址(例如 tcp://proxy.example.com:5100)。
<code>max_redirectsinteger 最大重定向次數。 1 或更小則代表不會跟隨重定向。預設為 
20
.<code>curl_verify_ssl_hostboolean校驗伺服器。預設為 FALSE。 這個選項在 HTTP 和 FTP 協定中均可使用。
<code>curl_verify_ssl_peer<code>boolean 要求對使用的SSL憑證進行校驗。預設為 FALSE。 這個選項在 HTTP 和 FTP 協定中均可使用。取得一個頁面,並以POST發送資料:
<code><code>

<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)選項。可選:compress

int 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 會可選地搜尋,也作為相對的路徑。

封裝約定

受allow_url_fopen 影響允許讀取YesYes YesYes
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)。

YesYes打開文件後你既可以讀也可以寫,但是不能同時進行。 當遠端檔案已經存在於 ftp 伺服器上,如果嘗試開啟並寫入檔案的時候, 未指定上下文(context)選項  選項來開啟、寫入。 另外可使用 FTP 擴充來代替。如果你設定了 php.ini 中的 from 指令, 這個數值會作為匿名(anonymous)ftp 的密碼。
封裝約定
受allow_url_fopen 限制
允許讀取
允許寫入
允許寫入
允許同時讀取和寫入 N/A
支援stat() No
支援rename() No
支援mkdir() No
ftp:// -- ftps: // — 存取FTP(s) URLs。允許透過 FTP 讀取存在的文件,以及建立新文件。 如果伺服器不支援被動(passive)模式的 FTP,連線會失敗。
overwrite,連線會失敗。 如果要透過 FTP 覆寫存在的文件, 指定上下文(context)的 overwrite

封裝約

PHP 5

受allow_url_fopen 影響 Yes

Yes

允許讀取

Yes (僅支援新文件)overwrite允許同時讀取和寫入 NoNo支援stat()No自5.0.0 起:僅僅(files), files(s), 0.0. )。 自 PHP 5.1.0 起: filemtime()。 支援unlink()No
Yes
Yes (新檔案/啟用  後已存在的檔案) 允許新增
允許新增
<code>Yes
Yes Yes 支援mkdir()
No Yes 支持rmdir()
支持rmdir()

php:// — 存取各個輸入/輸出流(I/O streams)。 PHP 提供了一些雜項輸入/輸出(IO)流,允許存取PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 記憶體中、磁碟備份的臨時檔案流以及可以操作其他讀取寫入檔案資源的過濾器。

php://stdinphp  資料流引用了複製的文件描述符,所以如果你打開 php://stdin 並在之後關了它, 僅是關閉了複製品,真正被引用的 STDIN 並不受影響。 注意 PHP 在這方面的行為有很多 BUG 直到 PHP 5.2.1。 建議你簡單使用常數 STDIN<code>、 STDOUT<code> 和 STDERR<code> 來取代手動開啟這些封裝器。 <code>

php://stdin

 是只讀的, php://stdout 和 php://stderr 是只寫的。

php://input

 是可以存取請求的原始資料的唯讀流。 POST 請求的情況下,最好使用 php://input 來取代 $HTTP_RAW_POST_DATA,因為它不依賴特定的 php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 預設沒有填充, 比啟動 always_populate_raw_post_data潛在需要更少的記憶體。 enctype="multipart/form-data" 的時候 php://input 是無效的。

php://output

 是一個只寫的資料流,允許你以寫入方式

php://fd

 允許直接存取指定的檔案描述符。 例如 php://fd/3 引用了文件描述符 3。

php://memory

 和 php://temp 兩者的唯一差異是 php://memory 總是把資料儲存在記憶體中, 而 php://temp 會在記憶體量達到預先定義的限制後(預設是2MB)存入臨時檔案中。 暫存檔案位置的決定和 sys_get_temp_dir() 的方式一致。 php://temp 的記憶體限制可透過添加 /maxmemory:NN來控制,NN 是以位元組為單位、保留在記憶體中的最大資料量,超過則使用臨時檔案。

php://filter

 是一種元封裝器,設計用於流開啟時的篩選過濾應用。 這對於一體式(all-in-one)的檔案函數非常有用,類似 readfile()、 file() 和 file_get_contents(), 在資料流內容讀取之前沒有機會應用其他過濾器。

php://filter 目標使用以下的參數作為它路徑的一部分。 複合過濾鏈能夠在一個路徑上指定。

php://filter,參考被篩選的封裝器。屬性)No memory 和 php ://tempphp:// /temp。 只 php: /temp支援unlink()只支援stream_select()php://st; 。 zlib:// -- bzip2:// -- zip:// — 壓縮流。 zlib:compress.zlib://g 和 的功能類似gzopen(),但是其資料流還能被fread() 和其他檔案系統函數使用。 自 PHP 4.3.0 後這個不建議被使用,因為會和其他帶有":"字符的檔名混淆; 請使用 和 gzopen()、bzopen()是相等的。並且可以在不支援 fopencookie 的系統中使用。
封裝協議摘要(針對 php://filter,參考被篩選的封裝器。屬性)
先於allow_url_fopen
先於allow_url_include
允許讀取只 php://stdin、 php://input、 
允許寫入只 php://stdout、 php /memory 和php://temp
允許追加 僅 php://stdout、 php memory 和php://temp(等於寫入)允許同時讀寫
支援 stat()僅 php://memory 和 php://temp
No 支持rename( ()No
支援rmdir() No
php://fd 和 php://temp
 PHP 4.0.4 - PHP 4.2.3(僅支援帶fopencookie 的系統)
zlib:compress.zlib:// 作為替代。
compress.zlib://、 compress.bzip2:// ZIP 擴充 註冊了 zip: 封裝協定。可選購compress.zlib://file.gz

compress.bzip2://file.bz21. .txt

data:// — 資料(RFC 2397)。用法:data://text/plain;base64,

封裝

受限於allow_url_fopen

  • No
  • 受限於allow_url_include🜎
  • 允許寫入
No

允許追加

No

允許同時讀寫

列印data:// 的內容:// 印刷"I love PHP "echo file_get_contents('data://text/plain;base64,SSBsb3Zl
No
支持unlink() No
支援rename() No
支援rmdir() No
列印data:// 的內容:
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板