Konstanta di PHP. Membuat konstanta di PHP - const dan define() File konstanta Php




Hari baik untuk semuanya. Alexei Gulynin menghubungi kami. Dalam artikel terakhir kita melihat operator kesetaraan di PHP. Pada artikel ini saya ingin berbicara tentang konstanta dalam PHP. Di sekolah, Anda sering menjumpai konstanta, misalnya “bilangan PI” atau dari fisika konstanta gas universal (R). Konstanta didefinisikan satu kali dan mereka tidak berubah lagi. Hal yang sama berlaku untuk konstanta dalam pemrograman, mis. kita mendefinisikan sebuah konstanta satu kali dan tidak pernah berubah dalam kode program. Konstanta dapat berupa berbagai nilai matematika, jalur ke file.

Apa perbedaan konstanta dengan variabel:

1) Didefinisikan satu kali dan tidak dapat diberi nilai di tempat lain,
2) Untuk merujuknya, Anda tidak perlu memberi tanda “$” di depannya (ada minus di sini - sekarang kita tidak dapat menggunakan nama konstanta dalam string teks).
Mari kita cetak konstanta "PI":

Ada dua jenis konstanta: ditentukan oleh juru bahasa dan ditentukan oleh pengguna:

Contoh konstanta yang didefinisikan oleh interpreter:

1) __FILE__ - menyimpan nama file yang berisi kode yang sedang dieksekusi,
2) PHP_VERSION - versi penerjemah PHP,
3) PHP_OS - versi sistem operasi tempat PHP dijalankan.

Ketik kode berikut dan lihat konstanta lain yang ada:

Anda dapat menentukan konstanta Anda sendiri, ini dilakukan dengan menggunakan operator definisikan. Mari kita definisikan 2 konstanta:

"; gema Const2; ?>

Dalam hal ini, kami akan menampilkan nilai konstanta tersebut.

Secara default, nama konstanta peka huruf besar-kecil; ia dapat dinonaktifkan menggunakan parameter opsional ketiga, seperti ini:

"; echo baru1; ?>

Anda akan melihat bahwa semuanya berfungsi (dalam contoh sebelumnya ini tidak akan berfungsi, karena peka huruf besar-kecil).

Perhatikan tanda kutip yang menuliskan nama konstanta. Ini adalah suatu keharusan. Selain itu, Anda tidak dapat membuat konstanta dengan nama yang sama.

Di PHP Anda dapat memeriksa apakah suatu konstanta ada atau tidak menggunakan fungsi tersebut didefinisikan (nama konstan). Mari kita lihat contoh untuk memperjelasnya:

Ketik contoh ini dan lihat apa yang terjadi.

(PHP 5 >= 5.3.0, PHP 7)

Daftar pertanyaan ini dibagi menjadi dua bagian: pertanyaan umum dan beberapa spesifik implementasi yang berguna untuk pemahaman yang lebih lengkap.

Pertama, pertanyaan umum.

  1. Jika saya tidak menggunakan namespace, apakah semua ini harus dianggap penting?
  2. Bagaimana cara menggunakan kelas dalam atau global dalam namespace?
  3. Bagaimana cara menggunakan fungsi kelas di ruang nama, atau konstanta di ruang namanya sendiri?
  4. Bagaimana nama seperti itu \namaku atau \nama dikonversi?
  5. Seperti nama seperti namaku dikonversi?
  6. Seperti nama kelas yang tidak memenuhi syarat seperti nama dikonversi?
  7. Seperti nama fungsi yang tidak memenuhi syarat atau nama konstanta yang tidak memenuhi syarat seperti nama dikonversi?

