cari
Rumahpembangunan bahagian belakangtutorial phpPHP Master | Suntikan pergantungan dengan jerawat

PHP Master | Dependency Injection with Pimple

mata teras

    Suntikan ketergantungan adalah konsep utama dalam pembangunan aplikasi, dan dengan menyuntik kebergantungan ke dalam modul dan bukannya kod keras mereka, anda boleh menulis kod yang lebih efisien dan lebih mudah dipelihara.
  • Pimple adalah bekas suntikan ketergantungan yang mudah yang menggunakan penutupan PHP untuk menentukan kebergantungan dengan cara yang boleh diurus, membantu mengekalkan kod anda.
  • Dua teknik utama untuk suntikan suntikan adalah suntikan ketergantungan berasaskan pembina dan suntikan berasaskan setter, masing-masing dengan kelebihan dan kekurangannya sendiri.
  • Pimple menyokong prinsip pembangunan perisian kering dengan bertindak sebagai bekas yang mentakrifkan kebergantungan, mengelakkan pertindihan, menjadikannya lebih mudah untuk mengurus dan memusatkan perkhidmatan dalam aplikasi.
  • Pimple juga menyediakan ciri -ciri canggih seperti keupayaan untuk mengembalikan contoh yang sama menggunakan objek bersama, dan keupayaan untuk mengubahsuai penutupan yang sedia ada secara dinamik tanpa menjejaskan pelaksanaan asal.
Dalam pembangunan aplikasi, kami cuba membuat modul mandiri untuk menggunakan semula kod dalam projek masa depan. Walau bagaimanapun, mewujudkan modul yang sepenuhnya bebas yang menyediakan fungsi yang berguna adalah sukar; Di sinilah suntikan ketergantungan berguna, kerana ia membolehkan kita menyuntik kebergantungan yang diperlukan untuk kod berfungsi dengan baik tanpa kod keras mereka ke dalam modul. Jerawat adalah bekas suntikan pergantungan yang mudah yang menggunakan penutupan PHP untuk menentukan kebergantungan dengan cara yang boleh diurus. Dalam artikel ini, kami akan meneroka masalah ketergantungan keras, bagaimana suntikan ketergantungan menyelesaikan masalah ini, dan bagaimana menggunakan jerawat untuk membuat kod memanfaatkan suntikan ketergantungan lebih mudah untuk dikekalkan.

KEPENTINGAN KEPUTUSAN KEPUTUSAN Apabila menulis aplikasi, kami menggunakan banyak kelas PHP. Kelas mungkin perlu memanggil kaedah satu atau lebih kelas lain untuk menyediakan fungsi yang diharapkan, jadi kami mengatakan bahawa kelas pertama bergantung kepada kelas lain. Contohnya:

Kelas A bergantung pada Kelas B. Jika Kelas B tidak tersedia, kod di atas tidak akan berfungsi. Selain itu, setiap kali kita mengikat kod penciptaan objek di dalam kelas, kita akan mempunyai kebergantungan khusus pada kelas. Ketergantungan khusus adalah penghalang untuk menulis kod yang boleh diuji. Pendekatan yang lebih baik adalah untuk menyediakan objek Kelas B ke Kelas A. Objek ini boleh disediakan oleh pembina atau kaedah setter A. Sebelum kita membincangkan lagi, mari kita lihat senario yang lebih realistik.

Perkongsian kandungan di laman rangkaian sosial sangat biasa pada hari ini, dan kebanyakan laman web secara langsung memaparkan suapan profil sosial mereka di laman web mereka. Katakan kami mempunyai kelas yang dipanggil SocialFeeds yang menjana suapan dari laman sosial seperti Twitter, Facebook, Google, dll. Buat kelas berasingan untuk mengendalikan setiap perkhidmatan ini. Di sini kita akan melihat kelas twitterservice yang berinteraksi dengan Twitter. Kelas SocialFeeds menggunakan Twitterservice untuk meminta suapan Twitter. Twitterservice berinteraksi dengan pangkalan data untuk mendapatkan token pengguna tertentu yang mengakses API. Tanda itu diserahkan kepada kelas OAuth, yang mengambil makanan menggunakan token yang disediakan dan mengembalikannya ke kelas SocialFeeds.

