亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Jadual Kandungan
Kesimpulan
Soalan Lazim Mengenai Pengejaran dan Ujian Kebergantungan (FAQ)
Apa itu ejekan dan mengapa penting dalam ujian PHP?
Bagaimana untuk memasang dan menyiapkan penghinaan dalam projek PHP saya?
bagaimana membuat objek mengejek menggunakan ejekan?
Bagaimana untuk menentukan jangkaan dalam ejekan?
Apakah perbezaan antara simulasi dan stub dalam ejekan?
Bagaimana menggunakan ejekan untuk menguji kaedah peribadi?
Bagaimana menangani parameter pembina dalam ejekan?
Bagaimana menggunakan ejekan untuk mensimulasikan kaedah statik?
Bagaimana untuk mengesahkan bahawa semua jangkaan dipenuhi dalam ejekan?
Bagaimana menangani pengecualian dalam ejekan?
Rumah pembangunan bahagian belakang tutorial php Mengejutkan Dependensi Ujian Anda Dengan Penghinaan

Mengejutkan Dependensi Ujian Anda Dengan Penghinaan

Feb 20, 2025 am 09:07 AM

Mock your Test Dependencies with Mockery

Walaupun tidak semua orang melakukan ini, menguji permohonan anda adalah salah satu bahagian yang paling asas menjadi pemaju. Ujian unit adalah ujian yang paling biasa. Dengan ujian unit, anda boleh menyemak sama ada kelas berjalan seperti yang anda harapkan. Kadang-kadang, anda menggunakan perkhidmatan pihak ketiga dalam aplikasi anda, dan sukar untuk menubuhkan segala-galanya untuk ujian unit. Ini adalah ketika simulasi dimainkan.

mata utama

    Mocking adalah proses membuat pengganti objek sebenar dalam ujian unit, yang sangat berguna apabila menguji aplikasi yang sangat bergantung pada suntikan ketergantungan.
  • Mockery adalah sebuah perpustakaan yang dicipta oleh Pádraic Brady yang boleh digunakan untuk mengejek objek dalam ujian unit, memberikan alternatif kepada keupayaan mengejek lalai phpunit.
  • ejekan membolehkan pemaju untuk menentukan jangkaan untuk bilangan panggilan kaedah, parameter yang akan diterima, dan nilai -nilai yang akan dikembalikan, menjadikannya alat yang kuat untuk mengasingkan kebergantungan dalam ujian unit.
  • Walaupun phpunit sudah dapat mengejek objek, ejekan memberikan fleksibiliti dan kemudahan yang lebih besar bagi pemaju yang ingin memastikan ujian unit mereka tidak terjejas oleh kelas lain.
Apakah simulasi?

Mengejar objek tidak lebih daripada membuat objek pengganti yang menggantikan objek sebenar dalam ujian unit. Jika permohonan anda sangat bergantung kepada suntikan pergantungan, mengejek adalah cara yang baik.

Mungkin ada beberapa sebab untuk mengejek objek:

    Adalah lebih baik untuk mengasingkan kelas apabila melakukan ujian unit. Anda tidak mahu kelas atau perkhidmatan lain mengganggu ujian unit anda.
  1. Objek belum wujud. Anda boleh membuat ujian terlebih dahulu dan kemudian membina objek akhir.
  2. Objek mock biasanya lebih cepat daripada menyediakan keseluruhan pangkalan data untuk ujian.
anda mungkin menggunakan phpunit semasa menjalankan ujian unit. PHPUnit dilengkapi dengan beberapa ciri simulasi lalai seperti yang ditunjukkan dalam dokumentasi. Anda boleh membaca lebih lanjut mengenai simulasi dan keupayaan simulasi PHPUnit dalam artikel ini yang ditulis oleh Jeune Asuncion.

Dalam artikel ini, kita akan menyelam ke dalam ejekan perpustakaan yang dicipta oleh Pádraic Brady. Kami akan membuat kelas suhu yang akan menyuntik perkhidmatan cuaca yang tidak wujud sekarang.

Tetapan

mari kita mulakan dengan menubuhkan projek. Kami bermula dengan fail komposer.json yang mengandungi kandungan berikut. Ini akan memastikan kami mempunyai ejekan dan phpunit.

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>
kami juga membuat fail konfigurasi phpUnit yang dipanggil phpunit.xml

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>
Adalah penting untuk menentukan pendengar ini. Sekiranya tidak ada pendengar, jika kaedah