Beberapa detail implementasi namespace yang berguna untuk dipahami.

  1. Nama yang diimpor tidak boleh bertentangan dengan kelas yang ditentukan dalam file yang sama.
  2. Baik fungsi maupun konstanta tidak dapat diimpor menggunakan operator menggunakan.
  3. Nama namespace dinamis (pengidentifikasi diapit tanda kutip) harus keluar dari karakter garis miring terbalik.
  4. Anda tidak dapat merujuk ke konstanta yang tidak terdefinisi menggunakan garis miring terbalik. Kesalahan fatal ditampilkan
  5. Tidak mungkin mengganti konstanta khusus seperti NULL, TRUE, FALSE, ZEND_THREAD_SAFE, atau ZEND_DEBUG_BUILD

Jika saya tidak menggunakan namespace, apakah semua ini harus dianggap penting?

TIDAK. Namespace tidak berpengaruh pada kode apa pun yang ada dalam bentuk apa pun atau pada kode apa pun yang ditulis yang tidak mengandung namespace. Anda dapat menulis kode seperti ini jika Anda mau:

Contoh #1 Mengakses kelas global di luar namespace

$a = baru \ stdKelas ;
?>

Ini secara fungsional setara dengan yang berikut:

Contoh #2 Mengakses kelas global di luar namespace

$a = kelas std baru;
?>

Bagaimana cara menggunakan kelas dalam atau global dalam namespace?

Contoh #3 Mengakses Kelas Dalam di Namespace

ruang nama foo ;
$a = baru \ stdKelas ;

tes fungsi (\ArrayObject $type petunjukcontoh = null ) ()

$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;

// perluasan kelas internal atau global
kelas MyException meluas\Exception()
?>

Bagaimana cara menggunakan fungsi kelas di ruang nama atau konstanta di ruang namanya sendiri?

Contoh #4 Mengakses Kelas Dalam, Fungsi, atau Konstanta di Ruang Nama

ruang nama foo ;

kelas Kelasku()

// menggunakan kelas dari namespace saat ini
tes fungsi (Kelas Saya $type petunjukcontoh = null ) ()
// cara lain untuk menggunakan kelas dari namespace saat ini
tes fungsi(\foo\MyClass $typehintexample = null)()

// memperluas kelas dari namespace saat ini
kelas Diperluas memperluas Kelas Saya()

// akses ke fungsi global
$a = \globalfunc();

// akses ke konstanta global
$b = \INI_ALL ;
?>

Bagaimana nama seperti itu \namaku atau \nama dikonversi?

Nama yang dimulai dengan \ selalu diubah menjadi seperti apa, mis. \namaku- ini sebenarnya namaku, Dan \Pengecualian- Ini Pengecualian.

Contoh #5 Nama mutlak

ruang nama foo ;
$a = baru \ nama saya (); // membuat instance kelas "nama\saya"
echo\strlen("hai"); // memanggil fungsi "strlen".
$a = \INI_ALL ; // variabel $a diberi nilai konstanta "INI_ALL"
?>

Seperti nama seperti namaku dikonversi?

Nama yang mengandung garis miring terbalik tetapi tidak diawali dengan garis miring terbalik, misalnya namaku

-ku nama lain, maka sinonim ini berlaku untuk -ku V namaku.

namaku.

Contoh #6 Nama lengkap

ruang nama foo ;
gunakan bla \ bla sebagai foo ;

$a = baru nama saya(); // membuat instance kelas "foo\my\name"
foo\bar::nama(); // memanggil metode statis "nama" di kelas "blah\blah\bar"
saya\bar(); // memanggil fungsi "foo\my\bar"
$a = saya\BAR; // memberikan variabel $a nilai konstanta "foo\my\BAR"
?>

Seperti nama kelas yang tidak memenuhi syarat seperti nama dikonversi?

Nama kelas yang tidak mengandung garis miring terbalik, misalnya nama dapat dikonversi dengan dua cara berbeda.

Jika ada ekspresi impor yang menciptakan sinonim nama nama lain, maka sinonim ini digunakan.

Jika tidak, nama namespace saat ini akan menjadi awalan ke namaku.

Contoh #7 Nama kelas tidak memenuhi syarat

ruang nama foo ;
gunakan bla \ bla sebagai foo ;

$a = nama baru(); // membuat instance kelas "foo\name"
foo::nama(); // memanggil metode statis "nama" di kelas "bla\bla"
?>

Seperti nama fungsi yang tidak memenuhi syarat atau nama konstanta yang tidak memenuhi syarat seperti nama dikonversi?

Nama fungsi atau konstanta yang tidak mengandung garis miring terbalik, misalnya nama dapat dikonversi dengan dua cara berbeda.

Pertama, nama namespace saat ini diawali dengan nama.

Lalu jika konstanta atau fungsinya nama tidak ada di namespace saat ini, menggunakan konstanta atau fungsi global nama, jika ada.

Contoh #8 Fungsi atau nama konstanta tidak lengkap

ruang nama foo ;
gunakan bla \ bla sebagai foo ;

konstanta FOO = 1;

fungsi saya()()
fungsi foo()()
pengurutan fungsi (& $a )
{
\sort($a); // memanggil fungsi global "sort"
$a = array_flip($a);
kembalikan $a;
}

Ku(); // memanggil "foo\my"
$a = strlen("hai"); // memanggil fungsi global "strlen" karena "foo\strlen" tidak ada
$arr = susunan(1, 3, 2);
$b = urutkan($arr); // memanggil fungsi "foo\sort"
$c = foo(); // memanggil fungsi "foo\foo" - impor tidak diterapkan

$a = FOO ; // memberikan variabel $a nilai konstanta "foo\FOO" - impor tidak diterapkan
$b = INI_SEMUA ; // memberikan variabel $b nilai konstanta global "INI_ALL"
?>

Nama yang diimpor tidak boleh bertentangan dengan kelas yang ditentukan dalam file yang sama.

Kombinasi skrip berikut ini valid:

namespace barang\saya;
kelas Kelasku()
?>

namespace yang lain;
hal kelas()
?>

namespace barang\saya;
sertakan "file1.php" ;
sertakan "lainnya.php" ;


$a = Kelas Saya baru; // membuat instance kelas "benda" dari namespace "lainnya"
?>

Tidak ada konflik nama meskipun kelasnya Kelasku ada di dalam namespace barang-barang saya karena definisi MyClass ada di file terpisah. Namun, contoh berikut menghasilkan kesalahan konflik nama yang fatal karena kelas MyClass didefinisikan dalam file yang sama di mana pernyataan penggunaan berada.

namespace barang\saya;
gunakan \ hal lain sebagai MyClass ;
kelas Kelasku() // kesalahan fatal: Kelas Saya bertentangan dengan ekspresi impor
$a = Kelas Saya baru;
?>

Namespace bersarang tidak diperbolehkan.

PHP tidak mengizinkan namespace untuk disarangkan satu sama lain

namespace barang\saya(
ruang nama bersarang (
kelas foo()
}
}
?>

Namun, untuk mensimulasikan namespace bersarang seperti ini:

namespace milikku\barang\bersarang (
kelas foo()
}
?>

Sebelum PHP 5.6, baik fungsi maupun konstanta tidak dapat diimpor menggunakan operator menggunakan.

Sebelum PHP 5.6, satu-satunya elemen yang dipengaruhi oleh operator adalah menggunakan adalah namespace dan nama kelas. Untuk mempersingkat nama konstanta atau fungsi yang panjang, impor kontennya ke dalam namespace.

ruang nama milikku;
gunakan ultra\long\ns\nama;

$a = nama \ KONSTAN ;
nama\fungsi();
?>

Sejak PHP 5.6, impor dan pembuatan alias untuk fungsi dan nama konstanta dapat dilakukan.

Nama namespace dinamis (pengidentifikasi diapit tanda kutip) harus keluar dari karakter garis miring terbalik.