<?php
class A
{
    public function a1() {
        $b = new B();
        $b->b1();
    }
}
<?php
class SocialFeeds
{
    public function getSocialFeeds() {
        $twService = new TwitterService();
        echo $twService->getTweets();
    }
}
<?php
class TwitterService
{
    public function getTweets() {
        $db = new DB();
        $query = "Query to get user token from database";
        $token = $db->getQueryResults($query);

        $oauth = new OAuth();
        return $oauth->requestTwitterFeed($token);
    }
}
<?php
class OAuth
{
    public function requestTwitterFeed($token) {
        // Retrieve and return twitter feed using the token         
    }
}

Adalah jelas bahawa sosialfeeds bergantung pada twitterservice. Tetapi Twitterservice bergantung kepada DB dan OAuth, jadi sosial -sosial bergantung kepada DB dan OAuth secara tidak langsung. Jadi apa masalahnya? SocialFeeds bergantung kepada pelaksanaan konkrit tiga kelas, jadi mustahil untuk menguji sosial secara berasingan tanpa pelaksanaan sebenar kelas lain. Atau, katakan kami ingin menggunakan pangkalan data yang berbeza atau pembekal OAuth yang berbeza. Dalam kes ini, kita perlu menggantikan kelas sedia ada dengan kelas baru sepanjang kod.

Betulkan kebergantungan tertentu

Penyelesaian kepada kebergantungan ini adalah mudah, iaitu secara dinamik menyediakan objek apabila perlu tanpa menggunakan pelaksanaan konkrit. Terdapat dua jenis teknik yang boleh menyuntik kebergantungan: suntikan ketergantungan berasaskan pembina dan suntikan berasaskan setter.

suntikan berasaskan pembina

Menggunakan suntikan ketergantungan berasaskan pembina, objek ketergantungan dicipta secara luaran dan diluluskan sebagai parameter kepada pembina kelas. Kita boleh menetapkan objek ini kepada pembolehubah kelas dan menggunakannya di mana -mana sahaja di dalam kelas. Suntikan berasaskan pembina kelas SocialFeeds adalah seperti berikut:

<?php
class DB
{
    public function getQueryResults($query) {
        // Get results from database and return token
    }
}

Contoh Twitterservice diluluskan sebagai objek kepada pembina. SocialFeeds masih bergantung pada Twitterservice, tetapi sekarang kami bebas untuk menyediakan versi penyedia perkhidmatan Twitter yang berlainan, dan juga objek mengejek untuk tujuan ujian. Mengenai kelas Twitterservice, DB dan OAuth juga ditakrifkan dengan cara yang sama.

<?php
class SocialFeeds
{
    public $twService;

    public function __construct($twService) {
        $this->twService = $twService;
    }

    public function getSocialFeeds() {
        echo $this->twService->getTweets();
    }
}

suntikan berasaskan seter

Menggunakan suntikan berasaskan setter, objek disediakan oleh kaedah setter dan bukannya pembina. Berikut adalah pelaksanaan suntikan ketergantungan berasaskan setter kelas SocialFeeds:

<?php
$db = new DB();
$oauth = new OAuth();
$twService = new TwitterService($db, $oauth);
$socialFeeds = new SocialFeeds($twService);
$socialFeeds->getSocialFeeds();

kod inisialisasi sekarang termasuk db dan oauth kelihatan seperti ini:

<?php
class SocialFeeds
{
    public $twService;

    public function getSocialFeeds() {
        echo $this->twService->getTweets();
    }

    public function setTwitterService($twService) {
        $this->twService = $twService;
    }
}

suntikan pembina dan setter

Pilih suntikan berasaskan pembina atau suntikan berasaskan setter terpulang kepada anda. Suntikan berasaskan pembina adalah sesuai apabila semua kebergantungan diperlukan untuk memberi instantiasi kelas. Suntikan berasaskan setter sesuai apabila kebergantungan tidak diperlukan setiap masa.

Pro

Pembina - Lihat saja pembina kelas untuk mengenal pasti semua kebergantungan kelas
  • setor - Menambah kebergantungan baru semudah menambah kaedah setter baru dan tidak memecahkan kod sedia ada