, once() dan twice() digunakan dengan tidak betul, tiada kesilapan akan dibangkitkan. Ini akan diterangkan secara terperinci kemudian. times()

Saya juga membuat 2 direktori. Direktori SRC digunakan untuk memegang kelas saya, dan direktori ujian digunakan untuk menyimpan ujian kami. Dalam direktori SRC, saya mencipta laluan SitePointweather.

kita mula -mula membuat WeatherServiceInterface. Perkhidmatan cuaca yang tidak wujud akan melaksanakan antara muka ini. Dalam kes ini kita hanya menyediakan satu kaedah yang akan memberi kita suhu Celsius.

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>
Oleh itu, kita mempunyai perkhidmatan yang memberikan kita suhu Celsius. Saya mahu mendapatkan Fahrenheit. Untuk melakukan ini, saya mencipta kelas baru yang dipanggil TemperatureService. Perkhidmatan ini akan menyuntik perkhidmatan cuaca. Di samping itu, kami juga menentukan kaedah yang menukarkan Celsius kepada Fahrenheit.

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>
Buat Ujian Unit

Kami bersedia untuk menubuhkan ujian unit. Kami membuat kelas temperatureServicetest dalam direktori ujian. Dalam kelas ini kita membuat kaedah

yang akan menguji kaedah Fahrenheit kami. testGetTempFahrenheit()

Langkah pertama yang perlu dilakukan dalam kaedah ini adalah untuk membuat objek Suhu Suhu baru. Sama seperti kita melakukan ini, pembina kita akan meminta objek yang melaksanakan WeatherServiceInterface. Oleh kerana kita tidak mempunyai objek seperti itu (kita tidak mahu sama ada), kita akan menggunakan ejekan untuk membuat objek mengejek untuk kita. Mari lihat bagaimana kaedahnya selepas selesai.

namespace SitePoint\Weather;

interface WeatherServiceInterface
{
    /**
     * 返回?cái)z氏溫度
     *
     * @return float
     */
    public function getTempCelsius();
}
kita mula -mula membuat objek mengejek. Kami memberitahu penghinaan yang objek (atau antara muka) kami mahu mengejek. Langkah kedua adalah untuk menerangkan kaedah yang akan dipanggil pada objek mock ini. Dalam kaedah

, kami menentukan nama kaedah yang akan dipanggil. shouldReceive()

Kami mentakrifkan bilangan kali kaedah ini akan dipanggil. Kita boleh menggunakan

, once() dan twice(). Dalam kes ini, kami mengharapkan ia dipanggil hanya sekali. Jika tidak dipanggil atau panggilan berlebihan dipanggil, ujian unit akan gagal. times(X)

Akhirnya, kita menentukan nilai yang akan dikembalikan dalam kaedah

. Dalam kes ini, kami kembali 25. Mockery juga mempunyai kaedah pulangan seperti andReturn(), andReturnNull() dan andReturnSelf(). Jika itulah yang anda harapkan, penghinaan boleh membuang pengecualian juga. andReturnUndefined()

Kami kini mempunyai objek mengejek yang boleh membuat objek suhu kami dan mengujinya seperti biasa. 25 darjah Celsius adalah 77 darjah Fahrenheit, jadi kami periksa sama ada kami menerima 77 dari kaedah

kami. getTempFahrenheit()

Jika anda menjalankan

dalam direktori root anda, anda akan mendapat cahaya hijau dari phpunit, menunjukkan bahawa semuanya sempurna. vendor/bin/phpunit tests/

Penggunaan lanjutan

Contoh di atas agak mudah. Tiada parameter, hanya panggilan mudah. Mari buat perkara lebih rumit.

Katakan perkhidmatan cuaca kami juga mempunyai cara untuk mendapatkan suhu pada waktu yang tepat. Kami menambah kaedah berikut untuk WeatherServiceInterface semasa kami.

namespace SitePoint\Weather;

class TemperatureService
{
    /**
     * @var WeatherServiceInterace $weatherService 保存天氣服務(wù)
     */
    private $weatherService;

    /**
     * 構(gòu)造函數(shù)。
     *
     * @param WeatherServiceInterface $weatherService
     */
    public function __construct(WeatherServiceInterface $weatherService) {
        $this->weatherService = $weatherService;
    }