Sangat penting untuk merepresentasikan hal ini karena garis miring terbalik digunakan sebagai karakter escape di dalam string. Itu harus selalu diduplikasi ketika digunakan dalam string, jika tidak, ada risiko konsekuensi yang tidak diinginkan:

Contoh #9 Kesalahan saat menggunakan nama namespace di dalam string yang diberi tanda kutip ganda

$a = "nama\berbahaya" ; // \n adalah baris baru dalam string yang diberi tanda kutip ganda!
$obj = baru $a ;

$a = "tidak\sama sekali\berbahaya" ; // tidak ada masalah di sini.
$obj = baru $a ;
?>

Dalam string yang diberi tanda kutip tunggal, garis miring terbalik sebagai pembatas lebih aman, namun praktik yang direkomendasikan untuk menghindari garis miring terbalik di semua string masih merupakan praktik terbaik.

Anda tidak dapat merujuk ke konstanta yang tidak terdefinisi menggunakan garis miring terbalik. Kesalahan fatal ditampilkan

Konstanta tak terdefinisi apa pun yang merupakan nama wajar tanpa pengecualian, misalnya FOO, akan menghasilkan pesan yang menyatakan bahwa PHP telah berasumsi demikian FOO adalah nilai konstanta. Konstanta apa pun, dengan nama yang memenuhi syarat atau absolut, yang mengandung karakter garis miring terbalik akan mengakibatkan kesalahan fatal jika tidak ditemukan.

Contoh #10 Konstanta tak terdefinisi

bilah ruang nama;
$a = FOO ; // menampilkan peringatan: konstanta tidak terdefinisi "FOO" diasumsikan "FOO";
$a = \FOO ; // kesalahan fatal: konstanta namespace tidak terdefinisi FOO
$a = Batang\FOO; // kesalahan fatal: konstanta namespace tidak terdefinisi bar\Bar\FOO
$a = \Bar \FOO ; // kesalahan fatal: konstanta namespace tidak terdefinisi Bar\FOO
?>

Tidak mungkin mengganti konstanta khusus seperti NULL, TRUE, FALSE, ZEND_THREAD_SAFE, atau ZEND_DEBUG_BUILD

Setiap upaya untuk mendefinisikan konstanta namespace yang cocok dengan nama konstanta bawaan khusus akan menghasilkan kesalahan fatal.

Contoh #11 Konstanta tak terdefinisi

bilah ruang nama;
konstanta NULL = 0; // Kesalahan fatal;
const true = "bodoh"; // juga kesalahan fatal;
// dll.
?>

7 tahun yang lalu

Ada cara untuk mendefinisikan konstanta dengan namespace yang merupakan konstanta bawaan khusus, menggunakan fungsi definisikan dan menyetel parameter ketiga case_insensitive ke false:

ruang nama foo ;
mendefinisikan (__NAMESPACE__ . "\NULL" , 10 ); // mendefinisikan konstanta NULL pada namespace saat ini


?>

Tidak perlu menentukan namespace dalam panggilan Anda ke define(), seperti yang biasa terjadi
ruang nama foo ;
definisikan(INI_ALL, "batang"); // menghasilkan pemberitahuan - Konstanta INI_ALL sudah ditentukan. Tetapi:

Tentukan (__NAMESPACE__ . "\INI_ALL" , "bar" ); // mendefinisikan konstanta INI_ALL pada namespace saat ini
var_dump(INI_ALL); // akan menampilkan string(3)"bilah". Tidak ada yang tidak terduga sejauh ini. Tetapi:

Define("NULL", 10); // mendefinisikan konstanta NULL pada namespace saat ini...
var_dump(BATAL); // akan menampilkan 10
var_dump(nol); // akan menampilkan NULL
?>

Jika parameter case_insensitive diatur ke true
ruang nama foo ;
mendefinisikan (__NAMESPACE__ . "\NULL" , 10 , benar ); // menghasilkan pemberitahuan - Konstanta null sudah ditentukan
?>

3 tahun yang lalu

