PHPの「」ダブルコロン関数

Jun 13, 2016 pm 01:02 PM
dictionary gt

php
における「::」二重コロンの効果

lazycms::$sysname

この式は初めて見ました。二重コロンは何を意味しますか?

答え:
に直接属するメソッドまたは属性。クラス。

つまり、静的な静的メソッドまたは属性の使用です。
フィールド演算子は通常、クラス A オブジェクトのプロパティ/メソッドをクラス B オブジェクトで使用するために使用されます!

?

?

この記事では、最も基本的な概念から継承まで、PHP V5 のオブジェクトとクラスの基本的な知識について説明します。主に、オブジェクト指向の経験豊富なプログラマと、オブジェクトに慣れていない読者を対象としています。
PHP プログラマーであれば、変数と関数についてよく知っているはずです。ただし、クラスとオブジェクトは別の話になる可能性があります。単一のクラスを定義しなくても、完全なシステムを作成することは可能です。ただし、コード内でオブジェクト指向プログラミングを使用しないことに決めた場合でも、オブジェクト指向プログラミングについて学びたいと思うかもしれません。たとえば、PHP Extension and Application Repository (PEAR) を通じて利用できるサードパーティ ライブラリを使用する場合、オブジェクトをインスタンス化しメソッドを呼び出すことになります。

クラスとオブジェクトとは何ですか?
簡単に言えば、クラスは変数とメソッドの独立したブロックまたはバンドルです。これらのコンポーネントは、多くの場合、単一の責任または一連の責任を実装するために組み合わせられます。この記事では、項目と値で構成されるディクショナリをクエリおよび設定するためのメソッドを集めたクラスを作成します。

クラスは、関数や変数のセットと同様に、データや機能を整理する簡単な方法として直接使用できます。ただし、クラスを使用すると、その存在を無視できます。クラスを使用して、メモリ内に複数のインスタンスを生成できます。このようなインスタンスはオブジェクトと呼ばれます。各オブジェクトは、同じ関数セット (オブジェクト指向のコンテキストではメソッドと呼ばれます) と変数 (属性またはインスタンス変数と呼ばれます) にアクセスできますが、各変数の実際の値はオブジェクトごとに異なります。

ロールプレイング ゲームのユニット (戦車など) を考えてみましょう。クラスは、戦車の一連の変数 (防御能力と攻撃能力、射程距離、体力など) を設定できます。このクラスは、move() や Attack() などの一連の関数を定義することもできます。システムに戦車クラスが含まれている場合、そのクラスを使用して数十または数百の戦車オブジェクトを生成でき、それぞれが独自の健全性または範囲特性を持つ可能性があります。したがって、クラスはオブジェクトを生成するための設計図またはテンプレートです。

おそらく、クラスとオブジェクトを理解する最も簡単な方法は、クラスとオブジェクトを作成することです。

ファーストクラス
クラスは、class キーワードを使用して作成できます。最も単純なケースでは、クラスはキーワード クラス、名前、およびコード ブロックで構成されます。


class Dictionary {

}



クラス 名前には文字、数字、アンダースコア文字を任意に組み合わせて含めることができますが、数字で始めることはできません。

上記の例の Dictionary クラスは完全に合法ですが、用途は限られています。では、このクラスを使用してオブジェクトを作成するにはどうすればよいでしょうか?


$obj1 = 新しい辞書();
$obj2 = 新しい辞書();
$obj3 = 新しい辞書();



少なくとも形式的には、オブジェクトのインスタンス化は関数の呼び出しに似ています。関数呼び出しの場合は、括弧を指定する必要があります。関数と同様、一部のクラスではパラメータを渡す必要があります。 new キーワードも使用する必要があります。これにより、新しいオブジェクトをインスタンス化する必要があることが PHP エンジンに伝えられます。返されたオブジェクトは、将来使用するために変数に保存できます。