Kekurangan

  • Pembina - Menambah kebergantungan baru akan menambah parameter kepada pembina;
  • setor - kita perlu mencari kebergantungan yang diperlukan secara manual kerana mereka tidak ditentukan di mana sahaja
Selepas memahami suntikan pergantungan dan pelbagai teknik suntikan, sudah tiba masanya untuk melihat jerawat dan bagaimana ia sesuai dengannya.

peranan jerawat dalam di

Apabila kita sudah dapat menyuntik kebergantungan menggunakan teknik yang disebutkan di atas, anda mungkin tertanya -tanya mengapa anda memerlukan jerawat. Untuk menjawab soalan ini, kita perlu melihat prinsip kering.

Jangan ulangi diri anda (kering) adalah prinsip dalam pembangunan perisian yang bertujuan untuk mengurangkan duplikasi pelbagai maklumat, yang sangat berguna dalam seni bina pelbagai lapisan. Pernyataan prinsip kering adalah bahawa "setiap serpihan pengetahuan mesti mempunyai perwakilan tunggal, jelas, berwibawa dalam sistem" - Wikipedia

Pertimbangkan contoh suntikan berasaskan pembina. Setiap kali kita menginginkan objek kelas SocialFeed, kita perlu mengulangi keseluruhan proses persediaan instantiating dan lulus kebergantungannya. Menurut Dry, kod tersebut harus dielakkan untuk mencegah masalah penyelenggaraan. Jerawat bertindak sebagai bekas yang mentakrifkan kebergantungan sedemikian untuk mengelakkan pertindihan. Mari kita lihat contoh mudah untuk melihat bagaimana jerawat berfungsi.

<?php
class A
{
    public function a1() {
        $b = new B();
        $b->b1();
    }
}
Buat contoh jerawat sebagai bekas untuk menyimpan dependensi. Ia melaksanakan antara muka SPL Arrayaccess, jadi menggunakannya sangat serupa dengan menggunakan tatasusunan. Pertama, kita menentukan kunci yang memegang nama mana -mana kelas yang kita mahu. Kami kemudian menentukan penutupan untuk mengembalikan contoh kelas yang ditentukan yang bertindak sebagai perkhidmatan. Perhatikan bahawa contoh bekas akan diluluskan kepada $ C, jadi kita boleh merujuk kepada kunci yang ditakrifkan seperti yang diperlukan; Sekarang, apabila kita mahu contoh kelas, kita boleh merujuk kunci untuk mendapatkan objek tersebut. Mari kita menukar contoh sosial untuk jerawat. Contoh-contoh di laman web Pimple Rasmi menunjukkan suntikan berasaskan pembina, jadi di sini kami akan menggambarkan suntikan berasaskan setter. Ingat bahawa untuk menggunakan jerawat, kita tidak perlu mengubah suai kaedah setter atau kod yang ditakrifkan sebelum ini - kita hanya merangkum logik.

<?php
class SocialFeeds
{
    public function getSocialFeeds() {
        $twService = new TwitterService();
        echo $twService->getTweets();
    }
}
db dan kelas OAuth adalah modul bebas, jadi kami mengembalikan contoh baru mereka secara langsung dalam penutupan. Kami kemudian menggunakan suntikan berasaskan setter untuk menambah kebergantungan ke kelas Twitterservice. Kami telah menambah kelas DB dan OAuth ke bekas, jadi kami boleh mengaksesnya secara langsung di dalam fungsi menggunakan $ C ['DB'] dan $ C ['OAUTH']. Sekarang, kebergantungan dikemas dalam bekas sebagai perkhidmatan. Setiap kali kita mahu menggunakan kelas DB yang berbeza atau perkhidmatan OAuth yang berbeza, kita hanya menggantikan kelas dalam pernyataan kontena dan semuanya akan berjalan dengan sempurna. Dengan jerawat, anda hanya perlu menambah kebergantungan baru di satu tempat.

Penggunaan jerawat lanjutan

Dalam senario di atas, Pimple mengembalikan contoh baru setiap kelas dari penutupan setiap kali ia diminta. Dalam sesetengah kes, kita perlu menggunakan objek yang sama tanpa memulakan contoh baru setiap kali, seperti menyambung ke pangkalan data adalah contoh yang sempurna. Pimple menyediakan keupayaan untuk mengembalikan contoh yang sama menggunakan objek yang dikongsi.