    /**
     * 獲取當(dāng)前華氏溫度
     *
     * @return float
     */
    public function getTempFahrenheit() {
        return ($this->weatherService->getTempCelsius() * 1.8000) + 32;
    }
}
Kami ingin tahu apa suhu purata antara jam 0:00 dan 6:00 petang. Untuk melakukan ini, kami membuat kaedah baru dalam suhu untuk mengira suhu purata. Untuk melakukan ini, kami mengambil 7 suhu dari Weatherservice dan mengira purata.

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>

Mari kita lihat kaedah ujian kami.

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>

Kami mensimulasikan antara muka sekali lagi dan menentukan kaedah yang akan dipanggil. Seterusnya, kami menentukan bilangan kali kaedah ini akan dipanggil. Kami menggunakan once() dalam contoh sebelumnya, dan sekarang kami menggunakan times(7) untuk menunjukkan bahawa kami mengharapkan kaedah ini dipanggil 7 kali. Jika kaedah itu tidak dipanggil tepat 7 kali, ujian akan gagal. Jika anda tidak menentukan pendengar dalam fail konfigurasi phpUnit.xml, anda tidak akan menerima pemberitahuan mengenai perkara ini.

Seterusnya, kami menentukan kaedah with(). Dalam kaedah with, anda boleh menentukan parameter yang anda harapkan. Dalam kes ini, kami mengharapkan 7 jam yang berbeza.

Akhirnya, kita mempunyai kaedah andReturn(). Dalam kes ini, kami menunjukkan 7 nilai pulangan. Jika anda menentukan nilai pulangan yang lebih sedikit, nilai pulangan yang tersedia terakhir akan diulang setiap kali.

Sudah tentu, ejekan boleh berbuat lebih banyak. Untuk panduan dan dokumentasi lengkap, saya cadangkan anda menyemak halaman GitHub.

Jika anda berminat dengan kod projek di atas, anda boleh menyemak halaman GitHub ini.

Kesimpulan

Menggunakan phpunit, anda sudah boleh mengejek objek. Walau bagaimanapun, anda juga boleh menggunakan penghinaan seperti yang dijelaskan dalam contoh di atas. Jika anda menguji unit kelas anda dan anda tidak mahu kelas lain mempengaruhi ujian anda, ejekan dapat membantu anda dengan mudah. Jika anda benar -benar mahu melakukan ujian berfungsi, lebih baik untuk melihat sama ada anda boleh mengintegrasikan ujian sebenar. Adakah anda sedang menggunakan simulasi phpunit dan mempertimbangkan untuk beralih ke penghinaan? Adakah anda ingin melihat lebih banyak contoh ejekan yang lebih besar dalam jawatan berikutnya? Tolong beritahu saya dalam komen di bawah.

Soalan Lazim Mengenai Pengejaran dan Ujian Kebergantungan (FAQ)

Apa itu ejekan dan mengapa penting dalam ujian PHP?

Mockery adalah rangka kerja objek php mock yang kuat dan fleksibel untuk ujian unit. Ia direka sebagai alternatif langsung kepada fungsi objek mock phpunit. Penghinaan membolehkan pemaju mengasingkan kod yang diuji dan membuat ujian stand-in yang mensimulasikan tingkah laku objek kompleks. Ini penting dalam ujian unit kerana ia memastikan bahawa kod yang diuji tidak bergantung kepada faktor luaran atau keadaan.

Bagaimana untuk memasang dan menyiapkan penghinaan dalam projek PHP saya?

Untuk memasang penghinaan, anda perlu mempunyai komposer, pengurus pergantungan PHP. Anda boleh memasang penghinaan dengan menjalankan arahan composer require --dev mockery/mockery. Selepas pemasangan, anda boleh menyediakan penghinaan dalam fail ujian dengan memanggil Mockery::close() dalam kaedah Test Tearown untuk membersihkan objek mengejek.

bagaimana membuat objek mengejek menggunakan ejekan?

Mewujudkan objek mengejek dalam ejekan adalah mudah. Anda boleh menggunakan kaedah mock() untuk membuat objek mengejek. Sebagai contoh, $mock = Mockery::mock('MyClass'); akan membuat objek mengejek untuk MyClass.

Bagaimana untuk menentukan jangkaan dalam ejekan?

