Rumah >pembangunan bahagian belakang >tutorial php >Penerangan terperinci corak penyesuai PHP (dengan contoh kod)
Artikel ini membawakan anda pengetahuan yang berkaitan tentang PHP terutamanya mengenai mod penyesuai PHP dan contoh kod. Saya harap ia dapat membantu anda.
Penjelasan corak penyesuai PHP dan contoh kod
Penyesuai ialah Corak reka bentuk struktur, yang membolehkan objek yang tidak serasi bekerjasama antara satu sama lain.
Penyesuai boleh bertindak sebagai pembungkus antara dua objek Ia akan menerima panggilan ke satu objek dan menukarnya kepada format dan antara muka yang dikenali oleh objek lain.
Kerumitan: ******
Populariti: ******
Penggunaan Contoh: Corak Penyesuai adalah sangat biasa dalam kod PHP. Sistem berdasarkan beberapa kod warisan sering menggunakan corak ini. Dalam kes ini, penyesuai membenarkan kod warisan berfungsi dengan kelas moden.
Kaedah pengenalan: Penyesuai boleh dikenal pasti melalui pembina yang mengambil contoh jenis abstrak atau antara muka yang berbeza sebagai parameter. Apabila mana-mana kaedah penyesuai dipanggil, ia menukar parameter ke dalam format yang sesuai dan kemudian mengarahkan panggilan ke satu atau lebih kaedah dalam objek pengekapannya.
Penyesuai membenarkan anda menggunakan kelas daripada sistem pihak ketiga atau warisan, walaupun ia tidak serasi dengan kod anda. Sebagai contoh, anda boleh membuat satu siri pembalut khas untuk menyesuaikan panggilan yang dibuat oleh aplikasi kepada antara muka dan format yang diperlukan oleh kelas pihak ketiga, tanpa perlu menulis semula antara muka pemberitahuan aplikasi untuk menyokong setiap perkhidmatan pihak ketiga ( Seperti DingTalk, WeChat, SMS atau sebarang perkhidmatan lain).
index.php: Contoh dunia sebenar
<?php namespace RefactoringGuru\Adapter\RealWorld; /** * The Target interface represents the interface that your application's classes * already follow. */ interface Notification { public function send(string $title, string $message); } /** * Here's an example of the existing class that follows the Target interface. * * The truth is that many real apps may not have this interface clearly defined. * If you're in that boat, your best bet would be to extend the Adapter from one * of your application's existing classes. If that's awkward (for instance, * SlackNotification doesn't feel like a subclass of EmailNotification), then * extracting an interface should be your first step. */ class EmailNotification implements Notification { private $adminEmail; public function __construct(string $adminEmail) { $this->adminEmail = $adminEmail; } public function send(string $title, string $message): void { mail($this->adminEmail, $title, $message); echo "Sent email with title '$title' to '{$this->adminEmail}' that says '$message'."; } } /** * The Adaptee is some useful class, incompatible with the Target interface. You * can't just go in and change the code of the class to follow the Target * interface, since the code might be provided by a 3rd-party library. */ class SlackApi { private $login; private $apiKey; public function __construct(string $login, string $apiKey) { $this->login = $login; $this->apiKey = $apiKey; } public function logIn(): void { // Send authentication request to Slack web service. echo "Logged in to a slack account '{$this->login}'.\n"; } public function sendMessage(string $chatId, string $message): void { // Send message post request to Slack web service. echo "Posted following message into the '$chatId' chat: '$message'.\n"; } } /** * The Adapter is a class that links the Target interface and the Adaptee class. * In this case, it allows the application to send notifications using Slack * API. */ class SlackNotification implements Notification { private $slack; private $chatId; public function __construct(SlackApi $slack, string $chatId) { $this->slack = $slack; $this->chatId = $chatId; } /** * An Adapter is not only capable of adapting interfaces, but it can also * convert incoming data to the format required by the Adaptee. */ public function send(string $title, string $message): void { $slackMessage = "#" . $title . "# " . strip_tags($message); $this->slack->logIn(); $this->slack->sendMessage($this->chatId, $slackMessage); } } /** * The client code can work with any class that follows the Target interface. */ function clientCode(Notification $notification) { // ... echo $notification->send("Website is down!", "<strong style='color:red;font-size: 50px;'>Alert!</strong> " . "Our website is not responding. Call admins and bring it up!"); // ... } echo "Client code is designed correctly and works with email notifications:\n"; $notification = new EmailNotification("developers@example.com"); clientCode($notification); echo "\n\n"; echo "The same client code can work with other classes via adapter:\n"; $slackApi = new SlackApi("example.com", "XXXXXXXX"); $notification = new SlackNotification($slackApi, "Example.com Developers"); clientCode($notification);
Output.txt: Hasil pelaksanaan
Client code is designed correctly and works with email notifications: Sent email with title 'Website is down!' to 'developers@example.com' that says '<strong style='color:red;font-size: 50px;'>Alert!</strong> Our website is not responding. Call admins and bring it up!'. The same client code can work with other classes via adapter: Logged in to a slack account 'example.com'. Posted following message into the 'Example.com Developers' chat: '#Website is down!# Alert! Our website is not responding. Call admins and bring it up!'.
Contoh ini menggambarkan struktur corak reka bentuk Penyesuai dan memberi tumpuan kepada menjawab soalan berikut:
Selepas memahami struktur corak ini, anda boleh lebih mudah memahami kes aplikasi PHP dunia sebenar berikut.
<?php namespace RefactoringGuru\Adapter\Conceptual; /** * The Target defines the domain-specific interface used by the client code. */ class Target { public function request(): string { return "Target: The default target's behavior."; } } /** * The Adaptee contains some useful behavior, but its interface is incompatible * with the existing client code. The Adaptee needs some adaptation before the * client code can use it. */ class Adaptee { public function specificRequest(): string { return ".eetpadA eht fo roivaheb laicepS"; } } /** * The Adapter makes the Adaptee's interface compatible with the Target's * interface. */ class Adapter extends Target { private $adaptee; public function __construct(Adaptee $adaptee) { $this->adaptee = $adaptee; } public function request(): string { return "Adapter: (TRANSLATED) " . strrev($this->adaptee->specificRequest()); } } /** * The client code supports all classes that follow the Target interface. */ function clientCode(Target $target) { echo $target->request(); } echo "Client: I can work just fine with the Target objects:\n"; $target = new Target(); clientCode($target); echo "\n\n"; $adaptee = new Adaptee(); echo "Client: The Adaptee class has a weird interface. See, I don't understand it:\n"; echo "Adaptee: " . $adaptee->specificRequest(); echo "\n\n"; echo "Client: But I can work with it via the Adapter:\n"; $adapter = new Adapter($adaptee); clientCode($adapter);
Client: I can work just fine with the Target objects: Target: The default target's behavior. Client: The Adaptee class has a weird interface. See, I don't understand it: Adaptee: .eetpadA eht fo roivaheb laicepS Client: But I can work with it via the Adapter: Adapter: (TRANSLATED) Special behavior of the Adaptee.
Pembelajaran yang disyorkan :《Tutorial Video PHP》
Atas ialah kandungan terperinci Penerangan terperinci corak penyesuai PHP (dengan contoh kod). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!