<?php
class A
{
    public function a1() {
        $b = new B();
        $b->b1();
    }
}
Juga, setakat ini kami telah menentukan semua kebergantungan dalam satu lokasi dalam bekas jerawat. Walau bagaimanapun, pertimbangkan satu kes di mana kita memerlukan perkhidmatan yang mempunyai kebergantungannya tetapi dikonfigurasikan sedikit berbeza dari perkhidmatan asal. Sebagai contoh, katakan kita perlu mengakses ORM untuk melaksanakan beberapa fungsi kelas Twitterservice. Kita tidak boleh mengubah penutupan yang sedia ada kerana ia memaksa semua fungsi sedia ada untuk menggunakan ORM. Pimple menyediakan kaedah lanjutan () untuk mengubahsuai penutupan yang sedia ada secara dinamik tanpa menjejaskan pelaksanaan asal. Pertimbangkan kod berikut:

<?php
class SocialFeeds
{
    public function getSocialFeeds() {
        $twService = new TwitterService();
        echo $twService->getTweets();
    }
}
Sekarang, kami dapat menggunakan versi lanjutan yang berbeza dari tweet_service dalam kes -kes khas. Parameter pertama adalah nama perkhidmatan, dan parameter kedua adalah fungsi yang dapat mengakses contoh objek dan bekas. Malah, lanjutan () adalah cara yang kuat untuk menambah kebergantungan secara dinamik untuk memenuhi situasi yang berbeza, tetapi pastikan untuk mengehadkan versi perkhidmatan yang dilanjutkan dengan minimum, kerana ia meningkatkan jumlah kod pendua.

Ringkasan

Menguruskan kebergantungan adalah salah satu tugas yang paling penting dan sukar dalam pembangunan aplikasi web. Kita boleh menggunakan suntikan ketergantungan pembina dan kaedah setter untuk mengurusnya dengan berkesan. Walau bagaimanapun, suntikan pergantungan itu sendiri juga mempunyai beberapa masalah, dan jerawat menyelesaikan masalah ini dengan menyediakan bekas ringan untuk membuat dan menyimpan kebergantungan objek dengan cara yang kering. Jangan ragu untuk berkongsi pengalaman anda menguruskan kebergantungan dalam projek anda dan pemikiran anda mengenai jerawat sebagai bekas suntikan ketergantungan dalam komen di bawah.

Soalan Lazim mengenai Suntikan Ketergantungan dengan Jerawat (Soalan Lazim)

Apakah jerawat dan mengapa ia digunakan dalam php?

Pimple adalah bekas suntikan pergantungan PHP yang mudah yang membolehkan anda mengurus dan memusatkan perkhidmatan dalam aplikasi anda. Ia digunakan dalam PHP, menjadikan kod lebih fleksibel, boleh diguna semula dan lebih mudah untuk diuji. Dengan menggunakan jerawat, anda boleh memberi objek objek di satu tempat dan menyuntiknya ke bahagian -bahagian yang berlainan dari aplikasi anda, mengurangkan keperluan untuk keadaan global dan menjadikan kod anda lebih mudah untuk mengekalkan dan menguji.

bagaimana jerawat berfungsi?

Pimple berfungsi dengan menyimpan definisi perkhidmatan dalam bekas. Definisi ini boleh dipanggil (fungsi atau kaedah) dan mereka mengembalikan contoh perkhidmatan. Apabila anda mengakses perkhidmatan dari bekas, Pimple melaksanakan definisi perkhidmatan untuk membuat objek perkhidmatan. Ini membolehkan anda menguruskan perkhidmatan dengan cara berpusat dan berkongsi perkhidmatan sepanjang permohonan.

bagaimana memasang jerawat?

jerawat boleh dipasang menggunakan komposer (alat pengurusan pergantungan PHP). Anda boleh memasang komposer secara global pada sistem anda dan kemudian memperkenalkan jerawat dalam projek anda dengan menjalankan perintah

.

bagaimana untuk menentukan perkhidmatan dalam jerawat?

Dalam jerawat, anda boleh menentukan perkhidmatan dengan memberikan objek yang boleh dipanggil ke kunci dalam bekas. Objek yang boleh dipanggil harus mengembalikan contoh perkhidmatan. Sebagai contoh, anda boleh menentukan perkhidmatan untuk kelas pengirim mel seperti ini:

