PHP 中国語マニュアル 2
<code><code>
11. 例外処理
<code><code>
ユーザーは、PHP の組み込み例外処理クラスをカスタム例外処理クラスで拡張できます。次のコードは、組み込み例外処理クラスのどのプロパティとメソッドがサブクラスでアクセス可能で継承可能であるかを示しています。翻訳者注: 次のコードは、組み込みの例外処理クラスの構造を説明するためだけのものであり、実際的な意味を持つ使用可能なコードではありません。
<code>クラス例外{
protected $ message = '不明な例外'; //例外情報
保護 $code = 0; //ユーザー定義の例外コード
保護 $file //例外が発生したファイル名
保護$line ; // 例外が発生したコード行番号
function __construct($message = null, $code = 0);
final function getMessage(); // 例外メッセージを返します。 >final function getCode( ); // 例外コードを返します
final function getFile(); // 例外が発生したファイル名を返します
final function getLine(); // コード行番号を返します例外が発生した場所
final function getTrace(); // backtrace() 配列
final function getTraceAsString(); // getTrace() 情報を文字列にフォーマット
/* オーバーロード可能なメソッド*/
function __toString(); // 出力可能な文字列
}
?><code>class Exception{
protected $message = 'Unknown exception'; // 异常信息
protected $code = 0; // 用户自定义异常代码
protected $file; // 发生异常的文件名
protected $line; // 发生异常的代码行号
function __construct($message = null, $code = 0);
final function getMessage(); // 返回异常信息
final function getCode(); // 返回异常代码
final function getFile(); // 返回发生异常的文件名
final function getLine(); // 返回发生异常的代码行号
final function getTrace(); // backtrace() 数组
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
/* 可重载的方法 */
function __toString(); // 可输出的字符串
}
?>
カスタム クラスを使用して組み込みの例外処理クラスを拡張し、コンストラクターを再定義する場合は、同時にparent::__construct() を呼び出して、すべての変数が正しく設定されているかどうかを確認することをお勧めします。割り当てられた値。オブジェクトが文字列を出力したい場合は、__toString() をオーバーロードして出力スタイルをカスタマイズできます。
拡張 PHP 組み込み例外処理クラス
<code>// 例外処理クラスをカスタマイズします
class MyException extends Exception { // message が指定する必要があるプロパティになるようにコンストラクターを再定義します
public function __construct($message, $code = 0) {
// カスタマイズされたコード // すべての変数が正しい割り当てであることを確認します
parent ::__construct($message, $code);
}
// 文字列出力のスタイルをカスタマイズします
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}n";
}
public functioncustomFunction() {
echo "このカスタム関数例外の種類";
}
}
//<code>// 自定义一个异常处理类
class MyException extends Exception{ // 重定义构造器使 message 变为必须被指定的属性
public function __construct($message, $code = 0) {
// 自定义的代码 // 确保所有变量都被正确赋值
parent::__construct($message, $code);
}
// 自定义字符串输出的样式
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}n";
}
public function customFunction() {
echo "A Custom function for this type of exceptionn";
}
}
//创建一个用于测试异常处理机制的类
class TestException{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// 抛出自定义异常
throw new MyException('1 is an invalid parameter', 5);
break;
case self::THROW_DEFAULT:
// 抛出默认的异常
throw new Exception('2 isnt allowed as a parameter', 6);
break;
default:
// 没有异常的情况下,创建一个对象
$this->var = $avalue;
break;
}
}
}
// 例子 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // 捕获异常
echo "Caught my exceptionn", $e;
$e->customFunction();
} catch (Exception $e) { // 被忽略
echo "Caught Default Exceptionn", $e;
}
// 执行后续代码
var_dump($o);
echo "nn";
// 例子 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // 不能匹配异常的种类,被忽略
echo "Caught my exceptionn", $e;
$e->customFunction();
} catch (Exception $e) { // 捕获异常
echo "Caught Default Exceptionn", $e;
}
// 执行后续代码
var_dump($o);
echo "nn";
// 例子 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // 捕获异常
echo "Default Exception caughtn", $e;
}
// 执行后续代码
var_dump($o);
echo "nn";
// 例子 4
try {
$o = new TestException();
} catch (Exception $e) { // 没有异常,被忽略
echo "Default Exception caughtn", $e;
}
// 执行后续代码
var_dump($o);
echo "nn";
?>例外処理メカニズムをテストするためのクラスを作成しますclass TestException{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self:: THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// カスタム例外をスローします
throw new MyException('1 は無効なパラメータです', 5 );
break;
case self::THROW_DEFAULT:
// デフォルトの例外をスローします
throw new Exception('2 はパラメータとして許可されません' , 6);
/>break;
default:
// 例外がない場合はオブジェクトを作成します
$this->var = $avalue;
break ;
}}
}
// 例 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // 例外をキャッチ
echo "例外をキャッチしました", $e;
$e->customFunction();
} catch (Exception $e) { // 無視されました
>echo "Caught Default Exceptionn", $e;
}
// 後続のコードを実行します
var_dump($o);
echo "nn ";
//例 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // 例外タイプに一致しません、無視されます
echo "例外をキャッチしました", $e;
$e->customFunction();
} catch (Exception $e) { // 例外をキャッチします
echo "デフォルトの例外をキャッチしました", $e ;
}
// 後続のコードを実行します
var_dump($o);
echo "nn";
// 例 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // 例外をキャッチします
echo "Default Exception catchn" , $e;
}
// 後続のコードを実行します
var_dump($o);
echo "nn";
// 例 4
try {
$o = new TestException();
} catch (Exception $e) { // 例外なし、無視されます
echo "Default Exception catchn", $e;
}
// 後続のコードを実行します
var_dump($o);
echo "nn";
?>
ジェネレーターを使用すると、foreach コードブロックにコードを書き込むことができます。メモリ内に配列を作成せずにデータのセットを反復処理すると、メモリの制限に達するか、かなりの処理時間がかかることになります。代わりに、通常のカスタム関数と同じようにジェネレーター関数を作成できます。通常の関数が 1 回だけ返すのではなく、ジェネレーターは反復する必要がある値を生成するために必要なだけ何度でも生成できます。
<code>function xrange($start, $limit, $step = 1) {
if ($start <$limit) {
if ($step <= 0) {
throw new LogicException('Step は ve でなければなりません');
}
Else {
if ($ Step & GT; = 0) {
新しい LogiceXception をスローします ('ステップは -ve である必要があります')
} < br/> for ($ i = $ start; $i > と xrange() は同じ結果になります。
* 以下の出力。 */
echo 'range() からの 1 桁の奇数: ';< br/>foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "n";
echo '1 桁xrange() からの奇数: ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
?> <code>function xrange($start, $limit, $step = 1) {
if ($start < $limit) {
if ($step <= 0) {
throw new LogicException('Step must be ve');
}
for ($i = $start; $i <= $limit; $i = $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be -ve');
}
for ($i = $start; $i >= $limit; $i = $step) {
yield $i;
}
}
}
/* Note that both range() and xrange() result in the same
* output below. */
echo 'Single digit odd numbers from range(): ';
foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "n";
echo 'Single digit odd numbers from xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
?>
Single digit odd numbers from range(): 1 3 5 7 9 Single digit odd numbers from xrange(): 1 3 5 7 9
ジェネレーターの主な利点は、Iterator クラスを実装する場合に比べて、記述する必要のある定型コードがはるかに少なく、一般にコードが読みやすいことです。次の関数とクラスは同等です:
<code>function getLinesFromFile ($fileName) {
if (!$fileHandle = fopen($fileName, 'r')) {
return;
}
while (false !== $line = fgets($fileHandle)) {
yield $line ;
}
fclose($fileHandle);
}
// 対...
class LineIterator は Iterator {
protected $fileHandle;
protected $line;
protected $i;
public function __construct($fileName) {
if (!$this- >fileHandle = fopen($fileName, 'r')) {
新しいランタイム例外をスローします ('ファイル "'. $ FILENAME. '"')
}
Public function rewind () {
fseek($this->fileHandle, 0);
$this->line = fgets($this->fileHandle);
$this-> ;i = 0;
}
public function valid() {
return false !== $this->line;
}
public function current() {
return $this->line;
}
public function key() {
return $this->i;
}
public function next() {
if (false !== $this->line) {
$this->line = fgets($this->fileHandle);
$this ->i ;
}
}
パブリック関数 __destruct() {
fclose($this->fileHandle);
}
}?><code>function getLinesFromFile($fileName) {
if (!$fileHandle = fopen($fileName, 'r')) {
return;
}
while (false !== $line = fgets($fileHandle)) {
yield $line;
}
fclose($fileHandle);
}
// versus...
class LineIterator implements Iterator {
protected $fileHandle;
protected $line;
protected $i;
public function __construct($fileName) {
if (!$this->fileHandle = fopen($fileName, 'r')) {
throw new RuntimeException('Couldn't open file "' . $fileName . '"');
}
}
public function rewind() {
fseek($this->fileHandle, 0);
$this->line = fgets($this->fileHandle);
$this->i = 0;
}
public function valid() {
return false !== $this->line;
}
public function current() {
return $this->line;
}
public function key() {
return $this->i;
}
public function next() {
if (false !== $this->line) {
$this->line = fgets($this->fileHandle);
$this->i ;
}
}
public function __destruct() {
fclose($this->fileHandle);
}
}
?>
<code>$a =& $b; // これは < を意味します。 🎜><code>$a =& $b; //这意味着 $a 和 $b 指向了同一个变量。$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者· //相反,而是 $a 和 $b 指向了同一个地方。
?>$a
と
$b
はここではまったく同じですが、$a は
$b または · // 代わりに、
$a および
$b は同じ場所を指します。
?>
<code>
if参照を持つ配列はコピーされ、その値は逆参照されません。配列値を関数に渡す場合も同様です。未定義の変数が参照によって割り当てられた場合、参照によって渡された場合、または参照によって返された場合、その変数は自動的に作成されます。
function foo(&$var) { }
foo ($a); // $a が「作成」され、null
$b = array();foo( $b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)$c = new StdClass;
<code>$bar =& new fooclass(); ?> 同じ構文参照を返す関数と new 演算子 (PHP 4.0.4 以降) で使用できます: <code> $bar =& new fooclass(); <code>$var1 = "Example variable";
$foo =& find_var($bar);
?>foo($c->d);var_dump(property_exists($c, ' d')); // bool(true)
$foo =& find_var($ bar);< br/>?>
$var2 = "";
function global_references($use_globals){
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visible only inside the function
} else {
$GLOBALS["var2"] =& $var1; // visible also in global context
}
}
global_references(false);
echo "var2 is set to '$var2'n"; // var2 is set to ''
global_references(true);
echo "var2 is set to '$var2'n"; // var2 is set to 'Example variable'
?>
参照は関数内で global として宣言された変数に割り当てられます。参照は関数内でのみ表示されます。これは、$GLOBALS 配列を使用することで回避できます。関数内でグローバル変数を参照する:
<code>
$var1 = "変数の例";
global $var;
を次のように扱います$var =& $GLOBALS['var']; の略称です。したがって、他の参照を $var
に代入しても、ローカル変数の参照のみが変更されます。
参照を持つ変数に foreach ステートメントで値が割り当てられている場合参照されているオブジェクトも変更されます。
$ref = 0;
$row =& $ ref;
<code>function foo(&$var){ ?>参照が行う 2 番目のことは、参照によって変数を渡すことです。これは、関数内にローカル変数を作成し、その変数が呼び出しスコープ内の同じコンテンツを参照することによって実現されます。例: 参照が行う 3 番目のことは、参照を返すことです。参照はポインタではありません。 関数がその引数の値を変更できるように、参照によって変数を関数に渡すことができます。 <code><code>function foo(&$var){ 関数呼び出しには引用符がないことに注意してください。関数定義があります。パラメータを正しく参照渡しするには関数定義だけで十分です 以下は参照により渡すことができます: 変数 (foo($a) など); 新しいステートメント (foo(new foobar()) など) 関数から返される参照 その他の式は参照渡しできず、結果は未定義です。 <code><span style="font-size: large;"><?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> 参照リターンは、関数を使用して参照をバインドする必要がある変数を見つけたい場合に使用します。 。 パフォーマンスを向上させるために戻り参照を使用しないでください <code><span style="font-size: large;"><?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 <code><span style="font-size: large;"><?php<br/>$a = 1;<br/>$b =& $a;<br/>unset($a);<br/>?></span> は設定を解除しません $b、 グローバル参照: global $var で変数を宣言すると、グローバル変数への参照が実際に確立されます。これは次のことと同じです: <code><span style="font-size: large;"><?php<br/>$var =& $GLOBALS["var"]; //这意味着,例如,unset <var><var>$var</var></var> 不会 unset 全局变量。<br/>?></span> $this: オブジェクトのメソッド内、 は常に、それを呼び出すオブジェクトへの参照です。 14. 事前定義変数 スーパー グローバル変数変数は、すべてのスコープで常に使用できる組み込み変数です。PHP の定義済み変数の多くは「スーパーグローバル」です。これは、スクリプトのすべてのスコープで使用できることを意味します。 global $variable; を実行せずに、関数またはメソッド内でアクセスできます。これらのスーパーグローバル変数は次のとおりです。 $_COOKIE;$_SESSION;$_REQUEST;$_ENV デフォルトでは、すべてのスーパーグローバル変数が使用可能です。ただし、この可用性に影響を与えるディレクティブがいくつかあります。 $GLOBALS — グローバル スコープで使用可能なすべての変数を参照します。1 つはすべての変数を含みます。 . グローバル組み合わせ配列。変数の名前は配列のキーです。 <code><code>function test() { 「スーパーグローバル」は自動グローバル変数とも呼ばれます。これは、スクリプトのすべてのスコープで使用できることを意味します。関数やメソッドで global $variable; を使用してアクセスする必要はありません。他のすべてのスーパーグローバル変数とは異なり、$GLOBALS は PHP で常に使用できます。 $_SERVERヘッダー情報(header)、パス(path)、スクリプトの場所(script location)などの情報を含む配列です。この配列内の項目は、> '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': クエリ文字列 String) 、存在する場合、それを通じてページアクセスが実行されます。 'HTTP_HOST': 現在のリクエスト内header Host: 項目の内容 (存在する場合)。
'HTTP_USER_AGENT': 現在のリクエスト内header User-Agent: 項目の内容 (存在する場合)。この文字列は、このページにアクセスするユーザー エージェントに関する情報を示します。 'REMOTE_ADDR': 現在のページを参照しますユーザーの IP アドレス。
'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_RAW_POST_DATA — ネイティブ POST データ。 $HTTP_RAW_POST_DATA POST によって送信された生データが含まれます。 always_populate_raw_post_data を参照してください。 通常、$HTTP_RAW_POST_DATA の代わりに php://input を使用します。 $http_response_header — HTTP 応答ヘッダー: $ http_response_header 配列は get_headers() 関数に似ています。 HTTP ラッパーを使用する場合、$http_response_header に HTTP 応答ヘッダーが設定されます。 $http_response_header はローカル スコープに作成されます。 <code><span style="font-size: large;"><?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><code> $argc — スクリプトに渡される引数の数: コマンド ラインから実行するときに現在のスクリプトに渡される引数の数が含まれます。スクリプトのファイル名は常に引数として現在のスクリプトに渡されるため、$argc の最小値は 1 $argv — スクリプトに渡される引数 配列 : コマンド ラインから実行するときに現在のスクリプトに渡されるパラメーターを含む配列。最初のパラメータは常に現在のスクリプトのファイル名であるため、$argv[0] 15. 事前定義された例外 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 ) Exception::__construct — 异常构造函数 Exception::getMessage — 获取异常消息内容 Exception::getPrevious — 返回异常链中的前一个异常 <code><span style="font-size: large;"><?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> 以上例程的输出类似于: Exception::getCode — 获取异常代码 Exception::getFile — 获取发生异常的程序文件名称 Exception::getLine — 获取发生异常的代码在文件中的行号 Exception::getTrace — 例外トレース情報を取得する Exception::getTraceAsString — 文字列型 Exception::__toString — 例外オブジェクトを文字列に変換する Exception::__clone — 例外クローン ErrorException::__construct — 例外コンストラクター ErrorException::getSeverity — 例外の重大度を取得します <code> 試してください {
$var ;
}
$a=5;
foo($a);
?>foreach (array(1, 2, 3) as $row) {// 何かをする}echo $ref; // 3 - 反復配列の最後の要素
$var ;
}
$a=5;
foo($a);
?> は $a になります。これは、foo 関数の変数 $var が $a は同じコンテンツを指します。詳細な説明については、「参照による受け渡し」を参照してください。
$var ;
}
$a=5;
foo($a);// $a is 6 here
?>function foo( &$var){
$var ;
}
$a=5;
foo($a);// ここで $a は 6 です
?>
$a = 5;
return $a;
}
foo(bar()); // PHP 5.0.5 以降で発生エラー
foo($a = 5) // 式、変数ではありません
foo(5) // 致命的なエラーが発生します
?>
$foo = "local variable";
echo '$foo in global scope: ' . $GLOBALS["foo"] . "n";//$foo in global scope: Example content
echo '$foo in current scope: ' . $foo . "n";//$foo in current scope: local variable
}
$foo = "Example content";
test();
?>関数 test() {
$foo = "ローカル変数";
エコー '$foo をグローバル スコープで: ' . $GLOBALS["foo"] .グローバル スコープ内: 内容の例
echo '現在のスコープ内の $foo : ' $foo . "n";// 現在のスコープ内の $foo : ローカル変数
}
$foo = "コンテンツの例";
test();
?>
echo $php_errormsg; //Wrong parameter count for strpos()
?>@strpos();
echo $php_errormsg; //strpos() のパラメータ数が間違っています
?>
file_get_contents("http://example.com");
var_dump($http_response_header);
}
get_contents();
/> />var_dump($http_response_header);
?>
<span style="font-size: large;">/home/bjori/ex.php:8 Something happend (911) [MyCustomException]/home/bjori/ex.php:6 You are doing it wrong! (112) [InvalidArgumentException]</span>
throw new ErrorException("例外メッセージ", 0, 75);
} catch(ErrorException $e) {
echo "この例外の重大度は次のとおりです: $e->getSeverity();
/>}
?><code>try {
throw new ErrorException("Exception message", 0, 75);
} catch(ErrorException $e) {
echo "This exception severity is: " . $e->getSeverity();
}
?>
16. 定義済みインターフェース
トラバース可能なインターフェース:
を検出するインターフェースforeach を使用してクラスを横断できるかどうか。単独では実装できない基本的な抽象インターフェイス。代わりに、
IteratorAggregate または Iterator インターフェイスによって実装する必要があります。このインターフェイスを実装する組み込みクラスは、IteratorAggregate または Iterator インターフェイスを実装せずに、反復に foreach を使用できます。これは、PHP スクリプトでは実装できない内部エンジン インターフェイスです。代わりに、IteratorAggregate または Iterator インターフェイスを使用できます。
Traversable { } このインターフェースこれにはメソッドはなく、すべての走査可能なクラスの基本インターフェイスとして機能するだけです。
反復子インターフェイス:
独自の外部イテレータまたはクラスを介して内部的に反復できるインターフェイス。
イテレータextendsTraversable {
/* Method*/abstractpublicmixedcurrent (void)
abstractpublicscalarkey (void)
abstractpublicvoidnext (void)
abstractpublicvoidrewind (void)
abstractpublicbooleanvalid ( void )
}
Iterator::current — 現在の要素を返します。パラメータはなく、任意の型を返すことができます。
Iterator::key — 現在の要素のキーを返す: noパラメータ。成功した場合はスカラーを返し、失敗した場合は 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 style="font-size: large;"><?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 style="font-size: large;">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 getstring(17) "obj::offsetExists"bool(true)</span>
ArrayAccess::offsetGet — 获取一个偏移位置的值:当检查一个偏移位置是否为 empty() 时,此方法被执行。
参数:offset 需要获取的偏移位置。返回值:可返回任何类型。ArrayAccess::offsetSet — 设置一个偏移位置的值:参数:offset 待设置的偏移位置。value 需要设置的值。没有返回值。
別の値が使用できない場合、<code>offset パラメータは <code>NULL。
に設定されます。
ArrayAccess::offsetUnset — オフセット位置の値をリセットする: 型変換に使用 (未設定) する場合、このメソッドは呼び出されません。
<code>参数:offset リセットするオフセット位置。戻り値はありません。
シリアル化インターフェイス:
シリアル化可能: :serialize — オブジェクトの文字列表現。このメソッドはオブジェクト デストラクターの役割を果たします。このメソッドの後、 __destruct() メソッドは ではなく 呼び出されます。この関数にはパラメータがなく、戻り値は返されたオブジェクトの文字列表現、または <code>NULL です。
Serializable::unserialize — オブジェクトを構築します。このメソッドはオブジェクト コンストラクターの役割を果たします。このメソッドの後、__construct() は ではなく 呼び出されます。パラメータ: シリアル化されたオブジェクトの文字列表現。
Closure::__construct — インスタンス化を禁止するために使用されるコンストラクター。このメソッドは、Closure クラスのオブジェクトのインスタンス化を無効にするためにのみ使用されます。このクラスのオブジェクトの作成方法は匿名関数のページに書かれています。この関数にはパラメータも戻り値もありません。
Closure::bind — クロージャをコピーし、指定された $this オブジェクトをクラス スコープにバインドします。このメソッドは Closure::bindTo() の静的バージョンです。
パラメータ:クロージャ バインドする必要がある匿名関数。 newthis には、匿名関数にバインドされたオブジェクトが必要です。そうでない場合、<code>NULL は非バインド クロージャを作成します。 newscope は、クロージャにバインドするクラス スコープです。または、「static」は変更されていないことを意味します。オブジェクトが渡された場合は、オブジェクトの型名が使用されます。 クラス スコープは、クロージャ内の $this オブジェクトのプライベートな保護されたメソッドの可視性を決定するために使用されます。新しい Closure オブジェクト、または失敗時に返します <code>FALSE
<code><code>class A {
private static $sfoo = 1;
private $ifoo = 2;
}
$cl1 = static function() {
return A::$sfoo;
};
$cl2 = function() {
return $this->ifoo;
};
$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), 'A');
echo $bcl1(), "n"; //1
echo $bcl2(), "n"; //2
?>クラス A {
private static $sfoo = 1;
private $ifoo = 2;
}< br/> $cl1 = static function() {
return A::$sfoo;
};
$cl2 = function() {
return $this->ifoo ;
/>};
$bcl1 = Closure::bind($cl1, null, 'A');
$bcl2 = Closure::bind($cl2, new A(), ' A') ;
echo $bcl1(), "n"; //1
echo $bcl2(), "n";
?>
Closure::bindTo — 現在のクロージャ オブジェクトをコピーし、バインドする指定された $this オブジェクトとクラス スコープ。匿名関数を作成して返します。この関数は、現在のオブジェクトと同じ関数本体を持ち、同じ変数をバインドしますが、異なるオブジェクトまたは新しいクラス スコープをバインドできます。 「バインドされたオブジェクト」は関数本体の $this<code>newscope の値を決定し、「クラス スコープ」は型を表し、この匿名関数でどのプライベート メソッドと保護されたメソッドを呼び出すことができるかを決定します。 つまり、この時点で $this が呼び出せるメソッドは、<code>newthis クラスのメンバー関数と同じになります。静的クロージャはバインドされたオブジェクトを持つことができません ( パラメータの値は <code>NULL に設定する必要があります) が、クラス スコープは bubdTo メソッドを使用して変更できます。匿名関数をコピーしたいだけの場合は、代わりにクローン作成を使用できます。
パラメータ: newthis 無名関数にバインドされたオブジェクト、またはバインドを解除する <code>NULL。 newscope は匿名関数のクラス スコープに関連付けられます。または、「static」は現在の状態を維持します。それがオブジェクトの場合、このオブジェクトのタイプはエクスペリエンス クラスのスコープで使用されます。 これにより、バインドされたオブジェクトの保護されたプライベート メンバー メソッドの可視性が決まります。戻り値: 新しく作成された Closure オブジェクト、または失敗時に返されます <code>FALSE<code><span style="font-size: large;"><?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>
17. コンテキスト オプションとパラメータ
ソケット コンテキスト オプションすべてを使用できますtcp、http、ftp など、ソケット上で動作するラッパー プロトコル。
<code><code>// connect to the internet using the '192.168.0.100' IP
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:0',
),
);
// connect to the internet using the '192.168.0.100' IP and port '7000'
$opts = array(
'socket' => array(
'bindto' => '192.168.0.100:7000',
),
);
// connect to the 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);
?>// '192.168' IP を使用してインターネットに接続します< br/>$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:// および https:// トランスポート プロトコルに提供されるコンテキスト オプション。トランスポートのオプション:
FTP コンテキスト オプション — FTP コンテキスト オプションのリスト
SSL コンテキスト オプション — SSL コンテキスト オプションのリスト。 ssl:// および tls:// トランスポート プロトコル コンテキスト オプションのリスト。オプション: 多数。
CURL コンテキスト オプション — CURL コンテキスト オプションのリスト。 CURL コンテキスト オプションは、CURL 拡張機能がコンパイルされるときに使用できます (--with-curlwrappers 構成オプション経由)。オプションのオプション:
<code><code>$postdata = http_build_query(
array(
'var1' => 'some content',
'var2' => 'doh'
)
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/submit.php', false, $context);
?>$postdata = http_build_query(
array(
) ' var1' => '一部のコンテンツ',
'var2' => 'doh'
) )
);
$opts = array('http' => array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
' content' => $postdata
)
);
$context = stream_context_create($opts);
$result = file_get_contents('http://example.com/ submit .php', false, $context);
?>
Phar コンテキスト オプション — Phar コンテキスト オプションのリスト。 phar://<code>compress ラッパーのコンテキスト オプション。オプション: <code>metadataint Phar 圧縮定数の 1 つ。 混合 Phar メタデータ。 Phar::setMetadata() を参照してください。
コンテキスト パラメーター — コンテキスト パラメーターのリスト。これらのパラメータ (parameters) は、関数 stream_context_set_params() によって返される context<code>notification に設定できます。パラメータ: callable ストリーム上でイベントが発生すると、callable が呼び出されます。
18. サポートされるプロトコルとカプセル化プロトコル
file:// — ローカル ファイル システムにアクセスします。 Filesystem は、PHP で使用されるデフォルトのラッパー プロトコルであり、ローカル ファイル システムを公開します。 相対パス (/、、、\、または Windows ドライブ文字で始まらないパス) が指定された場合、指定されるパスは現在の作業ディレクトリに基づきます。 多くの場合、変更されていない限り、これはスクリプトが存在するディレクトリです。 CLI を使用する場合、ディレクトリはデフォルトでスクリプトが呼び出されるディレクトリになります。
fopen() や file_get_contents() などの特定の関数では、include_path もオプションで検索されます。相対パス。
属性 | 支持 |
---|---|
受 allow_url_fopen 影响 | No |
允许读取 | Yes |
允许写入 | Yes |
允许添加 | Yes |
允许同时读和写 | Yes |
支持 stat() | Yes |
支持 unlink() | Yes |
支持 rename() | Yes |
支持 mkdir() | Yes |
支持 rmdir() | Yes |
http:// -- https:// — HTTP URL にアクセスします。 HTTP 1.0 GET メソッドを介したファイルまたはリソースへの読み取り専用アクセスを許可します。 HTTP リクエストには、ドメイン名ベースの仮想ホストとの互換性を確保するために Host: ヘッダーが伴います。 user_agent 文字列が php.ini ファイルまたはバイト ストリーム コンテキストで設定されている場合、それもリクエストに含まれます。データ ストリームではリソースの body を読み取ることができ、ヘッダーは $http_response_header 変数に保存されます。
ドキュメント リソースの送信元の URL を知る必要がある場合 (すべてのリダイレクトを処理した後)、返された一連の応答ヘッダーを処理する必要があります。データ フロー (応答ヘッダー) によって異なります。
属性 | 支持 |
---|---|
受 allow_url_fopen 限制 | Yes |
允许读取 | Yes |
允许写入 | No |
允许添加 | No |
允许同时读和写 | N/A |
支持 stat() | No |
支持 unlink() | No |
支持 rename() | No |
支持 mkdir() | No |
支持 rmdir() | No |
ftp:// -- ftps:// — FTP URL にアクセスします。新しいファイルを作成するだけでなく、FTP 経由で既存のファイルを読み取ることもできます。 サーバーがパッシブ モード FTP をサポートしていない場合、接続は失敗します。
ファイルを開いた後は、読み取りと書き込みの両方が可能ですが、同時にはできません。 リモート ファイルが FTP サーバー上にすでに存在する場合、コンテキスト オプション overwrite を指定せずにファイルを開いて書き込もうとすると、接続は失敗します。 FTP 経由で既存のファイルを上書きする場合は、開いて書き込むコンテキストの overwrite オプションを指定します。 代わりに、FTP 拡張機能を使用することもできます。 php.ini で from ディレクティブを設定すると、この値は匿名 FTP のパスワードとして使用されます。
属性 | PHP 4 | PHP 5 |
---|---|---|
allow_url_fopen の影響を受ける | はい | はい |
読み取りを許可します | はい | はい |
書き込みを許可します | はい (新しいファイルのみ) | はい (新しいファイル/<code>overwrite を有効にした後に既に存在するファイル) |
の追加を許可します | いいえ | はい |
同時読み取りと書き込みを許可します | いいえ | いいえ |
サポート stat() |