Saya memiliki file dengan kelas Resp
. Jalannya adalah:
C:\xampp\htdocs\One\Classes\Resp.php
Dan saya memiliki index.php
file di direktori ini:
C:\xampp\htdocs\Two\Http\index.php
Dalam index.php
file ini saya ingin membuat instance kelas Resp
.
$a = new Resp();
Saya tahu saya dapat menggunakan require
atau include
kata kunci untuk menyertakan file dengan kelas:
require("One\Classes\Resp.php"); // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();
Tapi saya ingin mengimpor kelas tanpa menggunakan require
atau include
. Saya mencoba memahami cara use
kerja kata kunci. Saya mencoba langkah-langkah ini tetapi tidak ada yang berhasil:
use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes; /* nothing works */
$a = new Resp();
Ia mengatakan:
Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php
Bagaimana cara use
kerja kata kunci ? Bisakah saya menggunakannya untuk mengimpor kelas?
namespace
s. Sebenarnya tidak ada Symfony jika Anda tidak menggunakan namespaceJawaban:
use
tidak termasuk apapun. Ini hanya mengimpor namespace (atau kelas) yang ditentukan ke cakupan saat iniJika Anda ingin kelas dimuat otomatis - baca tentang pemuatan otomatis
sumber
Tidak, Anda tidak dapat mengimpor kelas dengan
use
kata kunci. Anda harus menggunakaninclude
/require
statement. Bahkan jika Anda menggunakan pemuat otomatis PHP, pemuat otomatis masih harus menggunakan baikinclude
atau secararequire
internal.Tujuan penggunaan kata kunci:
Pertimbangkan kasus di mana Anda memiliki dua kelas dengan nama yang sama; Anda akan merasa aneh, tetapi ketika Anda bekerja dengan struktur MVC yang besar, hal itu terjadi. Jadi jika Anda memiliki dua kelas dengan nama yang sama, letakkan di ruang nama yang berbeda. Sekarang pertimbangkan kapan auto loader Anda memuat kedua kelas (dilakukan oleh
require
), dan Anda akan menggunakan objek kelas. Dalam kasus ini, kompilator akan bingung memilih objek kelas mana yang akan dimuat di antara dua objek kelas. Untuk membantu compiler membuat keputusan, Anda dapat menggunakanuse
pernyataan tersebut sehingga dapat membuat keputusan mana yang akan digunakan.Saat ini kerangka kerja utama memang menggunakan
include
ataurequire
viacomposer
danpsr
1) komposer
2) Pemuat otomatis PSR-4
Menelaahnya dapat membantu Anda lebih jauh. Anda juga dapat menggunakan alias untuk menangani kelas yang tepat. Misalkan Anda memiliki dua kelas dengan nama yang sama, katakanlah
Mailer
dengan dua ruang nama yang berbeda:namespace SMTP; class Mailer{}
dan
namespace Mailgun; class Mailer{}
Dan jika Anda ingin menggunakan kedua kelas Mailer secara bersamaan, Anda dapat menggunakan alias.
use SMTP\Mailer as SMTPMailer; use Mailgun\Mailer as MailgunMailer;
Nanti di kode Anda jika Anda ingin mengakses objek kelas tersebut maka Anda dapat melakukan hal berikut:
$smtp_mailer = new SMTPMailer; $mailgun_mailer = new MailgunMailer;
Ini akan mereferensikan kelas aslinya.
Beberapa mungkin bingung bahwa jika tidak ada nama kelas yang mirip maka tidak ada penggunaan
use
kata kunci. Nah, Anda dapat menggunakan__autoload($class)
fungsi yang akan dipanggil secara otomatis ketikause
pernyataan dieksekusi dengan kelas untuk digunakan sebagai argumen dan ini dapat membantu Anda memuat kelas pada saat run-time dengan cepat jika diperlukan.Lihat jawaban ini untuk mengetahui lebih lanjut tentang pemuat otomatis kelas.
sumber
use
pernyataan cara akan memberi tahu kompiler memuat ini untuk saya sekarang. Oke sayang!Jangan terlalu memikirkan apa itu Namespace .
Namespace pada dasarnya hanyalah awalan Kelas (seperti direktori di Sistem Operasi) untuk memastikan keunikan jalur Kelas .
Juga hanya untuk memperjelas, pernyataan use tidak melakukan apapun hanya aliasing Namespaces Anda sehingga Anda dapat menggunakan pintasan atau menyertakan Kelas dengan nama yang sama tetapi Namespace berbeda dalam file yang sama.
Misalnya:
// You can do this at the top of your Class use Symfony\Component\Debug\Debug; if ($_SERVER['APP_DEBUG']) { // So you can utilize the Debug class it in an elegant way Debug::enable(); // Instead of this ugly one // \Symfony\Component\Debug\Debug::enable(); }
Jika Anda ingin mengetahui cara kerja PHP Namespaces dan autoloading (cara lama dan juga cara baru dengan Composer), Anda dapat membaca postingan blog yang baru saja saya tulis tentang topik ini: https://enterprise-level-php.com/ 2017/12/25 / the-magic-behind-autoloading-php-files-using-composer.html
sumber
Anda harus menyertakan / memerlukan kelas, jika tidak PHP tidak akan tahu tentang namespace.
Anda tidak perlu melakukannya di file yang sama . Anda dapat melakukannya dalam file bootstrap misalnya. (atau gunakan autoloader, tapi sebenarnya bukan itu topiknya)
sumber
Masalahnya kemungkinan besar Anda perlu menggunakan pemuat otomatis yang akan mengambil nama kelas (putus dengan '\' dalam kasus ini) dan memetakannya ke struktur direktori.
Anda dapat melihat artikel ini tentang fungsionalitas pemuatan otomatis PHP. Ada banyak implementasi dari jenis fungsionalitas ini dalam kerangka kerja.
Saya sebenarnya telah menerapkannya sebelumnya. Ini tautannya .
sumber
Saya setuju dengan Green, Symfony membutuhkan namespace, jadi mengapa tidak menggunakannya?
Beginilah cara kelas contoh pengontrol dimulai:
sumber
Anda tidak dapat melakukannya seperti itu selain contoh di atas. Anda juga dapat menggunakan kata kunci
use
di dalam kelas untuk mengimpor sifat , seperti ini:trait Stuff { private $baz = 'baz'; public function bar() { return $this->baz; } } class Cls { use Stuff; // import traits like this } $foo = new Cls; echo $foo->bar(); // spits out 'baz'
sumber
Kata
use
kuncinya adalah untuk aliasing di PHP dan tidak mengimpor kelas. Ini sangat membantu1) Ketika Anda memiliki kelas dengan nama yang sama di ruang nama yang berbeda
2) Hindari menggunakan nama kelas yang sangat panjang berulang kali.
sumber
Namespace digunakan untuk menentukan jalur ke file tertentu yang berisi kelas misalnya
namespace album/className; class className{ //enter class properties and methods here }
Anda kemudian dapat memasukkan kelas khusus ini ke dalam file php lain dengan menggunakan kata kunci "gunakan" seperti ini:
use album/className; class album extends classname { //enter class properties and methods }
CATATAN: Jangan gunakan jalur ke file yang berisi kelas yang akan diimplementasikan, memperluas penggunaan untuk membuat instance objek tetapi hanya menggunakan namespace.
sumber
Menggunakan kata kunci "gunakan" untuk mempersingkat literal namespace. Anda dapat menggunakan keduanya dengan aliasing dan tanpa aliasing. Tanpa aliasing Anda harus menggunakan bagian terakhir dari namespace lengkap.
<?php use foo\bar\lastPart; $obj=new lastPart\AnyClass(); //If there's not the line above, a fatal error will be encountered. ?>
sumber