プロパティ
クラスの本体では、プロパティと呼ばれる特別な変数を宣言できます。 PHP V4 では、プロパティはキーワード var を使用して呼び出す必要があります。これは依然として正当な構文ですが、主に下位互換性を目的としています。 PHP V5 では、プロパティはパブリック、プライベート、または保護されていると宣言する必要があります。キーワードで見つけることができます: ここで少しプライバシーを確​​保できますか?これらの修飾子については、 を参照してください。ただし、この例ではすべてのプロパティを public として宣言します。リスト 1 は、2 つのプロパティを宣言するクラスを示しています。

リスト 1. 2 つのプロパティを宣言するクラス

class Dictionary {
???? public $translations = array();
???? En";
}



ご覧のとおり、プロパティの宣言と値の割り当てを同時に行うことができます。 print_r() 関数を使用すると、オブジェクトの状態を簡単に確認できます。リスト 2 は、Dictionary オブジェクトにさらに多くのメンバーが含まれていることを示しています。

リスト 2. Dictionary オブジェクトのリスト

$en = new Dictionary();
print_r( $en );??

このスクリプトを実行すると、次のオブジェクトへの出力が表示されます:

Dictionary Object
(
???? [translations] => Array
????????? (??? ??????? )

???? [type] =>
)


を使用できます演算子 -> パブリック オブジェクトのプロパティにアクセスします。したがって、$en->type は、$en によって参照される Dictionary オブジェクトの $type プロパティを表します。プロパティにアクセスできる場合は、その値を設定および取得できることを意味します。リスト 3 のコードは、Dictionary クラスのインスタンスを 2 つ作成します。つまり、2 つの Dictionary オブジェクトをインスタンス化します。これは、オブジェクトの $type 属性を変更し、2 つのオブジェクトの翻訳を追加します。

リスト 3. Dictionary クラスの 2 つのインスタンスの作成

$en = new Dictionary();
$ en->translations['TREE'] = "tree";

$fr = new Dictionary();
$fr->type = "Fr";
$fr- > ;translations['TREE'] = "arbre";

foreach ( array( $en, $fr ) as $dict ) {
??? print "type: {$dict-> ; type} ";
???? print "TREE: {$dict->translations['TREE']}n";
}



このスクリプト出力は次のとおりです


type: En TREE:tree
type: Fr TREE: arbre



したがって、Dictionary クラスがさらに便利になりました。単一のオブジェクトにさまざまなキーと値の組み合わせを格納でき、そのような辞書に関する詳細をクライアントに伝えるフラグがあります。

現在、Dictionary クラスは連想配列のラッパーにすぎませんが、オブジェクトの機能に関するいくつかのヒントがここにあります。リスト 4 に示すように、サンプル データを適切に表現できるようになりました。

リスト 4. サンプル データ

$en = array(
???? 'translations'=>array( 'TREE' => 'tree' ),
???? 'type'=>'En'
);

$fr = array(
???? 'translations'=>array( 'TREE' => ; 'arbre' ),
???? 'type'=>'Fr'
);



このデータ構造は辞書と同じ機能を果たしますクラスの目的はありますが、構造的な保証はありません。 Dictionary オブジェクトを渡すと、それに $translations プロパティがあることがわかります。しかし、リンクされたデータの場合、そのような保証はありません。このため、クエリを実行するコードが配列の起源を決定しない限り、 $fr['translations']['TREE']; のようなクエリは多少なりとも当たり外れが生じます。これがオブジェクトの本質です。オブジェクトの型はその特性を保証するものです。

オブジェクトを使用してデータを保存することには利点がありますが、それをまったく感じないかもしれません。オブジェクトは物である可能性がありますが、重要なのは、何かを行うこともできるということです。

メソッド
簡単に言えば、メソッドはクラス内で宣言された関数です。これらは通常 (常にではありませんが)、オブジェクト演算子を使用してオブジェクト インスタンスから呼び出されます。リスト 5 では、Dictionary クラスにメソッドを追加し、そのメソッドを呼び出します。

リスト 5. Dictionary クラスへのメソッドの追加

class Dictionary {
???? public $translations = array();
???? "En";

???? 関数 summary() {
????? $ret?? = "辞書タイプ: {$this->type}n"; 🎜>???????$ret .= "用語: ".count( $this->translations )."n";
????????? return $ret;
???? }
}

$en = new Dictionary();
$en->translations['TREE'] = "tree";
print $en - >summarize();