Saat membuat kelas atau memanggil metode statis dari dalam namespace menggunakan variabel, Anda harus ingat bahwa mereka memerlukan namespace lengkap agar kelas yang sesuai dapat digunakan; Anda TIDAK BISA menggunakan alias atau nama pendek, meskipun dipanggil dalam namespace yang sama. Mengabaikan hal ini dapat menyebabkan kode Anda menggunakan kelas yang salah, memunculkan pengecualian kelas yang hilang, atau menimbulkan kesalahan atau peringatan.

Dalam kasus ini, Anda dapat menggunakan konstanta ajaib __NAMESPACE__, atau menentukan namespace lengkap dan nama kelas secara langsung. Fungsi class_exists juga memerlukan namespace lengkap dan nama kelas, dan dapat digunakan untuk memastikan bahwa kesalahan fatal tidak akan terjadi karena kelas hilang.

Ruang nama foo ;
bilah kelas (
tes fungsi statis publik() (
kembalikan get_call_class();
}
}

ruang nama Foo\Foo;
kelas Bar meluas \Foo \Bar (
}

Var_dump(Bilah::tes()); // string(11) "Foo\Foo\Bar"

$bar = "Foo\Bar" ;
var_dump($bar::tes()); // string(7) "Foo\Bar"

$bar = __NAMESPACE__ . "\Batang" ;
var_dump($bar::tes()); // string(11) "Foo\Foo\Bar"

$bar = "Bilah" ;
var_dump($bar::tes()); // KESALAHAN FATAL: Kelas "Bar" tidak ditemukan atau Kelas \Bar salah digunakan

Dalam catatan ini kita akan berbicara tentang konstanta. Seperti biasa, mari kita lihat konsep konstanta dalam bahasa pemrograman dan lihat bagaimana konstanta tersebut dideklarasikan dan digunakan konstanta dalam PHP.

Konsep konstanta dan konstanta di PHP

Kata konstanta seharusnya sudah tidak asing lagi bagi Anda dari matematika:

“Konstanta matematis- besaran yang nilainya tidak berubah.”

Itu sama di PHP. Konstan di PHP adalah pengidentifikasi yang berfungsi untuk menunjukkan nilai sederhana (string, beberapa angka) yang tidak dapat diubah selama eksekusi kode.

Untuk mendeklarasikan sebuah konstanta (memberi nilai padanya), gunakan fungsi mendefinisikan. Contoh deklarasi konstanta:

Nama konstanta di PHP peka terhadap huruf besar-kecil (huruf besar dan kecil berbeda), jadi Anda perlu berhati-hati. Ada juga konvensi bahwa nama konstanta selalu ditulis dalam huruf besar.

Nama konstanta harus diawali dengan huruf atau garis bawah “_” dan dapat terdiri dari huruf, angka, dan garis bawah.

Mari kita lihat contoh sederhana penggunaan konstanta:

Dalam contoh ini, kami mendeklarasikan sebuah konstanta dan menggunakannya dalam program.

Untuk apa konstanta digunakan dan bukankah lebih mudah menggunakan variabel?

Seperti yang telah disebutkan, konstanta tidak dapat mengubah nilainya selama eksekusi program. Konstanta biasanya menyimpan parameter situs permanen, seperti rincian akses database (host, login pengguna dan kata sandi, nama database), lokasi situs pada disk, dan banyak pengaturan lainnya.

Jika kita menggunakan variabel, maka skrip mungkin secara tidak sengaja (jika terjadi kesalahan) mengubah nilai variabel dan tidak akan berfungsi sesuai keinginan Anda.

Menggunakan konstanta memastikan bahwa nilai yang Anda tentukan saat mendeklarasikan konstanta tetap tidak berubah.