$container['mailer'] = function ($c) { return new Mailer($c['smtp']); };

Dalam contoh ini, perkhidmatan pengirim mel ditakrifkan sebagai contoh baru kelas Mailer, di mana perkhidmatan SMTP disuntik sebagai kebergantungan.

Bagaimana untuk mengakses perkhidmatan dalam jerawat?

anda boleh mengakses perkhidmatan dalam jerawat menggunakan notasi array dengan kekunci perkhidmatan. Sebagai contoh, anda boleh mengakses perkhidmatan pengirim mel seperti ini:

. Apabila anda mengakses perkhidmatan, Pimple melaksanakan definisi perkhidmatan dan mengembalikan objek perkhidmatan. $mailer = $container['mailer'];

Bagaimana untuk berkongsi perkhidmatan dalam jerawat?

Secara lalai, Pimple mengembalikan contoh perkhidmatan baru setiap kali ia mengakses perkhidmatan. Jika anda ingin berkongsi perkhidmatan dan mengembalikan contoh yang sama setiap kali, anda boleh menggunakan kaedah

. Sebagai contoh, anda boleh berkongsi perkhidmatan pengirim mel seperti ini: share(). $container['mailer'] = $container->share(function ($c) { return new Mailer($c['smtp']); });

Bolehkah saya melanjutkan perkhidmatan dalam jerawat?

Ya, anda boleh menggunakan kaedah

untuk melanjutkan perkhidmatan dalam jerawat. Ini membolehkan anda mengubah suai perkhidmatan selepas mendefinisikannya. Sebagai contoh, anda boleh melanjutkan perkhidmatan pengirim mel seperti ini untuk menambah konfigurasi tambahan: extend()

$container['mailer'] = $container->extend('mailer', function ($mailer, $c) { $mailer->setFrom($c['email.from']); return $mailer; }); Dalam contoh ini, kaedah

dipanggil pada perkhidmatan pengirim mel menggunakan perkhidmatan

sebagai parameter. setFrom() email.from Bagaimana untuk melindungi parameter dalam jerawat?

Dalam jerawat, anda boleh menggunakan kaedah

untuk melindungi parameter (yang tidak boleh dianggap sebagai parameter perkhidmatan). Ini membolehkan anda menyimpan nilai dalam bekas tanpa merawatnya sebagai definisi perkhidmatan. Sebagai contoh, anda boleh melindungi nilai konfigurasi seperti ini:

. protect() $container['config.value'] = $container->protect(function () { return 'value'; }); Bagaimana menggunakan jerawat dalam projek?

Anda boleh menggunakan jerawat dalam projek dengan membuat contoh baru kelas Pimplecontainer dan menentukan perkhidmatan di sana. Anda kemudian boleh mengakses perkhidmatan dari bekas di mana anda memerlukannya dalam permohonan. Ini membolehkan anda menguruskan perkhidmatan secara berpusat dan menyuntiknya ke bahagian -bahagian yang berlainan dari aplikasi anda.

Apakah faedah menggunakan jerawat?

Pimple menyediakan banyak manfaat untuk pembangunan PHP. Ia menjadikan kod anda lebih fleksibel kerana ia membolehkan anda menguruskan perkhidmatan dengan cara yang berpusat. Ia menjadikan kod anda lebih mudah untuk digunakan semula kerana ia membolehkan anda berkongsi perkhidmatan sepanjang aplikasi anda. Ia menjadikan kod anda lebih mudah untuk diuji kerana ia membolehkan anda menyuntik perkhidmatan mengejek untuk ujian. Dengan menggunakan jerawat, anda boleh meningkatkan kualiti kod anda dan memudahkan untuk mengekalkan dan menguji.

Atas ialah kandungan terperinci PHP Master | Suntikan pergantungan dengan jerawat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Apakah perbezaan antara unset () dan session_destroy ()?Apakah perbezaan antara unset () dan session_destroy ()?May 04, 2025 am 12:19 AM

ThedifferenceBetweenUnset () andSession_destroy () isThatunset () clearsspecificSessionVariableswhileKeepingTheSessionActive, sedangkan assesion_destroy () terminatestheentiressies.1)