次の出力が提供されます:


辞書の種類: En
用語: 1



ご覧のとおり、summary() メソッドは、クラス内で宣言されることを除いて、他の関数と同じ方法で宣言されます。 summary() メソッドは、オブジェクト演算子を使用して Dictionary インスタンスから呼び出されます。 summary() 関数はプロパティにアクセスして、オブジェクトの状態の概要を提供します。

この記事では新しい機能が使用されていることに注意してください。 $this 疑似変数は、オブジェクトが独自のプロパティとメソッドを参照するためのメカニズムを提供します。オブジェクトの外部では、ハンドルを使用してその要素 (この場合は $en) にアクセスできます。オブジェクト内にはそのようなハンドルがないため、$this を使用する必要があります。 $this がわかりにくいと思われる場合は、コード内で $this が見つかった場合は常に、心の中で $this を現在のインスタンスに置き換えてみてください。

クラスは通常、ユニバーサル モデリング言語 (UML) を使用して図で表されます。 UML の詳細についてはこの記事の範囲を超えていますが、この図はクラスの関係を視覚化するのに適した方法です。図 1 は、UML で表現された Dictionary クラスを示しています。クラス名が上部、プロパティが中央、メソッドが下部にあります。


コンストラクター
PHP エンジンは多くの「マジック」メソッドを認識します。メソッドが定義されている場合、対応する状況が発生したときに PHP エンジンが自動的にメソッドを呼び出します。最も一般的に実装されるメソッドはコンストラクター メソッドです。 PHP エンジンは、オブジェクトをインスタンス化するときにコンストラクターを呼び出します。オブジェクトの基本的なセットアップ コードはすべてコンストラクターに配置されます。 PHP V4 では、クラスと同じ名前のメソッドを宣言することでコンストラクターが作成されます。 V5 では、__construct() というメソッドを宣言する必要があります。リスト 6 は、DictionaryIO オブジェクトを必要とするコンストラクターを示しています。

リスト 6. DictionaryIO オブジェクトを必要とするコンストラクター

