PHP でコードの再利用を実現する方法 特性の新機能、特性の新機能_PHP チュートリアル
PHP は、コードの再利用を実現する方法です。新しい機能、新しい機能
yii2のソースコードを読んでいるときにtraitに出会ったので、勉強して記録としてブログを書きました。
PHP 5.4.0 以降、PHP は traits と呼ばれるコード再利用の方法を実装しています。
Traits は、PHP のような単一継承言語用に用意されたコード再利用メカニズムです。トレイトは、単一継承言語の制約を軽減し、開発者が異なる階層内の独立したクラスでメソッド セットを自由に再利用できるように設計されています。特性とクラス構成のセマンティクスは、複雑さを軽減し、従来の多重継承とミックスインに関連する典型的な問題を回避する方法を定義します。
Trait はクラスに似ていますが、きめ細かく一貫した方法で機能を組み合わせるようにのみ設計されています。特性を単独でインスタンス化することはできません。これは、従来の継承に水平機能の組み合わせを追加します。つまり、アプリケーション クラスのメンバーを継承する必要がありません。
特性の例
特性 ezcReflectionReturnInfo {
関数 getReturnType() { /*1*/ }
関数 getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
ezcReflectionReturnInfo を使用します;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
ezcReflectionReturnInfo を使用します;
/* ... */
}
?>
優先
基本クラスから継承されたメンバーは、トレイトによって挿入されたメンバーによってオーバーライドされます。優先順位は、現在のクラスのメンバーがトレイトのメソッドをオーバーライドし、トレイトが継承されたメソッドをオーバーライドすることです。
優先順位付けの例
クラスベース{
パブリック関数sayHello() {
エコー「こんにちは」;
}
}
特性 SayWorld {
パブリック関数sayHello() {
parent::sayHello();
エコー「ワールド!」;
}
}
class MyHelloWorld extends Base {
SayWorld を使用します;
}
$o = 新しい MyHelloWorld();
$o->sayHello();
?>
上記のルーチンは次のように出力します: Hello World!
基本クラスから継承されたメンバーは、挿入された SayWorld トレイトの SayHello メソッドによってオーバーライドされます。その動作は、MyHelloWorld クラスで定義されたメソッドと一致しています。優先順位としては、現在のクラスのメソッドが特性メソッドをオーバーライドし、特性メソッドが基本クラスのメソッドをオーバーライドします。
優先順位の別の例
特性 HelloWorld {
パブリック関数sayHello() {
「Hello World!」をエコーします;
}
}
クラス TheWorldIsNotEnough {
HelloWorld を使用してください;
パブリック関数sayHello() {
echo 'Hello Universe!';
}
}
$o = 新しいTheWorldIsNotEnough();
$o->sayHello();
?>
上記のルーチンは次のように出力します: Hello Universe!
複数の特徴
カンマで区切って use ステートメントに複数の特性をリストすると、それらをクラスに挿入できます。
複数の特性の使用例
特性 こんにちは{
パブリック関数sayHello() {
エコー「こんにちは」;
}
}
特性ワールド{
パブリック関数 SayWorld() {
エコー「ワールド」;
}
}
クラス MyHelloWorld {
Hello, World を使用します。
パブリック関数sayExclamationMark() {
エコー「!」;
}
}
$o = 新しい MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
上記のルーチンは次のように出力します: Hello World!
紛争解決
2 つのトレイトが同じ名前のメソッドを挿入した場合、競合が明示的に解決されないと致命的なエラーが発生します。
同じクラス内の複数のトレイトの名前の競合を解決するには、 replaceof 演算子を使用して、競合するメソッドのどれを使用するかを明示的に指定する必要があります。
上記のメソッドでは、他のメソッドを除外することのみが可能です。as 演算子は、競合するメソッドの 1 つを別の名前で導入できます。
紛争解決の例
特性 A {
パブリック関数 smallTalk() {
エコー「a」;
}
パブリック関数 bigTalk() {
エコー「A」;
}
}
特性 B {
パブリック関数 smallTalk() {
エコー「b」;
}
パブリック関数 bigTalk() {
エコー「B」;
}
}
クラストーカー{
A、Bを使用します{
A;
の代わりに B::smallTalk B;
の代わりに A::bigTalk }
}
クラス Aliased_Talker {
A、Bを使用します{
A;
の代わりに B::smallTalk B;
の代わりに A::bigTalk B::bigTalk をトークとして;
}
}
?>
この例では、トーカーは特性 A と B を使用します。 A と B は競合するメソッドを持っているため、トレイト B の smallTalk とトレイト A の bigTalk を使用することを定義します。
Aliased_Talker は、as 演算子を使用して、トークを B の bigTalk のエイリアスとして定義します。
メソッドのアクセス制御を変更する
as 構文を使用して、メソッドのアクセス制御を調整することもできます。
メソッドアクセス制御の変更例
特性 HelloWorld {
パブリック関数sayHello() {
「Hello World!」をエコーします;
}
}
//sayHello
のアクセス制御を変更します クラス MyClass1 {
HelloWorld {sayHello を保護として使用します。 }
//アクセス制御を変更するエイリアスをメソッドに与えます
// 元のsayHelloのアクセス制御は変更されていません
クラス MyClass2 {
HelloWorld {sayHello をプライベート myPrivateHello として使用します
; }
?>
特性から特性を作成する
特性から特性を形成する例
パブリック関数sayHello() {
エコー「こんにちは」;
}
}
特性ワールド{
パブリック関数 SayWorld() {
エコー「ワールド!」;
}
}
特性 HelloWorld {
Hello, World を使用します。
}
クラス MyHelloWorld {
HelloWorld を使用してください;
}
$o = 新しい MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
Traitの抽象メンバー
抽象メソッドを使用して要件を強制する例を示します
特性 こんにちは{
パブリック関数sayHelloWorld() {
echo 'Hello'.$this->getWorld();
}
抽象パブリック関数 getWorld();
}
クラス MyHelloWorld {
プライベート $world;
こんにちはを使用してください;
パブリック関数 getWorld() {
return $this->world;
}
パブリック関数 setWorld($val) {
$this->world = $val;
}
}
?>
Trait の静的メンバー
特性は静的メンバーと静的メソッドによって定義できます。
静的変数の例
特性カウンター{
パブリック関数 inc() {
静的 $c = 0;
$c = $c + 1;
echo "$cn";
}
}
クラス C1 {
カウンターを使用する;
}
クラス C2 {
カウンターを使用する;
}
$o = new C1() $o->inc(); // エコー 1
; $p = new C2(); // エコー 1
; ?>
静的メソッドの例
特性 StaticExample {
パブリック静的関数 doSomething() {
return '何かをしています';
}
}
クラスの例 {
StaticExample を使用します;
}
例::doSomething();
?>
静的変数と静的メソッドの例
特性カウンター{
パブリック静的 $c = 0;
パブリック静的関数 inc() {
self::$c = self::$c + 1;
echo self::$c . "n";
}
}
クラス C1 {
カウンターを使用する;
}
クラス C2 {
カウンターを使用する;
}
C1::inc() // エコー 1
; C2::inc() // エコー 1
; ?>
プロパティ
特性によってプロパティを定義することもできます。
属性の定義例
特性プロパティTrait {
パブリック $x = 1;
}
class PropertiesExample {
PropertiesTrait を使用します;
}
$example = 新しいプロパティの例;
$example->x;
?>
トレイトがプロパティを定義する場合、クラスは同じ名前のプロパティを定義できません。定義しない場合はエラーが生成されます。クラス内のプロパティの定義が特性内の定義と互換性がある (可視性と初期値が同じ) 場合、エラー レベルは E_STRICT であり、そうでない場合は致命的エラーです。
競合の例
特性プロパティTrait {
パブリック $same = true;
パブリック $異なる = false;
}
class PropertiesExample {
PropertiesTrait を使用します;
パブリック $same = true // 厳格な基準
; Public $ Different = true // 致命的なエラー
; }
?>
使用上の違い
さまざまな使用例
名前空間 FooBar;
use FooTest; // FooTest を意味します - イニシャルはオプションです
?>
名前空間 FooBar;
クラス SomeClass {
FooTest を使用します。 // は FooBarFooTest を意味します。 }
?>
最初の使用法は名前空間に FooTest を使用し、FooTest が見つかります。2 番目の使用法はトレイトを使用することで、FooBarFooTest が見つかります。
__CLASS__ と __TRAIT__
__CLASS__ は使用トレイトのクラス名を返し、__TRAIT__ はトレイト名を返します
例は以下の通りです
特性 TestTrait {
パブリック関数 testMethod() {
echo "クラス: " . PHP_EOL;
echo "トレイト: " . __TRAIT__ . }
}
クラスBaseClass {
TestTrait を使用します;
}
クラス TestClass は BaseClass を拡張します {
}
$t = 新しい TestClass();
$t->testMethod();
//クラス: BaseClass
// 特性: TestTrait
トレイトシングルトン
/**
* プライベート構造体、通常はクラスを使用して定義されます
*/
//プライベート関数 __construct() {}
パブリック静的関数 getInstance() {
static $_instance = NULL;
$class = __CLASS__;
return $_instance ?: $_instance = new $class;
}
パブリック関数 __clone() {
trigger_error('「.__CLASS__.」のクローン作成は許可されていません。',E_USER_ERROR);
}
パブリック関数 __wakeup() {
trigger_error('「.__CLASS__.」のシリアル化解除は許可されていません。',E_USER_ERROR);
}
}
/**
*使用例
*/
クラス foo {
シングルトンを使用します;
プライベート関数 __construct() {
$this->name = 'foo';
}
}
クラスバー{
シングルトンを使用します;
プライベート関数 __construct() {
$this->name = 'bar';
}
}
$foo = foo::getInstance();
echo $foo->name;
$bar = bar::getInstance();
echo $bar->name;
特性メソッドを呼び出す
明らかではありませんが、Traitメソッドを通常のクラスで静的メソッドとして定義できれば呼び出すことができます例は以下の通りです
関数バー() {
'baz' を返します
}
}
echo Foo::bar(),"\n"; ?>
http://www.bkjia.com/PHPjc/959108.html

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPにより、インタラクティブなWebコンテンツを簡単に作成できます。 1)HTMLを埋め込んでコンテンツを動的に生成し、ユーザー入力またはデータベースデータに基づいてリアルタイムで表示します。 2)プロセスフォームの提出と動的出力を生成して、XSSを防ぐためにHTMLSPECIALCHARSを使用していることを確認します。 3)MySQLを使用してユーザー登録システムを作成し、Password_HashおよびPreprocessingステートメントを使用してセキュリティを強化します。これらの手法を習得すると、Web開発の効率が向上します。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

Dreamweaver Mac版
ビジュアル Web 開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール
