ユーザーは、PHP の組み込み例外処理クラスをカスタム例外処理クラスで拡張できます。次のコードは、組み込み例外処理クラスのどのプロパティとメソッドがサブクラスでアクセス可能で継承可能であるかを示しています。翻訳者注: 次のコードは、組み込みの例外処理クラスの構造を説明するためだけのものであり、実際的な意味を持つ使用可能なコードではありません。
<code><?php<br />class Exception{<br />protected $message = 'Unknown exception'; // 异常信息<br />protected $code = 0; // 用户自定义异常代码<br />protected $file; // 发生异常的文件名<br />protected $line; // 发生异常的代码行号<br />function __construct($message = null, $code = 0);<br />final function getMessage(); // 返回异常信息<br />final function getCode(); // 返回异常代码<br />final function getFile(); // 返回发生异常的文件名<br />final function getLine(); // 返回发生异常的代码行号<br />final function getTrace(); // backtrace() 数组<br />final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息<br />/* 可重载的方法 */<br />function __toString(); // 可输出的字符串<br />}<br />?>カスタム クラスを使用して組み込み例外処理クラスを拡張し、コンストラクターを再定義する場合は、同時にparent::__construct()を呼び出して、すべての変数に値が割り当てられているかどうかを確認することをお勧めします。オブジェクトが文字列を出力したい場合は、__toString() をオーバーロードして出力スタイルをカスタマイズできます。
PHPの組み込み例外処理クラスを拡張します
<code><?php<br />// 自定义一个异常处理类<br />class MyException extends Exception{ // 重定义构造器使 message 变为必须被指定的属性<br /> public function __construct($message, $code = 0) {<br /> // 自定义的代码 // 确保所有变量都被正确赋值<br /> parent::__construct($message, $code);<br />}<br />// 自定义字符串输出的样式<br />public function __toString() {<br /> return __CLASS__ . ": [{$this->code}]: {$this->message}n";<br>}<br>public function customFunction() {<br> echo "A Custom function for this type of exceptionn";<br> }<br>}<br><span>//</span>创建一个用于测试异常处理机制的类<br>class TestException{<br>public $var;<br>const THROW_NONE = 0;<br>const THROW_CUSTOM = 1;<br>const THROW_DEFAULT = 2;<br>function __construct($avalue = self::THROW_NONE) {<br>switch ($avalue) {<br>case self::THROW_CUSTOM:<br>// 抛出自定义异常<br>throw new MyException('1 is an invalid parameter', 5);<br>break;<br>case self::THROW_DEFAULT:<br>// 抛出默认的异常<br>throw new Exception('2 isnt allowed as a parameter', 6);<br>break;<br>default:<br>// 没有异常的情况下,创建一个对象<br>$this->var = $avalue;<br>break;<br>}<br>}<br>}<br>// 例子 1<br>try {<br>$o = new TestException(TestException::THROW_CUSTOM);<br>} catch (MyException $e) { // 捕获异常<br>echo "Caught my exceptionn", $e;<br>$e->customFunction();<br>} catch (Exception $e) { // 被忽略<br>echo "Caught Default Exceptionn", $e;<br>}<br>// 执行后续代码<br>var_dump($o);<br>echo "nn";<br>// 例子 2<br>try {<br>$o = new TestException(TestException::THROW_DEFAULT);<br>} catch (MyException $e) { // 不能匹配异常的种类,被忽略<br>echo "Caught my exceptionn", $e;<br>$e->customFunction();<br>} catch (Exception $e) { // 捕获异常<br>echo "Caught Default Exceptionn", $e;<br>}<br>// 执行后续代码<br>var_dump($o);<br>echo "nn";<br>// 例子 3<br>try {<br>$o = new TestException(TestException::THROW_CUSTOM);<br>} catch (Exception $e) { // 捕获异常<br>echo "Default Exception caughtn", $e;<br>}<br>// 执行后续代码<br>var_dump($o);<br>echo "nn";<br>// 例子 4<br>try {<br>$o = new TestException();<br>} catch (Exception $e) { // 没有异常,被忽略<br>echo "Default Exception caughtn", $e;<br>}<br>// 执行后续代码<br>var_dump($o);<br>echo "nn";<br>?> 12.ジェネレーター <code><code>ジェネレーターを使用すると、メモリ内に配列を作成せずに foreach ブロックにコードを記述して、一連のデータを反復処理できます。これにより、メモリの制限に達したり、かなりの処理時間がかかってしまいます。代わりに、通常のカスタム関数と同じようにジェネレーター関数を作成できます。通常の関数が 1 回だけ返すのではなく、ジェネレーターは反復する必要がある値を生成するために必要なだけ何度でも生成できます。
<code><?php<br />function xrange($start, $limit, $step = 1) {<br /> if ($start < $limit) {<br /> if ($step <= 0) {<br /> throw new LogicException('Step must be +ve');<br />}<br /> for ($i = $start; $i <= $limit; $i += $step) {<br /> yield $i;<br /> }<br /> } else {<br /> if ($step >= 0) {<br> throw new LogicException('Step must be -ve');<br> }<br> for ($i = $start; $i >= $limit; $i += $step) {<br> yield $i;<br> }<br> }<br>}<br>/* Note that both range() and xrange() result in the same<br>* output below. */<br>echo 'Single digit odd numbers from range(): ';<br>foreach (range(1, 9, 2) as $number) {<br> echo "$number ";<br>}<br>echo "n";<br>echo 'Single digit odd numbers from xrange(): ';<br>foreach (xrange(1, 9, 2) as $number) {<br> echo "$number ";<br>}<br>?> リーリージェネレーターの主な利点はそのシンプルさです。 Iterator クラスを実装する場合に比べて、記述する必要のある定型コードがはるかに少なくなり、コードは一般にはるかに読みやすくなります。たとえば、次の関数とクラスは同等です:
<code><?php<br />function getLinesFromFile($fileName) {<br /> if (!$fileHandle = fopen($fileName, 'r')) {<br /> return;<br />}<br />while (false !== $line = fgets($fileHandle)) {<br /> yield $line;<br />}<br />fclose($fileHandle);<br />}<br />// versus...<br />class LineIterator implements Iterator {<br /> protected $fileHandle;<br /> protected $line;<br /> protected $i;<br /> public function __construct($fileName) {<br /> if (!$this->fileHandle = fopen($fileName, 'r')) {<br> throw new RuntimeException('Couldn't open file "' . $fileName . '"');<br> }<br> }<br> public function rewind() {<br> fseek($this->fileHandle, 0);<br> $this->line = fgets($this->fileHandle);<br> $this->i = 0;<br> }<br> public function valid() {<br> return false !== $this->line;<br> }<br> public function current() {<br> return $this->line;<br> }<br> public function key() {<br> return $this->i;<br> }<br> public function next() {<br> if (false !== $this->line) {<br> $this->line = fgets($this->fileHandle);<br> $this->i++;<br> }<br> }<br> public function __destruct() {<br> fclose($this->fileHandle);<br> }<br> }<br>?> 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>$b</var></var> 在这里是完全相同的,这并不是 <var><var>$a</var></var> 指向了 <var><var>$b</var></var> 或者· //相反,而是 <var><var>$a</var></var> 和 <var><var>$b</var></var> 指向了同一个地方。<br />?> <code>参照を持つ配列がコピーされた場合、その値は逆参照されません。配列値を関数に渡す場合も同様です。未定義の変数が参照によって割り当てられた場合、参照によって渡された場合、または参照によって返された場合、その変数は自動的に作成されます。
関数 foo(&$var) { }
foo($a); // $a が「作成」され、null に割り当てられます
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)) // bool(true)
;$c = 新しい StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')) // bool(true)
;?>
同じ構文は、参照を返す関数と new 演算子 (PHP 4.0.4 以降) で使用できます。
<code>$bar =& new fooclass();
$foo =& find_var($bar);
?>
関数内で global として宣言された変数に参照が割り当てられている場合、その参照は関数内でのみ表示されます。これは $GLOBALS 配列を使用することで回避できます。関数内でグローバル変数を参照: <code><span><?php<br />$var1 = "Example variable";<br />$var2 = "";<br />function global_references($use_globals){<br /> global $var1, $var2;<br /> if (!$use_globals) {<br /> $var2 =& $var1; // visible only inside the function<br /> } else {<br /> $GLOBALS["var2"] =& $var1; // visible also in global context<br /> }<br />}<br />global_references(false);<br />echo "var2 is set to '$var2'n"; // var2 is set to ''<br />global_references(true);<br />echo "var2 is set to '$var2'n"; // var2 is set to 'Example variable'<br />?></span> global $var; は $var =& $GLOBALS['var']; の省略形として扱います。したがって、他の参照を $var に代入しても、ローカル変数の参照が変更されるだけです。
foreach ステートメントで参照を含む変数に値を代入すると、参照されるオブジェクトも変更されます。
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {// 何かをする}
echo $ref; // 3 - 反復配列の最後の要素
?>
参照が行う 2 番目のことは、参照によって変数を渡すことです。これは、関数内にローカル変数を作成し、その変数が呼び出しスコープ内の同じコンテンツを参照することによって実現されます。例: <code>
function foo(&$var){関数がその引数の値を変更できるように、参照によって変数を関数に渡すことができます。
<code><code>function foo(&$var){以下は参照によって渡すことができます:
変数 (例: foo($a); 新しいステートメント (例: foo(new foobar())); 関数から返される参照
他の式は参照渡しできず、結果は未定義です。
<code><span><?php<br />function bar(){ // Note the missing &<br />$a = 5;<br />return $a;<br />}<br />foo(bar()); // 自 PHP 5.0.5 起导致致命错误<br />foo($a = 5) // 表达式,不是变量<br />foo(5) // 导致致命错误<br />?></span> <code><p><?php<br />function bar(){ // &<br />$a = 5;<br />return $a;<br />}<br />foo が欠落していることに注意してください(bar()); // PHP 5.0.5 以降では致命的なエラーが発生します<br />foo($a = 5) // 変数ではなく式<br />foo(5) // 致命的なエラーが発生します<br /> ?><span></span></p> Reference return は、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用します。パフォーマンスを向上させるためにリターン参照を使用しないでください。エンジンはそれ自体を最適化するのに十分な賢さを備えています。正当な技術的理由がある場合にのみ参照を返してください。参照を返すには、次の構文を使用します: 🎜<code><span><?php<br />class foo {<br /> public $value = 42;<br /> public function &getValue() {<br /> return $this->value;<br> }<br>}<br>$obj = new foo;<br>$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.<br>$obj->value = 2;<br>echo $myValue; // prints the new value of $obj->value, i.e. 2.<br>?></span> この例では、getValue関数によって返されるオブジェクトのプロパティには、参照構文がない場合と同様に、コピーされるのではなく値が割り当てられます。パラメーターの受け渡しとは異なり、ここでは両方の場所でアンパサンドを使用する必要があります。これは、通常のコピーではなく参照が返されることを示し、また $myValue が通常の代入ではなく参照としてバインドされていることを示します。参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。 <code><code>$a = 1;$this: オブジェクトのメソッドでは、$this は常に、それを呼び出すオブジェクトへの参照です。
14. 事前定義された変数
スーパーグローバル変数 - スーパーグローバル変数は、すべてのスコープで常に使用できる組み込み変数です。PHP の多くの事前定義変数は「スーパーグローバル」です。つまり、スクリプトのすべてのスコープで使用できます。global $variable; を実行せずに、関数またはメソッド内でアクセスできます。これらのスーパーグローバル変数は次のとおりです:
$GLOBALS;$_SERVER;$_GET;$_POST;$_FILES;$_COOKIE;$_SESSION;$_REQUEST;$_ENV
デフォルトでは、すべてのスーパーグローバル変数が使用可能です。ただし、この可用性に影響を与えるディレクティブがいくつかあります。 <code><span><?php<br />function test() {<br />$foo = "local variable";<br />echo '$foo in global scope: ' . $GLOBALS["foo"] . "n";//$foo in global scope: Example content<br />echo '$foo in current scope: ' . $foo . "n";//$foo in current scope: local variable<br />}<br />$foo = "Example content";<br />test();<br />?></span>$GLOBALS — グローバル スコープで使用可能なすべての変数を参照します。すべての変数を含むグローバル結合配列。変数の名前は配列のキーです。 <code><var><?php<br />function test() {<br />$foo = "ローカル変数";<br />エコー '$foo をグローバル スコープで: ' . $GLOBALS["foo"] . "n";// グローバル スコープの $foo: 例の内容<br />エコー '現在のスコープの $foo: ' . "n";// 現在のスコープの $foo: ローカル変数<br /> }<br />$foo = "コンテンツの例";<br />test();<br />?></var> 「スーパーグローバル」はオートメーションのグローバル変数とも呼ばれます。これは、スクリプトのすべてのスコープで使用できることを意味します。関数またはメソッド内で
global $variable;を使用してアクセスする必要はありません。他のすべてのスーパーグローバル変数とは異なり、$GLOBALS は PHP で常に使用できます。
$_SERVER
は、ヘッダー、パス、スクリプトの場所などの情報を含む配列です。この配列内の項目は で表されます
Webサーバーの作成。 $_SERVER で次の要素が見つかる場合と見つからない場合があります。リスト:
'PHP_SELF': ドキュメントルートに関連する、現在実行中のスクリプトのファイル名。たとえば、http://example.com/test.php/foo.bar のスクリプトで を使用します。
$_SERVER['PHP_SELF'] は /test.php/foo.bar を取得します。
'SERVER_ADDR': スクリプトが現在実行されているサーバーの IP アドレス。
'SERVER_NAME': スクリプトが現在実行されているサーバーのホスト名。スクリプトが仮想ホスト上で実行されている場合、名前はその仮想ホストに設定された値によって決まります。
'SERVER_PROTOCOL': ページをリクエストするときの通信プロトコルの名前とバージョン。たとえば、「HTTP/1.0」です。
🎜'REQUEST_METHOD': ページへのアクセスに使用されるリクエスト メソッド。たとえば、「GET」、「HEAD」、「POST」、「PUT」。 🎜🎜 🎜🎜'REQUEST_TIME': リクエストが開始されたときのタイムスタンプ。 PHP 5.1.0 以降で利用可能です。 🎜🎜'QUERY_STRING': ページアクセスが実行されるクエリ文字列 (クエリ文字列) (存在する場合)。
'HTTP_HOST': 現在のリクエスト ヘッダー内の Host: 項目の内容 (存在する場合)。
'HTTP_REFERER': ユーザー エージェントを現在のページの前のページのアドレス (存在する場合) に誘導します。ユーザーエージェント設定によって決定されます。すべてのユーザーエージェントがこの項目を設定するわけではなく、一部のユーザーエージェントは HTTP_REFERER を変更する機能も提供します。要するに、その値は信頼できません。
'HTTP_USER_AGENT': 現在のリクエスト ヘッダー内の User-Agent: 項目の内容 (存在する場合)。この文字列は、このページにアクセスするユーザー エージェントに関する情報を示します。
'REMOTE_ADDR': 現在のページを閲覧しているユーザーの IP アドレス。
'REMOTE_HOST': 現在のページを閲覧しているユーザーのホスト名。 DNS 逆引き解決は、ユーザーの REMOTE_ADDR には依存しません。
'SERVER_PORT': Web サーバーによって使用されるポート。デフォルト値は「80」です。 SSL セキュア接続を使用する場合、この値はユーザーが設定した HTTP ポートです。
$_GET: URL パラメーターを介して現在のスクリプトに渡される変数の配列。 GET は urldecode() 経由で渡されます。
$_POST: HTTP POST メソッド経由で現在のスクリプトに渡される変数の配列。
$_FILES: HTTP POST 経由で現在のスクリプトにアップロードされたプロジェクトの配列。
$_REQUEST — HTTP リクエスト変数は、コマンドライン モードで実行する場合、 argv および argc 情報を含まず、$_SERVER 配列に存在します。
$_REQUEST の変数は GET、POST、COOKIE 入力メカニズムを通じてスクリプト ファイルに渡されるため、リモート ユーザーによって改ざんされる可能性があり、信頼できません。この配列の項目とその順序は、PHP の variables_order ディレクティブの構成によって異なります。
$_SESSION: 現在のスクリプトで使用できる SESSION 変数の配列。
move_uploaded_file() - アップロードされたファイルを新しい場所に移動します; import_request_variables() - GET/POST/Cookie 変数をグローバル スコープにインポートします; session_start() - 新しいセッションを開始するか、既存のセッションを再利用します。環境変数の値$_ENV: 環境を通じて現在のスクリプトに渡される変数の配列。これらの変数は、PHP パーサーのランタイム環境から PHP のグローバル名前空間にインポートされます。多くは PHP の実行をサポートするシェルによって提供されており、異なるシステムでは異なる種類のシェルが実行される可能性があるため、明確なリストは不可能です。定義された環境変数のリストについては、シェルのドキュメントを確認してください。他の環境変数には、PHP がサーバー モジュールとして実行されているか CGI プロセッサとして実行されているかに関係なく、CGI 変数が含まれます。
$_COOKIE: HTTP Cookie を通じて現在のスクリプトに渡される変数の配列。 setcookie() - Cookie を送信します
$php_errormsg — 以前のエラー メッセージ。$php_errormsg 変数には、PHP によって生成された最新のエラー メッセージが含まれます。この変数は、エラーが発生したスコープでのみ使用でき、track_errors 構成項目をオンにする必要があります (デフォルトではオフになっています)。ユーザーがエラーハンドラー (set_error_handler()) を定義して <code>FALSE を返すと、$php_errormsg が設定されます。
<code><code>@strpos();$http_response_header — HTTP 応答ヘッダー: $http_response_header この配列は get_headers() 関数に似ています。 HTTP ラッパーを使用する場合、$http_response_header には HTTP 応答ヘッダーが設定されます。 $http_response_headerはローカルスコープに作成されます。
🎜 <code><span><?php<br />function get_contents() {<br /> file_get_contents("http://example.com");<br /> var_dump($http_response_header);<br />}<br />get_contents();<br />var_dump($http_response_header);<br />?></span>$argc — 传递给脚本的参数数目:包含当运行于命令行下时传递给当前脚本的参数的数目。脚本的文件名总是作为参数传递给当前脚本,因此 $argc 的最小值为 1。这个变量仅在 register_argc_argv 打开时可用。
$argv — 传递给脚本的参数数组:包含当运行于命令行下时传递给当前脚本的参数的数组。第一个参数总是当前脚本的文件名,因此 $argv[0] 就是脚本文件名。这个变量仅在 register_argc_argv 打开时可用。
Exception是所有异常的基类。类摘要:
Exception { /* 属性 */ protectedstring$message ; protectedint$code ; protectedstring$file ; protectedint$line ; /* 方法 */ public__construct ([ string<code>$message = "" [, int<code>$code = 0 [, Exception<code>$previous = <code>NULL ]]] ) finalpublicstringgetMessage ( void ) finalpublicExceptiongetPrevious ( void ) finalpublicintgetCode ( void ) finalpublicstringgetFile ( void ) finalpublicintgetLine ( void ) finalpublicarraygetTrace ( void ) finalpublicstringgetTraceAsString ( void ) publicstring__toString ( void ) finalprivatevoid__clone ( 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: スローされた例外メッセージの内容。コード: 例外コード。 severity: 例外の重大度レベル。 filename: 例外がスローされたファイル名。 lineno: 例外がスローされた行番号。前: 例外チェーン内の前の例外。ErrorException::getSeverity — 例外の重大度を取得する
パラメータ: この関数にはパラメータがありません。 <code><code>try {foreach を使用してクラスを横断できるかどうかを検出するインターフェイス。単独では実装できない基本的な抽象インターフェイス。代わりに、IteratorAggregate または Iterator インターフェースによって実装する必要があります。このインターフェースを実装する組み込みクラスは、IteratorAggregate または Iterator インターフェースを実装せずに、反復に foreach を使用できます。これは、PHP スクリプトでは実装できない内部エンジン インターフェイスです。 IteratorAggregate または Iterator インターフェイスを代わりに使用できます。
Traversable { } このインターフェースにはメソッドはなく、その役割はすべての走査可能なクラスの基本インターフェースとしてのみです。 イテレータインターフェース:独自の外部イテレータまたはクラスのインターフェイスを使用して内部的に反復処理できます。
IteratorextendsTraversable { /* メソッド */ 抽象公開混合現在 (無効) abstractpublicscalarkey (void) abstractpublicvoidnext (ボイド) abstractpublicvoidrewind (void) abstractpublicbooleanvalid (void) }Iterator::current — 現在の要素を返します。パラメータはなく、任意の型を返すことができます。
Iterator::key — 現在の要素のキーを返します。パラメータはありません。成功した場合はスカラーを返し、失敗した場合は null を返します。
Iterator::next — 次の要素に進みます。パラメーターはありません。戻り値は無視されます。このメソッドは、foreach ループ の後に と呼ばれます。
Iterator::rewind — イテレータの最初の要素を返します。これは、foreach ループの開始時に呼び出される first メソッドです。 foreach ループの後では呼び出されません。パラメーターがないと、戻り値は無視されます。
Iterator::valid — 現在位置が有効かどうかを確認する: このメソッドは、Iterator::rewind() メソッドと Iterator::next() メソッドの後に呼び出され、現在位置が有効かどうかを確認します。パラメータがない場合、戻り値はブール値に変換されます。成功した場合は <code>TRUE<code>TRUE, 或者在失败时返回 <code>FALSE を返し、失敗した場合は <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() 的静态版本。
パラメータ:クロージャー バインドする必要がある匿名関数。 newthis には、匿名関数にバインドされたオブジェクトが必要です。そうでない場合は、<code>NULL<code>NULL 创建未绑定的闭包。newscope 想要绑定给闭包的类作用域,或者 'static' 表示不改变。如果传入一个对象,则使用这个对象的类型名。 类作用域用来决定在闭包中 $this 对象的 私有、保护方法 的可见性。返回一个新的 Closure 对象 或者在失败时返回 <code>FALSE 非バインド クロージャが作成されます。 newscope は、クロージャにバインドするクラス スコープです。または、「static」は変更されていないことを意味します。オブジェクトが渡された場合は、オブジェクトの型名が使用されます。 クラス スコープは、クロージャ内の $this オブジェクトのプライベートな保護されたメソッドの可視性を決定するために使用されます。新しい Closure オブジェクトを返すか、失敗した場合は <code>FALSE
を返します。
<code><span><?php<br />class A {<br /> private static $sfoo = 1;<br /> private $ifoo = 2;<br />}<br />$cl1 = static function() {<br /> return A::$sfoo;<br />};<br />$cl2 = function() {<br /> return $this->ifoo;<br>};<br>$bcl1 = Closure::bind($cl1, null, 'A');<br>$bcl2 = Closure::bind($cl2, new A(), 'A');<br>echo $bcl1(), "n"; //1<br>echo $bcl2(), "n"; //2<br>?></span> <code><p><?php<br />クラス A {<br /> プライベート $sfoo = 1;<br /> プライベート $ifoo = 2;<br />}<br />$cl1 = 静的関数 ( ) {<br /> return A::$sfoo;<br />};<br />$cl2 = function() {<br /> return $this->ifoo;<br />};< br />$bcl1 = Closure::bind($cl1, null, 'A');<br />$bcl2 = Closure::bind($cl2, new A(), 'A');<br /> エコー$bcl1(), "n"; //1<br />エコー $bcl2(), //2<br />?><span></span></p>; Closure::bindTo — 現在のクロージャ オブジェクトをコピーし、指定された $this オブジェクトとクラス スコープをバインドします。匿名関数を作成して返します。この関数は、現在のオブジェクトと同じ関数本体を持ち、同じ変数をバインドしますが、異なるオブジェクトまたは新しいクラス スコープをバインドできます。 「バインドされたオブジェクト」は関数本体の <code>newscope 类的成员函数是相同的。静态闭包不能有绑定的对象( <code>newthis 参数的值应该设为 <code>NULL$this の値を決定し、「クラス スコープ」は型を表し、この匿名関数でどのプライベート メソッドとプロテクト メソッドを呼び出すことができるかを決定します。 つまり、現時点で $this が呼び出すことができるメソッドは、<code>newscope クラスのメンバー関数と同じです。静的クロージャはバインドされたオブジェクトを持つことができません (<code>newthis パラメータの値は <code>NULL に設定する必要があります) が、bubdTo メソッドを使用してクラス スコープを変更できます。匿名関数をコピーしたいだけの場合は、代わりにクローン作成を使用できます。 <code>NULL 来取消绑定。newscope 关联到匿名函数的类作用域,或者 'static' 保持当前状态。如果是一个对象,则使用这个对象的类型为心得类作用域。 这会决定绑定的对象的 保护、私有成员 方法的可见性。返回值:返回新创建的 Closure 对象 或者在失败时返回 <code>FALSEパラメータ: newthis は匿名関数にバインドされたオブジェクト、またはバインドを解除するには <code>NULL です。 newscope は匿名関数のクラス スコープに関連付けられます。または、「static」は現在の状態を維持します。それがオブジェクトの場合、このオブジェクトのタイプはエクスペリエンス クラスのスコープで使用されます。 これにより、バインドされたオブジェクトの保護されたプライベート メンバー メソッドの可視性が決まります。戻り値: 新しく作成された Closure オブジェクトを返すか、失敗した場合は
<code>FALSE
を返します。
<code><span><?php<br />class A {<br /> function __construct($val) {<br /> $this->val = $val;<br> }<br> function getClosure() {<br> //returns closure bound to this object and scope<br> return function() { return $this->val; };<br> }<br>}<br>$ob1 = new A(1);<br>$ob2 = new A(2);<br>$cl = $ob1->getClosure();<br>echo $cl(), "n"; //1<br>$cl = $cl->bindTo($ob2);<br>echo $cl(), "n"; //2<br>?></span> <code>クラス A {ソケット コンテキスト オプションは、tcp、http
、<code>// connect to the internet using the '192.168.0.100' IPなど、ソケット上で動作するすべてのラッパー プロトコルで使用できます。
<code>// '192.168.0.100' IP を使用してインターネットに接続します
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:0',
),
);
// IP '192.168.0.100' とポート '7000' を使用してインターネットに接続します
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:7000',
),
) ;
// ポート '7000' を使用してインターネットに接続します
$opts = array(
'socket' => array(
'bindto' => '0: 7000',
),
);
// コンテキストを作成します...
$context = stream_context_create($opts);
// ...そしてこれを使用してデータを取得します
echo file_get_contents('http://www.example.com', false, $context);
?>
HTTP コンテキスト オプション — HTTP コンテキストのオプションのリスト。 http:// および
です。
<code>headerstring リクエスト中に送信される追加ヘッダー。このオプションの値は、他の値 (
User-agent:、Host:、Authentication: など) をオーバーライドします。
<code>user_agentstring 送信されるヘッダー User-Agent: の値。上記の header コンテキスト オプションでユーザー エージェントが指定されていない場合は、この値が使用されます。デフォルトでは、php.ini で設定された user_agent が使用されます。
).
🎜🎜🎜<code>request_fulluriboolean 🎜<code>TRUE🎜 に設定すると、ビルド時に使用されますリクエスト URI 全体を使用します。 (つまり、 🎜GET http://www.example.com/path/to/file.html HTTP/1.0🎜)。 これは非標準のリクエスト形式ですが、一部のプロキシ サーバーではこれが必要です。デフォルト値は 🎜<code>FALSE🎜 です。🎜🎜🎜🎜<code>follow_location 🎜Location🎜 ヘッダーに続く整数のリダイレクトです。無効にするには 🎜0🎜 に設定します。デフォルト値は🎜1🎜です。 🎜🎜🎜🎜<code>max_redirectsinteger 従うリダイレクトの最大数。 🎜1🎜 以下の値は、リダイレクトが行われないことを意味します。デフォルト値は🎜20🎜です。 🎜🎜🎜🎜<code>protocol_versionfloat HTTP プロトコルのバージョン。デフォルト値は🎜1.0🎜です。 PHP 5.3.0 より前のバージョンでは、チャンク転送デコードが実装されていませんでした。 この値が 🎜1.1🎜 に設定されている場合、 🎜1.1🎜 との互換性はあなたの責任になります。 🎜🎜🎜🎜<code>timeoutfloat 読み取りタイムアウト (秒単位)、float で指定します (例: 🎜10.5🎜)。 php.ini で設定されたdefault_socket_timeout がデフォルトで使用されます。 🎜🎜🎜🎜<code>ignore_errorsboolean は、障害ステータス コードであってもコンテンツを取得します。デフォルト値は 🎜<code>FALSE🎜.🎜🎜🎜 🎜 🎜 🎜🎜FTP コンテキスト オプション — FTP コンテキスト オプションのリスト🎜🎜 🎜🎜SSL コンテキスト オプション — SSL コンテキスト オプションのリスト。 🎜ssl://🎜 および 🎜tls://🎜 トランスポート プロトコル コンテキスト オプションのリスト。オプション: 多数。 🎜🎜 🎜🎜CURL コンテキスト オプション — CURL コンテキスト オプションのリスト。 CURL コンテキスト オプションは、CURL 拡張機能がコンパイルされるときに使用できます (🎜--with-curlwrappers🎜 構成オプション経由)。オプションのオプション: 🎜🎜 🎜🎜🎜<code>methodstring 🎜<code>GET🎜、🎜<code>POST🎜、またはリモートサーバーでサポートされている他の HTTP メソッド。デフォルトは 🎜<code>GET🎜 です。🎜🎜🎜🎜<code>headerstring 追加のリクエストヘッダー。この値は、他のオプション (🎜User-agent:🎜、🎜Host:🎜、 、🎜Authentication:🎜 など) で設定された値をオーバーライドします。 🎜🎜🎜🎜<code>user_agentstring リクエストの User-Agent ヘッダーの値を設定します。デフォルトは、php.ini の user_agent 設定です。 🎜🎜🎜🎜<code>contentstring ヘッダーの後に送信される追加データ。このオプションは、🎜<code>GET🎜 リクエストと 🎜<code>HEAD🎜 リクエストでは使用されません。 🎜🎜🎜🎜<code>proxystring URI。プロキシ サーバーのアドレスを指定するために使用されます (例: 🎜tcp://proxy.example.com:5100🎜)。 🎜🎜🎜🎜<code>max_redirectsinteger リダイレクトの最大数。 🎜1🎜 以下は、リダイレクトが従わないことを意味します。デフォルトは 🎜20🎜.🎜🎜🎜🎜<code>curl_verify_ssl_host ブール値検証サーバーです。デフォルトは 🎜<code>FALSE です。 🎜このオプションは、HTTP プロトコルと FTP プロトコルの両方で使用できます。 🎜🎜🎜🎜<code>curl_verify_ssl_peerboolean では、使用される SSL 証明書の検証が必要です。デフォルトは 🎜<code>FALSE です。 🎜このオプションは、HTTP プロトコルと FTP プロトコルの両方で使用できます。ページを取得し、データを POST として送信します: 🎜🎜🎜 🎜 🎜<code><span><?php<br />$postdata = http_build_query(<br /> array(<br /> 'var1' => 'some content',<br> 'var2' => 'doh'<br> )<br>);<br>$opts = array('http' =><br> array(<br> 'method' => 'POST',<br> 'header' => 'Content-type: application/x-www-form-urlencoded',<br> 'content' => $postdata<br> )<br>);<br>$context = stream_context_create($opts);<br>$result = file_get_contents('http://example.com/submit.php', false, $context);<br>?></span>Phar コンテキスト オプション — Phar コンテキスト オプションのリスト。 phar:// ラッパーのコンテキスト オプション。オプション: <code>compressint Phar compression constants 中的一个。<code>metadata混合 Phar メタデータ。 Phar::setMetadata() を参照してください。
コンテキストパラメータ — コンテキストパラメータのリスト。これらのパラメーター (parameters) は、関数 stream_context_set_params() によって返される context に設定できます。パラメータ: <code>notificationcallable ストリーム上でイベントが発生すると、呼び出し可能オブジェクトが呼び出されます。
18. サポートされているプロトコルとパッケージ化プロトコル
file:// — ローカル ファイル システムにアクセスします。 ファイルシステムは、PHPで使用されるデフォルトのラッパープロトコルであり、ローカルファイルシステムを公開します。 相対パス (/、、、\、または Windows ドライブ文字で始まらないパス) が指定された場合、指定されるパスは現在の作業ディレクトリに基づきます。 多くの場合、変更されていない限り、これはスクリプトが存在するディレクトリです。 CLI を使用する場合、ディレクトリはデフォルトでスクリプトが呼び出されるディレクトリになります。
fopen() や file_get_contents() などの特定の関数では、include_path は相対パスとしてもオプションで検索されます。
属性 | サポート |
---|---|
allow_url_fopen の影響を受けます | いいえ |
読み取りを許可する | はい |
書き込みを許可します | はい |
追加を許可します | はい |
同時読み取りと書き込みを許可します | はい |
サポート統計() | はい |
リンク解除()をサポート | はい |
名前変更()をサポート | はい |
mkdir()をサポート | はい |
rmdir()をサポート | はい |
http:// -- https:// -- HTTP(s) URL にアクセスします。 HTTP 1.0 GET メソッドを介したファイルまたはリソースへの読み取り専用アクセスを許可します。 HTTP リクエストには、ドメイン名ベースの仮想ホストとの互換性を確保するための Host: ヘッダーが付属します。 user_agent 文字列が php.ini ファイルまたはバイト ストリーム コンテキストで設定されている場合、それもリクエストに含まれます。データ ストリームではリソースの body を読み取ることができ、ヘッダーは $http_response_header 変数に保存されます。
ドキュメント リソースの送信元の URL を知る必要がある場合 (すべてのリダイレクトを処理した後)、データ フローによって返される一連の応答ヘッダーを処理する必要があります。
属性 | サポート |
---|---|
allow_url_fopenの対象 | はい |
読み取りを許可します | はい |
書き込みを許可します | いいえ |
追加を許可します | いいえ |
同時読み取りと書き込みを許可します | 該当なし |
サポート統計() | いいえ |
リンク解除()をサポート | いいえ |
名前変更()をサポート | いいえ |
mkdir()をサポート | いいえ |
rmdir()をサポート | いいえ |
ftp:// -- ftps:// -- FTP URL にアクセスします。新しいファイルを作成するだけでなく、FTP 経由で既存のファイルを読み取ることもできます。 サーバーがパッシブ モード FTP をサポートしていない場合、接続は失敗します。
ファイルを開いた後は、読み取りと書き込みの両方が可能ですが、同時にはできません。 リモート ファイルが FTP サーバー上に既に存在する場合、コンテキスト オプション overwrite を指定せずにファイルを開いて書き込もうとすると、接続は失敗します。 FTP 経由で既存のファイルを上書きする場合は、コンテキストの overwrite オプションを指定して開いて書き込みます。 代わりに、FTP 拡張機能を使用することもできます。 php.ini で from ディレクティブを設定すると、この値は匿名 FTP のパスワードとして使用されます。
プロパティ | PHP 4 | PHP 5 |
---|---|---|
allow_url_fopen の影響を受けます | はい | はい |
読み取りを許可する | はい | はい |
書き込みを許可します | はい (新しいファイルのみをサポートします) | はい (<code>overwriteを有効にした後の新しいファイル/既存のファイル) |
追加を許可します | いいえ | はい |
同時読み取りと書き込みを許可します | いいえ | いいえ |
サポート統計() | いいえ | 5.0.0 以降: filesize()、filetype()、file_exists()、is_file()、is_dir() のみ。 PHP 5.1.0 以降: filemtime()。 |
リンク解除()をサポート | いいえ | はい |
名前変更()をサポート | いいえ | はい |
mkdir()をサポート | いいえ | はい |
rmdir()をサポート | いいえ | はい |
php:// — さまざまな入出力ストリーム (I/O ストリーム) にアクセスします。 PHP は、PHP の入出力ストリーム、標準入力、出力、およびエラー記述子、メモリ内、ディスクバックアップの一時ファイル ストリーム、および他のファイル ストリームで動作できるフィルタへのアクセスを可能にする、さまざまな入出力 (IO) ストリームを多数提供します。読み書き可能なファイル リソース。
php://stdin、php://stdout、php://stderrを使用すると、PHPプロセスの対応する入力ストリームまたは出力ストリームに直接アクセスできます。 データ ストリームはコピーされたファイル記述子を参照するため、php://stdin を開いて閉じた場合、コピーを閉じるだけであり、実際に参照されている <code>STDIN<code>STDIN 并不受影响。 注意 PHP 在这方面的行为有很多 BUG 直到 PHP 5.2.1。 推荐你简单使用常量 <code>STDIN、 <code>STDOUT 和 <code>STDERR は影響を受けません。 PHP 5.2.1 までは、この領域での PHP の動作にはバグがあったことに注意してください。 これらのラッパーを手動で開く代わりに、定数 <code>STDIN、
<code>STDOUT、および <code>STDERR を単純に使用することをお勧めします。 php://stdinは読み取り専用、
php://stdoutとphp://stderrは書き込み専用です。 php://inputは、要求された生データにアクセスできる読み取り専用ストリームです。 POST リクエストの場合、特定の php.ini ディレクティブに依存しないため、$HTTP_RAW_POST_DATA の代わりに php://input を使用することをお勧めします。 さらに、この場合 $HTTP_RAW_POST_DATA はデフォルトでは設定されないため、always_populate_raw_post_data をアクティブにするよりも必要なメモリが少なくなる可能性があります。
enctype="multipart/form-data"を使用する場合、php://inputは無効です。
php://output は、 print や echo と同じ方法で出力バッファに書き込むことができる書き込み専用のデータ ストリームです。
php://fdは、指定されたファイル記述子への直接アクセスを許可します。 たとえば、php://fd/3 はファイル記述子 3 を指します。 php://memory と php://temp は、一時データの読み取りと書き込みを可能にするファイル ラッパーに似たデータ ストリームです。 2 つの唯一の違いは、php://memory は常にデータをメモリに保存するのに対し、php://temp はメモリ量が事前に定義された制限 (デフォルトは 2MB) に達した後にデータを一時ファイルに保存することです。 。 一時ファイルの場所は、sys_get_temp_dir() と同じ方法で決定されます。 php://temp のメモリ制限は、
/maxmemory:NNを追加することで制御できます。NN は、メモリに保持されるデータの最大量 (バイト単位) を超える場合、一時ファイルが使用されます。
php://filter🎜は、データストリームが開かれたときにアプリケーションをフィルタリングするために設計されたメタラッパーです。 これは、データ ストリームのコンテンツが読み取られる前に追加のフィルターを適用する機会がない、readfile()、file()、file_get_contents() などのオールインワン ファイル関数に役立ちます。 🎜php://filter🎜 ターゲットは、パスの一部として次のパラメーターを使用します。 複合フィルター チェーンをパス上に指定できます。 🎜🎜属性 | サポート |
---|---|
最初にallow_url_fopenを使用します | いいえ |
まずallow_url_includeを使用します | php://input、php://stdin、php://memory、php://tempのみ。 |
読み取りを許可する | php://stdin、php://input、php://fd、php://memory、php://tempのみ。 |
書き込みを許可します | php://stdout、php://stderr、php://output、php://fd、php://memory、php://tempのみ。 |
追加が許可されました | php://stdout、php://stderr、php://output、php://fd、php://memory、php://tempのみ(書き込みに等しい) |
同時読み取りと書き込みを許可します | php://fd、php://memory、php://tempのみ。 |
サポート統計() | php://memoryとphp://tempのみ。 |
リンク解除()をサポート | いいえ |
名前変更()をサポート | いいえ |
mkdir()をサポート | いいえ |
rmdir()をサポート | いいえ |
stream_select()のみをサポートします | php://stdin、php://stdout、php://stderr、php://fd、php://temp。 |
zlib:// -- bzip2:// -- zip:// — 圧縮ストリーム。 zlib: PHP 4.0.4 - PHP 4.2.3 (fopencookie を備えたシステムのみをサポート)
compress.zlib:// および compress.bzip2:// PHP 4.3.0 以降
zlib: は gzopen() のような関数ですが、そのデータ ストリームは fread() や他のファイル システム関数でも使用できます。 これは、「:」文字を含む他のファイル名と混同されるため、PHP 4.3.0 以降では非推奨になりました。代わりに compress.zlib:// を使用してください。
compress.zlib://、compress.bzip2://は、gzopen()およびbzopen()と同等です。 fopencookie をサポートしていないシステムでも使用できます。
ZIP 拡張子は、zip: カプセル化プロトコルに登録されています。オプション
data:// — データ (RFC 2397)。使用法: data://text/plain;base64,
属性 | サポート |
---|---|
allow_url_fopenの対象 | いいえ |
allow_url_includeの対象 | はい |
読み取りを許可する | はい |
書き込みを許可します | いいえ |
追加が許可されました | いいえ |
同時読み取りと書き込みを許可します | いいえ |
サポート統計() | いいえ |
リンク解除()をサポート | いいえ |
名前変更()をサポート | いいえ |
mkdir()をサポート | いいえ |
rmdir()をサポート | いいえ |
データの内容を印刷://:
<code><code>// 打印 "I love PHP"コード> メディアタイプを取得:
<code><span><?php<br />$fp = fopen('data://text/plain;base64,', 'r');<br />$meta = stream_get_meta_data($fp);<br />echo $meta['mediatype']; // 打印 "text/plain"<br />?></span> <code><p><?php<br />$fp = fopen('data://text/plain;base64,', 'r');<br />$meta = stream_get_meta_data($fp);<br />echo $meta['mediatype']; // "text/plain" を出力します<br />?><span></span></p> glob:// — 一致するファイル パス パターンを検索します。使用法: glob://属性 | サポート |
---|---|
allow_url_fopenの対象 | いいえ |
allow_url_includeの対象 | いいえ |
読み取りを許可する | いいえ |
書き込みを許可します | いいえ |
添付ファイルを許可する | いいえ |
同時読み取りと書き込みを許可します | いいえ |
サポート統計() | いいえ |
リンク解除()をサポート | いいえ |