class Dictionary {
???? public $translations = array();
???? 🎜>???? public $dictio;

???? function __construct( $type, DictionaryIO $dictio ) {
????type = $type ;
???????$this->dictio=$dictio;
???? }

???? //...



Dictionary オブジェクトをインスタンス化するには、型文字列と DictionaryIO オブジェクトをそのコンストラクターに渡します。コンストラクターはこれらのパラメーターを使用して独自のプロパティを設定します。次のコードは、Dictionary オブジェクトをインスタンス化する方法を示しています。


$en = new Dictionary( "En", new DictionaryIO() );



辞書クラスが以前より安全になりました。すべての Dictionary オブジェクトは、必要なパラメータで初期化されています。

もちろん、後で誰かが $type 属性を変更したり、$dictio を空に設定したりすることを妨げるものは何もありません。良いニュースとしては、PHP V5 がこの機能の実現に役立つということです。

キーワード: ここで少しプライバシーを保ってもいいですか?
プロパティ宣言に関連する公開キーワードについては前に見てきました。このキーワードは属性の可視性を表します。実際、プロパティの可視性はパブリック、プライベート、保護に設定できます。 public として宣言されたプロパティは、クラスの外部から読み書きできます。private として宣言されたプロパティは、オブジェクトまたはクラスのコンテキストでのみ表示されます。 protected として宣言されたプロパティは、現在のクラスとそのサブクラスのコンテキスト内でのみ表示されます。 (これは「継承」セクションで実際に動作しているのがわかります。) プライベート プロパティを使用してクラスを実際にロックダウンすることができます。プロパティをプライベートとして宣言し、クラス スコープの外からアクセスしようとすると (リスト 7 を参照)、PHP エンジンは致命的なエラーをスローします。

リスト 7. クラス スコープ外からプロパティにアクセスしようとする

class Dictionary {
??? private $translations = array();
???? dictio ;
???? private $type;

???? function __construct( $type, DictionaryIO $dictio ) {
????? = $type;
??????? $this->dictio = $dictio;
???? }

???? // ...
}

$en = new Dictionary( "En", new DictionaryIO() );
$en->dictio = null;



出力は次のとおりです次のように:


致命的なエラー: プライベート プロパティにアクセスできません
Dictionary::$dictio in...



一般的に、ほとんどのプロパティは次のようになります。これらをプライベートとして宣言し、必要に応じてこれらのプロパティを取得および設定するためのメソッドを提供します。これにより、クラスのインターフェイスを制御したり、一部のデータを読み取り専用にしたり、パラメーターをプロパティに割り当てる前にパラメーターをサニタイズまたはフィルターしたり、オブジェクトと対話するための明確なルール セットを提供したりすることができます。

メソッドの可視性を変更する方法は、プロパティの可視性を変更する方法と同じです。つまり、メソッド宣言に public、private、または protected を追加します。クラスが外部に知られる必要のないハウスキーピング メソッドを使用する必要がある場合、そのクラスをプライベートとして宣言できます。リスト 8 の get() メソッドは、Dictionary クラスのユーザーに翻訳を取得するためのインターフェースを提供します。このクラスはすべてのクエリを追跡する必要があるため、プライベート メソッド logQuery() が提供されています。

リスト 8. get() メソッドは、Dictionary クラスのユーザーにインターフェースを提供します。

function get( $term ) {
$value = $this-> ;translations [$term];
???? $this->logQuery( $term, $value, "get" );
???? return $value;
}

private function logQuery( $term, $value, $kind ) {
???? // ログ情報を書き込みます
}



logQuery() を宣言しますprivate パブリック インターフェイスが簡素化され、クラスが logQuery() を不適切に呼び出すことがなくなります。プロパティと同様に、含まれているクラスの外部からプライベート メソッドを呼び出そうとすると、致命的なエラーが発生します。

クラス コンテキストでの操作
これまで見てきたメソッドとプロパティはすべて、オブジェクト コンテキストで動作します。つまり、$this 疑似変数または標準変数に格納されているオブジェクト参照を通じてメソッドやプロパティにアクセスするには、オブジェクト インスタンスを使用する必要があります。場合によっては、オブジェクト インスタンスではなくクラスを通じてプロパティやメソッドにアクセスする方が便利な場合があります。このようなクラス メンバーは静的メンバーと呼ばれます。

静的プロパティを宣言するには、キーワード static を可視性修飾子の後、プロパティ変数の直前に配置します。

次の例は、単一の静的プロパティ $iodir を示しています。これは、辞書データの保存と読み取りに使用されるデフォルト ディレクトリへのパスを保持します。このデータはすべてのオブジェクトで同じであるため、すべてのインスタンスで使用できるようにするのが合理的です。

リスト 9. 単一の静的 $iodir 属性

class Dictionary {
???? public static $iodir=".";
???? // .. .
}



静的プロパティには、二重コロン (::) で構成される範囲解決演算子を使用してアクセスできます。スコープ解決演算子は、クラス名とアクセスする静的プロパティの間に配置する必要があります。


print Dictionary::$iodir . "n";
Dictionary::$iodir = "/tmp";



見たとおり、このプロパティにアクセスするために Dictionary オブジェクトをインスタンス化する必要はありません。

静的メソッドを宣言してアクセスするための構文はこれに似ています。繰り返しますが、static キーワードは可視性修飾子の後に配置する必要があります。リスト 10 は、プライベートとして宣言された $iodir プロパティにアクセスする 2 つの静的メソッドを示しています。

リスト 10. $iodir プロパティにアクセスする 2 つの静的メソッド

class Dictionary {
???? private static $iodir=".";
???? // ...
???? public static function setSaveDirectory( $dir ) {
??????? if ( ! is_dir( $dir ) ||
?????? ? ??????? ! is_writable( $dir ) ) {
???????????? 戻り値;
????????? }
?? ?????? self::$iodir;
?? }

???? ?? return self::$iodir;
???? // ...
}



$ iodir 属性ディレクトリにアクセスする時間が長くなります。プロパティにアクセスするための特別なメソッドを作成することで、提供される値が正しいことを確認できます。この場合、メソッドは、割り当てを行う前に、指定された文字列が書き込み可能なディレクトリを指していることを確認します。

どちらのメソッドも、$iodir プロパティを参照するためにキーワード self とアクセス解決演算子を使用することに注意してください。 $this は現在のオブジェクト インスタンスへの参照であるため、静的メソッドで $this を使用することはできませんが、静的メソッドはオブジェクトではなくクラスを通じて呼び出されます。 PHP エンジンが静的メソッドで $this を認識すると、致命的なエラーとメッセージがスローされます。

クラスの外部から静的メソッドを呼び出すには、クラス名にスコープ リゾルバーとメソッド名を加えたものを使用します。


Dictionary::setSaveDirectory("/tmp");
print Dictionary::getSaveDirectory();



必要な静的メソッドが 2 つあります。使用される重要な理由。まず、ユーティリティ操作では、そのジョブを実行するためにオブジェクト インスタンスが必要ない場合があります。静的として宣言すると、クライアント コードでオブジェクトを作成する手間が省けます。 2 番目に、静的メソッドはグローバルに利用可能です。これは、すべてのオブジェクト インスタンスにアクセスできる値を設定できることを意味し、静的メソッドはシステム上の重要なデータを共有するための優れた方法になります。

静的プロパティは通常、他のものによる干渉を防ぐためにプライベートとして宣言されますが、定数を宣言することで、読み取り専用の静的スコープのプロパティを作成する方法があります。グローバル プロパティと同様、クラス定数は一度定義すると変更できません。これはステータス フラグや、pi やアフリカのすべての国など、プロセスの存続期間中に変更されないものに使用されます。

const キーワードを使用してクラス定数を宣言します。たとえば、Dictionary オブジェクトの実際の実装にはほぼ確実にその背後にデータベースがあるため、用語と翻訳には最大長があると想定することもできます。リスト 11 では、これをクラス定数として設定します。

リスト 11. MAXLENGTH をクラス定数として設定する

class Dictionary {
???? const MAXLENGTH = 250;
???? // ...
}

print Dictionary::MAXLENGTH;



クラス定数は常に public であるため、visibility キーワードは使用できません。その値を変更しようとすると解析エラーが発生するため、これは問題ではありません。また、通常のプロパティとは異なり、クラス定数はドル記号で始まらないことにも注意してください。

継承
オブジェクト指向プログラミングに精通している人なら、私が常に最善のものを最後に取っておくことがわかるでしょう。クラスとクラスが生成する動的オブジェクト間の関係により、システムはより柔軟になります。たとえば、各 Dictionary オブジェクトは翻訳データの異なるコレクションをカプセル化しますが、これらの異なるエンティティのモデルは単一の Dictionary クラスで定義されます。

しかし、クラスレベルの違いに注意する必要がある場合もあります。 DictionaryIO クラスを覚えていますか?要約すると、Dictionary オブジェクトからデータを取得し、ファイル システムに書き込み、ファイルからデータを取得して、Dictionary オブジェクトにマージし直します。リスト 12 は、シリアル化を使用して辞書データを保存およびロードする簡単な実装を示しています。

リスト 12. シリアル化を使用した簡単な実装

class Dictionary {
???? // ...

???? function asArray() {
??????? return $this->translations;
?? }

???? 関数 getType() {
???? ? return $this->type;
???? }

???? $this-> ;dictio-> ;export( $this );
???? }

???? 関数 import() {
??????? $this->import; ( $this );
???? }
}