Dalam penghinaan, anda menentukan jangkaan dengan menghubungkan kaedah untuk mengejek objek. Sebagai contoh, $mock->shouldReceive('myMethod')->once()->andReturn('mocked value'); kod ini memberitahu penghinaan yang mengharapkan "mymethod" dipanggil sekali dan harus kembali "nilai mengejek".

Apakah perbezaan antara simulasi dan stub dalam ejekan?

Dalam ejekan, mengejek adalah objek di mana kita boleh menetapkan yang dikehendaki, sementara stub adalah objek mengejek yang mempunyai respons pra-program. Apabila tindak balas adalah satu -satunya perkara yang penting, stub biasanya digunakan, dan apabila menguji interaksi itu sendiri, mengejek digunakan.

Bagaimana menggunakan ejekan untuk menguji kaedah peribadi?

Tidak disyorkan untuk menguji kaedah peribadi secara langsung kerana ia melanggar prinsip enkapsulasi. Walau bagaimanapun, jika anda mahu, anda boleh menggunakan kaedah shouldAllowMockingProtectedMethods() dalam penghinaan untuk membolehkan kaedah yang dilindungi dan peribadi yang dihina.

Bagaimana menangani parameter pembina dalam ejekan?

Jika kelas yang anda mahu mensimulasikan mempunyai pembina dengan argumen, anda boleh lulus sebagai array ke kaedah mock(). Sebagai contoh, $mock = Mockery::mock('MyClass', [$arg1, $arg2]); akan lulus $ Arg1 dan $ Arg2 kepada pembina MyClass.

Bagaimana menggunakan ejekan untuk mensimulasikan kaedah statik?

Mockery menyediakan kaedah untuk mensimulasikan kaedah statik menggunakan prefix alias:. Sebagai contoh, $mock = Mockery::mock('alias:MyClass'); akan membuat objek mengejek yang boleh digunakan untuk menetapkan tetapan yang dikehendaki kaedah statik MyClass.

Bagaimana untuk mengesahkan bahawa semua jangkaan dipenuhi dalam ejekan?

anda boleh menggunakan kaedah Mockery::close() dalam kaedah pembongkaran ujian untuk mengesahkan bahawa semua jangkaan telah dipenuhi. Jika apa -apa jangkaan tidak dipenuhi, ejekan akan membuang pengecualian.

Bagaimana menangani pengecualian dalam ejekan?

anda boleh menggunakan kaedah andThrow() untuk menubuhkan objek mengejek untuk membuang pengecualian. Sebagai contoh, $mock->shouldReceive('myMethod')->andThrow(new Exception); akan membuang pengecualian apabila "mymethod" dipanggil.

Atas ialah kandungan terperinci Mengejutkan Dependensi Ujian Anda Dengan Penghinaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

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.

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

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1488
72
Skop pembolehubah PHP dijelaskan Skop pembolehubah PHP dijelaskan Jul 17, 2025 am 04:16 AM

Masalah dan penyelesaian biasa untuk skop pembolehubah PHP termasuk: 1. Pembolehubah global tidak dapat diakses dalam fungsi, dan ia perlu diluluskan menggunakan kata kunci atau parameter global; 2. Pembolehubah statik diisytiharkan dengan statik, dan ia hanya dimulakan sekali dan nilai dikekalkan antara pelbagai panggilan; 3. Pembolehubah hyperglobal seperti $ _get dan $ _post boleh digunakan secara langsung dalam mana -mana skop, tetapi anda perlu memberi perhatian kepada penapisan yang selamat; 4. Fungsi Anonymous perlu memperkenalkan pembolehubah skop induk melalui kata kunci penggunaan, dan apabila mengubah suai pembolehubah luaran, anda perlu lulus rujukan. Menguasai peraturan ini boleh membantu mengelakkan kesilapan dan meningkatkan kestabilan kod.

Bagaimana cara mengendalikan fail memuat naik dengan selamat di PHP? Bagaimana cara mengendalikan fail memuat naik dengan selamat di PHP? Jul 08, 2025 am 02:37 AM

Untuk mengendalikan muat naik fail PHP dengan selamat, anda perlu mengesahkan sumber dan jenis, mengawal nama fail dan laluan, menetapkan sekatan pelayan, dan memproses fail media dua kali. 1. Sahkan sumber muat naik untuk mengelakkan CSRF melalui token dan mengesan jenis mime sebenar melalui finfo_file menggunakan kawalan putih; 2. Namakan semula fail ke rentetan rawak dan tentukan pelanjutan untuk menyimpannya dalam direktori bukan web mengikut jenis pengesanan; 3. Konfigurasi PHP mengehadkan saiz muat naik dan direktori sementara Nginx/Apache melarang akses ke direktori muat naik; 4. Perpustakaan GD menyambung semula gambar -gambar untuk membersihkan data yang berpotensi.