PHP memiliki seperangkat konstanta khusus dan metode ajaib untuk proyek Anda. Tidak seperti konstanta biasa, yang dapat diatur menggunakan mendefinisikan() , arti dari konstanta yang telah ditentukan bergantung pada tempat penggunaannya dan merupakan informasi hanya-baca tentang kode dan sistem PHP. Metode ajaib dapat digunakan di kelas Anda untuk mendapatkan akses ke fungsionalitas PHP khusus.

Dalam tutorial ini kita akan melihat beberapa konstanta berguna dan metode ajaib dengan contoh penggunaan dalam kode.

Konstanta yang Telah Ditentukan Sebelumnya

Konstanta yang telah ditentukan sebelumnya digunakan untuk memperoleh informasi tentang kode Anda. Nama konstanta tersebut ditulis dengan huruf kapital di antara garis bawah ganda, misalnya __LINE__ dan __FILE__ . Berikut adalah beberapa konstanta standar berguna yang tersedia di PHP:

  • __LINE__ mengembalikan nomor baris dalam file sumber tempat konstanta digunakan:

  • __FILE__ mewakili nama file, termasuk path lengkap:

  • __DIR__ hanya mewakili jalur file:

  • __CLASS__ mewakili nama kelas saat ini:

  • __FUNCTION__ mewakili nama fungsi saat ini:

  • __METHOD__ mewakili nama metode saat ini:

  • __NAMESPACE__ mewakili nama namespace saat ini:

Metode ajaib

Metode ajaib menyediakan pengait untuk fungsionalitas PHP khusus. Namanya ditulis dengan huruf kecil dengan dua garis bawah di depannya, misalnya __construct() dan __destruct() .

Construct() adalah metode ajaib yang dipanggil PHP untuk membuat instance kelas Anda. Ia menerima sejumlah argumen.

Destruct() adalah metode ajaib yang dipanggil ketika suatu objek dihancurkan oleh kolektor PHP. Metode ini tidak memerlukan argumen dan biasanya digunakan untuk melakukan operasi khusus, seperti menutup koneksi database.

Beberapa metode ajaib berikutnya dirancang untuk memanipulasi properti, dan menyediakan cara bagi PHP untuk menangani panggilan ke properti dan metode yang belum ditentukan (atau tidak tersedia).

PHP memanggil metode __get() dalam konteks penerimaan jika properti tidak ditentukan (atau tidak tersedia). Metode ini mengambil satu argumen - nama properti. Ini harus mengembalikan nilai yang akan diperlakukan sebagai nilai properti.

Metode __set() dipanggil pada properti yang tidak ditentukan dalam konteks pengaturan. Metode ini membutuhkan dua argumen, nama properti dan nilainya.

myAarray[$prop] = $nilai; ) fungsi publik __get($prop) ( return $this->myArray[$prop]; ) fungsi publik __isset($prop) ( return isset($this->myArray[$prop]); ) fungsi publik __unset($prop) ) ( unset($this->myArray[$prop]); ) fungsi publik __toString() ( return __CLASS__ . ":" . $this->name; ) ) $obj = new MySample(); if (!isset($obj->nama)) ( $obj->nama = "Alireza"; ) echo $obj->nama; // Alireza echo $obj; // Contoh Saya: Alireza

Pada kode di atas, properti name tidak didefinisikan di kelas. Kode mencoba menyetel properti ini ke “Alireza” dan PHP memanggil metode ajaib __set(). Dibutuhkan "name" sebagai $prop dan "Alireza" sebagai $value , dan menyimpan nilainya dalam array pribadi $myArray . Metode __get() bekerja dengan cara yang sama. Saat mencetak $obj->name, metode __get() dipanggil dan nilai “name” diteruskan ke metode tersebut sebagai argumen $prop.

Ada metode ajaib lain yang membantu memanipulasi properti yang tidak tersedia, seperti pada contoh yang diberikan: __isset() , __unset() dan __toString() . Metode __isset() dan __unset() dijalankan oleh fungsi dengan nama yang sama, tetapi tanpa garis bawah di PHP.

Isset() memeriksa apakah suatu properti disetel atau tidak. Metode ini mengambil satu argumen - properti yang perlu diperiksa. Metode __unset() mengambil satu argumen, nama properti yang akan direset.

Dalam banyak kasus, lebih mudah untuk merepresentasikan suatu objek sebagai string, misalnya, untuk keluaran ke pengguna atau proses lain. Biasanya PHP mewakili objek sebagai pengidentifikasi dalam memori, yang buruk untuk fungsi seperti ini. Metode __toString() membantu merepresentasikan objek sebagai string. Metode ini berjalan dalam banyak situasi di mana suatu objek digunakan sebagai string, misalnya echo "Hello $obj" . Itu juga bisa dipanggil secara langsung seperti metode publik lainnya.

Untuk setiap skrip yang dieksekusi. Banyak dari konstanta ini ditentukan oleh berbagai modul dan hanya akan ada jika modul tersebut tersedia melalui pemuatan dinamis atau melalui perakitan statis.

Ada sembilan konstanta ajaib yang mengubah maknanya tergantung pada konteks penggunaannya. Misalnya saja nilainya __GARIS__ bergantung pada baris dalam skrip yang menentukan konstanta ini. Semua konstanta ajaib diselesaikan pada waktu kompilasi, tidak seperti konstanta biasa, yang diselesaikan pada waktu proses. Konstanta khusus tidak peka huruf besar-kecil dan tercantum di bawah ini:

Beberapa konstanta ajaib PHP
Nama Keterangan
__GARIS__ Nomor baris saat ini dalam file.
__MENGAJUKAN__ Jalur lengkap dan nama file saat ini dengan symlink yang diperluas. Jika digunakan di dalam file yang disertakan, nama file ini dikembalikan.
__DIR__ Direktori berkas. Jika digunakan di dalam file yang disertakan, direktori file tersebut dikembalikan. Ini setara dengan menelepon nama dir(__FILE__). Nama direktori yang dikembalikan tidak diakhiri dengan garis miring, kecuali direktori root.
__FUNGSI__ Nama fungsi atau (penutup) dalam kasus fungsi anonim.
__KELAS__ Nama kelas. Nama ini berisi nama namespace tempat kelas dideklarasikan (misalnya, Foo\Bar). Harap dicatat bahwa sejak PHP 5.4 __CLASS__ juga berfungsi dalam sifat. Ketika digunakan dalam metode sifat, __CLASS__ adalah nama kelas di mana metode tersebut digunakan.
__SIFAT__ Nama sifat. Nama ini berisi nama namespace tempat sifat tersebut dideklarasikan (misalnya, Foo\Bar).
__METODE__ Nama metode kelas.
__NAMESPACE__ Nama namespace saat ini.
Nama Kelas::kelas Nama kelas lengkap (termasuk namespace). Lihat juga ::kelas.

Lihat juga dapatkan_kelas(), dapatkan_objek_vars(), file_ada() Dan fungsi_ada().

Daftar perubahan

14 tahun yang lalu

Perbedaan antara
__FUNCTION__ dan __METHOD__ seperti pada PHP 5.0.4 adalah itu

FUNCTION__ hanya mengembalikan nama fungsi

sedangkan __METHOD__ mengembalikan nama kelas beserta nama fungsinya

trik kelas
{
fungsi lakukan()
{
gema __FUNGSI__;
}
fungsi lakukan lagi()
{
gema __METODE__;
}
}
$obj=trik baru();
$obj->lakukan();
outputnya akan ---- lakukan
$obj->lakukan lagi();
keluarannya adalah ----- trik::lakukan lagi

12 tahun yang lalu

Konstanta ajaib __CLASS__ melengkapi fungsi get_class() dengan baik.

Terkadang Anda perlu mengetahui keduanya:
- nama kelas yang diwarisi
- nama kelas yang sebenarnya dieksekusi

Berikut ini contoh yang menunjukkan solusi yang mungkin:

Kelas dasar_kelas
{
fungsi say_a()
{

" ;
}

Fungsi say_b()
{

" ;
}

kelas kelas_turunan memperluas kelas_dasar
{
fungsi say_a()
{
induk::say_a();
gema ""a" - kata " . __KELAS__ . "
" ;
}

Fungsi say_b()
{
induk::say_b();
gema ""b" - kata " . get_class($ini) . "
" ;
}
}

$obj_b = kelas_turunan baru();

$obj_b -> say_a();
gema "
" ;
$obj_b -> say_b();

?>

Outputnya akan terlihat seperti ini:

"a" - kata kelas_dasar
"a" - kata kelas_turunan

"b" - kata kelas_turunan
"b" - kata kelas_turunan

3 tahun yang lalu

Perhatikan sedikit ketidakkonsistenan saat menggunakan __CLASS__ dan __METHOD__ dalam sifat (stand php 7.0.4): Meskipun __CLASS__ berfungsi seperti yang diiklankan dan mengembalikan secara dinamis nama kelas tempat sifat tersebut digunakan, __METHOD__ sebenarnya akan menambahkan nama sifat alih-alih nama kelas!

8 tahun yang lalu

Tidak ada cara untuk mengimplementasikan __DIR__ yang kompatibel di versi sebelum 5.3.0.

Satu-satunya hal yang dapat Anda lakukan adalah melakukan pencarian rekursif dan mengganti ke dirname(__FILE__):
menemukan . -ketik f -cetak0 | xargs -0 sed -i "s/__DIR__/dirname(__FILE__)/"

5 tahun lalu

Banyak catatan di sini berkaitan dengan pendefinisian konstanta ajaib __DIR__ untuk versi PHP yang tidak mendukung fitur tersebut. Tentu saja Anda dapat mendefinisikan konstanta ajaib ini untuk versi PHP yang belum memiliki konstanta ini, tetapi ini akan menggagalkan tujuannya segera setelah Anda menggunakan konstanta dalam file yang disertakan, yang mungkin berada di direktori berbeda dari file yang mendefinisikan konstanta __DIR__ . Dengan demikian, konstanta tersebut telah kehilangan *keajaibannya*, dan menjadi tidak berguna kecuali Anda meyakinkan diri sendiri untuk memasukkan semua penyertaan Anda ke dalam direktori yang sama.

Kesimpulan: perhatian pada catatan gmail dot com mengenai apakah Anda dapat atau tidak dapat mendefinisikan konstanta ajaib adalah valid, tetapi menyatakan bahwa mendefinisikan __DIR__ bukannya tidak berguna, bukan!

7 tahun yang lalu

Anda tidak dapat memeriksa apakah konstanta ajaib ditentukan. Ini berarti tidak ada gunanya memeriksa apakah __DIR__ sudah didefinisikan lalu mendefinisikannya. `didefinisikan("__DIR__")` selalu mengembalikan nilai salah. Mendefinisikan __DIR__ akan gagal secara diam-diam di PHP 5.3+. Hal ini dapat menyebabkan masalah kompatibilitas jika skrip Anda menyertakan skrip lain.

echo (didefinisikan ("__DIR__" ) ? "__DIR__ ditentukan" : "__DIR__ TIDAK ditentukan" . PHP_EOL );
echo (didefinisikan ("__FILE__" ) ? "__FILE__ didefinisikan" : "__FILE__ TIDAK ditentukan" . PHP_EOL );
echo (didefinisikan ("PHP_VERSION" ) ? "PHP_VERSION ditentukan" : "PHP_VERSION TIDAK ditentukan" ) . PHP_EOL;
gema "Versi PHP: " . PHP_VERSION. PHP_EOL;
?>
Keluaran:
__DIR__ TIDAK ditentukan
__FILE__ TIDAK didefinisikan
PHP_VERSION didefinisikan
Versi PHP: 5.3.6