class DictionaryIO {

???? 関数パス( Dictionary $dictionary, $ext ) {
???????$path?? = Dictionary::getSaveDirectory();
??????$path .= DIRECTORY_SEPARATOR;
??????? = $dictionary->getType().".$ext";
??????? return $path;
???? 関数エクスポート( Dictionary $dictionary ) {
????????? $translations = $dictionary->asArray();
??????? file_put_contents( $ this->path(
????????????????????????$dictionary, 'serial'),
????serialize( $translations ) );? ?
???? }

???? 関数 import( Dictionary $dictionary ) {
?????? $path = $this->path( $dictionary, 'serial' );
??????? if ( ! is_file( $path ) ) return false; ?????????????? file_get_contents( $path ) );
????????? foreach ( $translations as $term => $trans ) {
?????????$ Dictionary->set( $term, $trans );
????????? }
???? >}

$dict = new Dictionary( " En", new DictionaryIO() );
$dict->set( "TREE", "tree" );
$dict-> ;export();



この例では、2 つの単純な Dictionary メソッドを紹介します。具体的には、asArray() は $translations 配列のコピーを返します。 DictionaryIO の実装には、単純さという利点があります。サンプル コードではエラー チェックが省略されることが多いため、それでも、これはデータをファイルに保存するための迅速かつ簡単な方法です。

このようなライブラリがデプロイされたら、その保存形式をすぐにサポートする必要があります。この形式を廃止すると、この方法でバックアップを保存するユーザーの希望に反することになります。しかし、要件は変化しており、出力形式がユーザーにとって編集しにくいという苦情を受けることもあります。これらのユーザーは、エクスポート ファイルを XML 形式でサードパーティに送信したいと考えています。

今、私たちは問題に直面しています。 DictionaryIO インターフェイスで両方の形式をサポートするにはどうすればよいですか?

解決策の 1 つは、リスト 13 に示すように、export() メソッドと import() メソッドで条件文を使用して型フラグをテストすることです。

リスト 13.export() メソッドと import() メソッドでの条件付きステートメントの使用

function export( Dictionary $dictionary ) {
??? if ( $this-> type == DictionaryIO::SERIAL ) {
???? // シリアル化されたデータを書き込みます
???? } else if ( $this->type == DictionaryIO::XML ) {
??????? // XML データを書き込みます
???? }
}

function import( Dictionary $dictionary ) {
??? >type == DictionaryIO::SERIAL ) {
??????? // シリアル化されたデータを読み取ります
???? } else if ( $this->type == DictionaryIO::XML ) {
??????? // XML データを読み取ります
???? }
}



この構造は悪い「コード」の例です匂い」はコピーに依存しているためです。 1 か所で変更を加えると (たとえば、新しい型テストを追加する)、他の場所でも対応する一連の変更が必要になります (他の型テストをラインに組み込む) ため、コードはすぐにエラーが発生しやすくなり、読みにくくなります。

継承は、より洗練されたソリューションを提供します。DictionaryIO によって設定されたインターフェイスを継承しながら、その機能の一部をオーバーライドする新しいクラス XmlDictionaryIO を作成することができます。

サブクラスを作成するには、extends キーワードを使用します。 XmlDictionaryIO クラスの最小限の実装は次のとおりです。


XmlDictionaryIO extends DictionaryIO {
}



XmlDictionaryIO は DictionaryIO とまったく同じように機能するようになりました。 DictionaryIO からすべてのパブリック (および保護された) プロパティを継承するため、DictionaryIO オブジェクトに適用されるのと同じ操作を XmlDictionaryIO オブジェクトに適用できます。この関係はオブジェクトの種類にも及びます。 XmlDictionaryIO オブジェクトは明らかに XmlDictionaryIO クラスのインスタンスですが、DictionaryIO のインスタンスでもあります。同様に、一般化された順序では、人は同時に人間、哺乳類、動物でもあります。これをテストするには、instanceof 演算子を使用します。この演算子は、オブジェクトが指定されたクラスのメンバーである場合に true を返します (リスト 14 を参照)。

リスト 14.instanceof 演算子を使用した継承のテスト

$dictio = new XmlDictionaryIO();
if ( $dictioinstanceof XmlDictionaryIO ) {
???? XmlDictionaryIOn のインスタンス";
}

if ( $dictioinstanceof DictionaryIO ) {
???? print "オブジェクトは DictionaryIOn のインスタンスです";
}



出力は次のとおりです。


オブジェクトは XmlDictionaryIO のインスタンスです
オブジェクトは DictionaryIO のインスタンスです



instanceof は $dictio を受け入れます。これは DictionaryIO オブジェクトであるため、メソッドはこれらのオブジェクトもパラメータとして受け入れます。これは、DictionaryIO がコンストラクターのシグネチャで指定された型であっても、XmlDictionaryIO オブジェクトを Dictionary クラスのコンストラクターに渡すことができることを意味します。

リスト 15 は、DOM を使用して XML 機能を完成させる、手早く汚い XmlDictionaryIO 実装です。

リスト 15. XmlDictionaryIO の実装

class XmlDictionaryIO extends DictionaryIO {

??? function export( Dictionary $dictionary ) {
??????? ? $translations = $dictionary->asArray();
????????? $doc = new DOMDocument("1.0");
??????$dic_el = $ doc ->createElement( "dictionary" );
??????$doc->appendChild( $dic_el );
?????? foreach ( $translations as $ key => $val ) {
????????? $term_el = $doc->createElement( "term" );
????????? $ dic_el->appendChild( $term_el );
????????? $key_el = $doc->createElement("key", $key );
???? ?????????? $val_el = $doc->createElement(
?????????????????? "value" , $val );
?????????$term_el->appendChild( $key_el );
?????????$term_el-> ;appendChild( $val_el );
? ?????????? }
??????? file_put_contents( $this->path(
????????? ?????????? ?????$dictionary, 'xml')、
?????????????????? $doc->saveXML( );
???? }

???? 関数 import( Dictionary $dictionary ) {
???? $path( $dictionary, 'xml');
?????? if ( ! is_file( $path ) ) return false;
???? $doc = DOMDocument::loadXML(
???????????? file_get_contents( $path ) );
????????? $termlist = $doc
?????????? ->getElementsByTagName( "term" );
????????? foreach ( $termlist as $term ) {
??????? ???? $key = $term->getElementsByTagName( "key" )
???????????? ->item( 0 )->ノード値;
????????? $val = $term
????????? ->getElementsByTagName( " value" )
??????????????? ->item( 0 )->nodeValue;
????????? $dictionary-> set( $key, $val );
????????? }
?? }



XML の生成についてはもちろんカバーされています。これを行うには、素晴らしい SimpleXML 拡張機能など、さまざまな方法があります。つまり、import() メソッドは XML ドキュメントをパラメータとして受け取り、それを使用して Dictionary オブジェクトを設定します。 import() メソッドは、Dictionary オブジェクトからデータを取得し、XML ファイルに書き込みます。 (現実の世界では、XLIFF と呼ばれる XML ベースの形式が使用される場合があります。これは、サードパーティの翻訳ツールへのインポートに適しています。)

import() と export() はどちらもユーティリティ メソッド path を呼び出すことに注意してください。 () の場合、このメソッドは XmlDictionaryIO クラスに存在しません。ただし、Path() は DictionaryIO に実装されているため、問題はありません。 XmlDictionaryIO がメソッドを実装する場合、メソッドが呼び出されたときに、その実装が XmlDictionaryIO オブジェクトに対して呼び出されます。実装が存在しない場合、呼び出しは失敗し、親クラスに返されます。


まとめ
紙面の都合上、全てを紹介することはできません。さらなる研究には、幅広さと深さという 2 つの方向性があります。幅とは、抽象クラス、インターフェイス、イテレータ インターフェイス、リフレクション、例外、オブジェクト レプリケーションなど、この記事の範囲を超えている機能を指します。深さは設計上の問題を指します。 PHP でのオブジェクト指向プログラミングに利用できるツールの範囲を理解することは重要ですが、これらの機能を最適に使用する方法を検討することも同様に重要です。幸いなことに、オブジェクト指向のコンテキストでの設計パターンを特にカバーするリソースが多数あります

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

修正: Windows 11 で Snipping ツールが機能しない 修正: Windows 11 で Snipping ツールが機能しない Aug 24, 2023 am 09:48 AM

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

iPhoneでApp Storeに接続できないエラーを修正する方法 iPhoneでApp Storeに接続できないエラーを修正する方法 Jul 29, 2023 am 08:22 AM

パート 1: 最初のトラブルシューティング手順 Apple のシステムステータスを確認する: 複雑な解決策を掘り下げる前に、基本から始めましょう。問題はデバイスにあるのではなく、Apple のサーバーがダウンしている可能性があります。 Apple のシステム ステータス ページにアクセスして、AppStore が適切に動作しているかどうかを確認してください。問題があれば、Apple が修正してくれるのを待つしかありません。インターネット接続を確認します。「AppStore に接続できません」問題は接続不良が原因である場合があるため、安定したインターネット接続があることを確認してください。 Wi-Fi とモバイル データを切り替えるか、ネットワーク設定をリセットしてみてください ([一般] > [リセット] > [ネットワーク設定のリセット] > [設定])。 iOS バージョンを更新します。

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

C# の Dictionary.Clear 関数を使用して辞書内のすべての要素をクリアします C# の Dictionary.Clear 関数を使用して辞書内のすべての要素をクリアします Nov 18, 2023 pm 01:31 PM

C# で Dictionary.Clear 関数を使用して、辞書内のすべての要素をクリアします。辞書 (辞書) は、C# で一般的に使用されるデータ構造の 1 つです。データの処理と保存に関しては、辞書は要素を検索、挿入、削除するための高速かつ効率的な方法を提供します。 C# の Dictionary クラスは、キーと値のペアを使用してデータを格納する汎用クラスです。実際の開発では、データを再処理するために辞書内のすべての要素をクリアする必要があることがよくあります。

watch4proとGTのどちらが優れていますか? watch4proとGTのどちらが優れていますか? Sep 26, 2023 pm 02:45 PM

Watch4proとgtはそれぞれ特徴や適用シーンが異なりますが、総合的な機能、高性能、スタイリッシュな外観を重視し、価格は高くてもいいという方にはWatch 4 Proの方が適しているかもしれません。高度な機能要件はなく、バッテリー寿命と手頃な価格を重視する場合は、GT シリーズの方が適しているかもしれません。最終的な選択は、個人のニーズ、予算、好みに基づいて決定する必要がありますが、購入する前に自分のニーズを慎重に検討し、さまざまな製品のレビューや比較を参照して、より情報に基づいた選択を行うことをお勧めします。

iPadOS 17.4 で iPad のバッテリー寿命を最適化する方法 iPadOS 17.4 で iPad のバッテリー寿命を最適化する方法 Mar 21, 2024 pm 10:31 PM

iPadOS 17.4 で iPad のバッテリー寿命を最適化する方法 バッテリー寿命の延長はモバイル デバイス エクスペリエンスの鍵であり、iPad がその良い例です。 iPad のバッテリーの消耗が早すぎると感じても、心配しないでください。iPadOS 17.4 には、デバイスの実行時間を大幅に延長できるトリックや微調整が多数あります。この詳細なガイドの目的は、情報を提供するだけではなく、iPad の使用方法を変え、全体的なバッテリー管理を強化し、充電せずにデバイスをより長く使用できるようにすることです。ここで概説したプラクティスを採用することで、個人のニーズや使用パターンに合わせてテクノロジーをより効率的かつ意識的に使用するための一歩を踏み出すことができます。主要なエネルギー消費者を特定する

Guan Zeyuanjiang Shuying が Huawei MateBook GT 14 を体験: テクノロジーとアートの完璧な組み合わせ Guan Zeyuanjiang Shuying が Huawei MateBook GT 14 を体験: テクノロジーとアートの完璧な組み合わせ Aug 10, 2024 pm 09:51 PM

8月8日、Huawei端末はHuawei MateBook GT14「Super Starlight Show」を正式に発売しました。有名な俳優の江淑英とリーグ・オブ・レジェンドプロフェッショナルリーグの公式解説者グアン・ゼユアンがライブブロードキャストルームのゲストとして登場し、ファーウェイの最新ノートブックであるHuawei MateBook GT14を個人的に体験しました。生放送中、Jiang ShuyingとGuan ZeyuanはHuawei MateBook GT14を大いに賞賛しました。 CNMOは、生放送中に江秀英氏、関澤源氏、ファーウェイのPC製品ライン社長がファーウェイMateBook GT14の分解を目撃したことに気づいた。 Huawei MateBook GT14の内部設計は非常に整っていて、高密度マザーボード設計を採用していることがわかります。マザーボードもキーボードから遠ざけるために部分的に沈んでいます。これです

See all articles