Mengulas kod dalam php Mengulas kod dalam php Jul 18, 2025 am 04:57 AM

Terdapat tiga kaedah umum untuk kod komen PHP: 1. Use // atau # untuk menyekat satu baris kod, dan disyorkan untuk menggunakan //; 2. Gunakan /.../ untuk membungkus blok kod dengan pelbagai baris, yang tidak boleh bersarang tetapi boleh diseberang; 3. Komen -komen kemahiran gabungan seperti menggunakan / jika () {} / untuk mengawal blok logik, atau untuk meningkatkan kecekapan dengan kunci pintasan editor, anda harus memberi perhatian kepada simbol penutupan dan mengelakkan bersarang apabila menggunakannya.

Bagaimana penjana berfungsi dalam php? Bagaimana penjana berfungsi dalam php? Jul 11, 2025 am 03:12 AM

Ageneratorinphpisamemory-efficientwaytoiterateOverlargedatasetsbyieldingvaluesonateatimeNsteadofreturningthemallatonce.1.GeneratorSuseTheyEldeyWorderWorderToProducevaluuesondemand,

Petua untuk menulis komen php Petua untuk menulis komen php Jul 18, 2025 am 04:51 AM

Kunci untuk menulis komen PHP adalah untuk menjelaskan tujuan dan spesifikasi. Komen harus menjelaskan "mengapa" dan bukannya "apa yang dilakukan", mengelakkan redundansi atau terlalu kesederhanaan. 1. Gunakan format bersatu, seperti docblock (/*/) untuk deskripsi kelas dan kaedah untuk meningkatkan keserasian dan keserasian alat; 2. Menekankan sebab -sebab di sebalik logik, seperti mengapa JS melompat perlu dikeluarkan secara manual; 3. Tambahkan gambaran keseluruhan gambaran sebelum kod kompleks, terangkan proses dalam langkah -langkah, dan membantu memahami idea keseluruhan; 4. Gunakan Todo dan Fixme secara rasional untuk menandakan item dan masalah untuk memudahkan penjejakan dan kerjasama berikutnya. Anotasi yang baik dapat mengurangkan kos komunikasi dan meningkatkan kecekapan penyelenggaraan kod.

Tutorial pemasangan php cepat Tutorial pemasangan php cepat Jul 18, 2025 am 04:52 AM

Toinstallphpquickly, usexampponwindowsorhomeBrewonmacos.1.onwindows, downloadandInstallxampp, selectcomponents, startapache, andplaceFilesinhtdocs.2.alternative, secara manualstallphpfromphp.netandsheBerver.3

Cara mengakses watak dalam rentetan dengan indeks dalam php Cara mengakses watak dalam rentetan dengan indeks dalam php Jul 12, 2025 am 03:15 AM

Dalam PHP, anda boleh menggunakan kurungan persegi atau pendakap keriting untuk mendapatkan aksara indeks spesifik rentetan, tetapi kurungan persegi disyorkan; Indeks bermula dari 0, dan akses di luar julat mengembalikan nilai null dan tidak dapat diberikan nilai; MB_SUBSTR dikehendaki mengendalikan watak multi-bait. Sebagai contoh: $ str = "hello"; echo $ str [0]; output h; dan watak -watak Cina seperti MB_SUBSTR ($ str, 1,1) perlu mendapatkan hasil yang betul; Dalam aplikasi sebenar, panjang rentetan perlu diperiksa sebelum gelung, rentetan dinamik perlu disahkan untuk kesahihan, dan projek berbilang bahasa mengesyorkan menggunakan fungsi keselamatan multi-bait secara seragam.

Belajar PHP: Panduan Pemula Belajar PHP: Panduan Pemula Jul 18, 2025 am 04:54 AM

Tolearnphpeffectively, startbysettingupalocalverenvironmentusingToolsLikexamppandaCodeDitorLikevscode.1) InstallXamppforapa Che, MySql, danPhp.2) UseAcodeeditorForsyntaxSupport.3) testyoursetupwithasimplephpfile.next, learnphpbasicsincludingvariables, ech

See all articles