Apakah Sesi Sticky (Affinity Sesi) dalam konteks pengimbangan beban?Apakah Sesi Sticky (Affinity Sesi) dalam konteks pengimbangan beban?May 04, 2025 am 12:16 AM

StickySessionseSenseSerRequestSarerOutedTotheseServerForSessionDataConsistency.1) sessionentificationassignsuserverserversusingciesorurlmodifications.2) consistentroutingdirectssubsequentrequeststotheserver.3) loadbalansingdistributesNewuser

Apakah sesi yang berbeza menyimpan pengendali yang terdapat di PHP?Apakah sesi yang berbeza menyimpan pengendali yang terdapat di PHP?May 04, 2025 am 12:14 AM

Phpoffersvarioussessionsavehandlers: 1) Fail: lalai, SimpleButmayBottLeneckonHigh-Trafficsites.2) Memcached: berprestasi tinggi, idealforspeed-kritikalapplications.3) Redis: similartomemcached

Apakah sesi dalam PHP, dan mengapa mereka digunakan?Apakah sesi dalam PHP, dan mengapa mereka digunakan?May 04, 2025 am 12:12 AM

Sesi dalam PHP adalah mekanisme untuk menyimpan data pengguna di sisi pelayan untuk mengekalkan keadaan antara pelbagai permintaan. Khususnya, 1) sesi dimulakan oleh fungsi session_start (), dan data disimpan dan dibaca melalui array super global $ _Session; 2) data sesi disimpan dalam fail sementara pelayan secara lalai, tetapi boleh dioptimumkan melalui pangkalan data atau storan memori; 3) Sesi ini boleh digunakan untuk merealisasikan fungsi pengesan status pengguna dan fungsi keranjang belanja; 4) Perhatikan pengoptimuman penghantaran dan prestasi yang selamat bagi sesi untuk memastikan keselamatan dan kecekapan permohonan.

Terangkan kitaran hayat sesi PHP.Terangkan kitaran hayat sesi PHP.May 04, 2025 am 12:04 AM

PHPSSsionsStartWithSesion_start (), yang manageneratesauniqueidAndreateSererVerVerFile; tHePersisTacrossRequestSandCanBeManualEltersenedWithSession_destroy ()

Apakah perbezaan antara masa tamat sesi mutlak dan terbiar?Apakah perbezaan antara masa tamat sesi mutlak dan terbiar?May 03, 2025 am 12:21 AM

Timeout sesi mutlak bermula pada masa penciptaan sesi, sementara waktu tamat sesi terbiar bermula pada masa operasi pengguna. Tamat masa sesi mutlak sesuai untuk senario di mana kawalan ketat kitaran hayat sesi diperlukan, seperti aplikasi kewangan; Timeout sesi terbiar sesuai untuk aplikasi yang mahu pengguna menyimpan sesi mereka aktif untuk masa yang lama, seperti media sosial.

Apakah langkah yang akan anda ambil jika sesi tidak berfungsi di pelayan anda?Apakah langkah yang akan anda ambil jika sesi tidak berfungsi di pelayan anda?May 03, 2025 am 12:19 AM

Kegagalan sesi pelayan boleh diselesaikan dengan mengikuti langkah -langkah: 1. Semak konfigurasi pelayan untuk memastikan sesi ditetapkan dengan betul. 2. Sahkan kuki klien, sahkan bahawa penyemak imbas menyokongnya dan hantar dengan betul. 3. Periksa perkhidmatan penyimpanan sesi, seperti Redis, untuk memastikan bahawa mereka beroperasi secara normal. 4. Semak kod aplikasi untuk memastikan logik sesi yang betul. Melalui langkah -langkah ini, masalah perbualan dapat didiagnosis dengan berkesan dan diperbaiki dan pengalaman pengguna dapat diperbaiki.

Apakah kepentingan fungsi session_start ()?Apakah kepentingan fungsi session_start ()?May 03, 2025 am 12:18 AM

session_start () iscrucialinphpformanaginguserSessions.1) itinitiatesanewsessionifnoneexists, 2) resumeSanexistingsession, dan3) setSasessionCookieforcontinuityAcrossrequests, enableingApplicationeUseUshenticationandPersonalConizedConizedContentContentContentContentContentContentContentContentContentContentContentC.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan