Di sebagian besar bahasa pemrograman, variabel tidak memiliki karakter pengidentifikasi seperti yang mereka lakukan di PHP. Di PHP Anda harus awalan variabel dengan $
karakter.
Contoh;
var $foo = "something";
echo $foo;
Saya sedang mengembangkan bahasa scripting baru untuk aplikasi bisnis, dan target pengguna saya tidak memiliki latar belakang pemrograman. Apakah karakter ini membuat kode lebih mudah dibaca dan digunakan?
Salah satu alasan PHP menggunakan $
adalah karena tanpanya PHP tidak dapat memberi tahu apakah nama adalah referensi fungsi atau referensi variabel. Ini karena bahasa memungkinkan referensi aneh untuk fungsi. Jadi $
simbol membantu parser memisahkan namespace.
Saya tidak memiliki masalah ini di parser saya. Jadi pertanyaan saya murni pada keterbacaan dan kemudahan penggunaan. Saya telah mengkodekan selama bertahun-tahun dalam PHP sehingga ketika saya melihatnya $foo
mudah bagi saya untuk mengidentifikasi ini sebagai variabel. Apakah saya hanya memberikan preferensi bias ke pengidentifikasi ini?
sumber
sigils
tiga kali hari ini dalam percakapan.var $x = ...
atautype $x = ...
kemudian saya pikir $ berlebihan. Jika Anda baru saja melakukannya$x = ...
maka itu layak dilakukan. Terutama jika Anda tidak ingin mendukung penyorotan sintaks pada editor umum. Namun, sebagai preferensi, saya tidak sukasigils
Jawaban:
Kemungkinan dan keterbatasan teknis yang sebenarnya tidak seperti yang disarankan di seluruh utas ini. Mari kita bersihkan dulu.
Inilah yang dimungkinkan oleh $ dalam PHP:
$return
atau dapat menggunakan nama yang sama untuk variabel dan fungsi misalnya konstanta$__FILE__
Batasan atau fitur yang tidak terkait dengan $ awalan:
Itu berarti tidak ada alasan teknis yang tidak bisa Anda miliki
atau
Namun Anda tidak dapat memiliki (dengan asumsi
return
kata kunci)Tanpa komplikasi serius. Jika Anda menggunakan awalan seperti
$
, maka itu tidak akan menjadi masalah.Itu pendapat tetapi saya percaya sigil akan layak untuk non programmer karena memungkinkan mereka untuk menggunakan kata kunci sebagai nama variabel, bagi mereka itu akan terlihat seperti batasan sewenang-wenang: P
sumber
return = "something";
, C # memiliki "kata kunci kontekstual", yang juga merupakan opsi yang patut dicoba saat merancang bahasa.@return = "something;"
. Ada sejumlah kata kunci kontekstual, ya, tetapi membuat semuanya kontekstual akan berarti implementasi yang jauh lebih rumit.Sigils sebenarnya jauh lebih masuk akal dalam perl, di mana mereka memberikan sejumlah jenis pemeriksaan. Dalam php mereka tidak banyak membantu di luar templating. Anda bisa merasakan kegunaan dan keterbacaannya dengan melihat-lihat berbagai bahasa. Hampir tidak ada yang menggunakannya.
Dalam bahasa target pengguna akhir yang sedang saya kerjakan, saya bahkan melangkah lebih jauh, membuat pengidentifikasi case sensitif dan memungkinkan spasi dan apostrof. Itu memungkinkan saya membuat nama variabel seperti
Karl's height
itu lebih dekat ke bahasa alami.sumber
At Karl's for the night = true;
map sum
adalah panggilan fungsi yang diterapkan sebagian - fungsisum
dilewatkan sebagai parametermap
. Tetapi keduanya hanyalah nama perpustakaan, jadi dengan pengidentifikasi multi-kata, kompiler tidak dapat mengetahui apakahmap sum
ini merupakan pengenal multi-kata atau aplikasi fungsi berdasarkan pada dua pengenal satu kata.Bertahun-tahun yang lalu, saya belajar Applesoft Basic. String selalu sufiks dengan
$
dan array memiliki sufiks%
. Itulah cara kerjanya. Anda melihat sesuatu, Anda tahu apa itu. Saya tidak pernah menyelidiki terlalu jauh ke dalam juru bahasa untuk memahami mengapa ini adalah kasus atau keputusan desain yang membuatnya begitu.Sigil di php berasal dari pengaruh perlnya (yang dipengaruhi oleh
awk
dansh
). Sigil dalam perl sedikit lebih dari sekadar$
karena dapat mengidentifikasi berbagai jenis:$
skalar@
daftar%
hash&
kode kunci*
typeglobSigil mengidentifikasi bagian struktur tabel simbol apa yang Anda lihat. Di belakang layar, entri tabel simbol untuk foo (diakses melalui
*foo
- typeglob) memiliki semua yang mungkin foo. Ada$foo
,@foo
,%foo
, yang format yangfoo
,&foo
, foo filehandle, dll ...Ini juga memungkinkan membuat alias dari satu variabel ke variabel lain:
Cetakan ini
foo 1 2
- di perl, ini adalah apa yang sigils yang benar-benar untuk, tidak bahwa Anda harus melakukan ini melainkan bahwa ada ini di balik hal adegan yang mereka lakukan.Sigil tidak begitu banyak untuk dibaca, melainkan agar seseorang dapat memiliki
$foo
dan@foo
tanpa tabrakan di namespace (bandingkan bahasa lain di mana seseorang tidak dapat memiliki keduanyaint foo; int[] foo;
)Sigils untuk keterbacaan adalah sesuatu yang dipelajari sebagai bagian dari bahasa apa pun - membaca sintaksis. Anda dapat, secara hipotetis, menegakkan tipe itu sendiri (sebagai notasi hungaria) untuk menjadi bagian dari pengidentifikasi.
Sesuatu dalam lex di sepanjang baris:
Dan kemudian Anda dapat memiliki kode seperti
Saya tidak mengatakan ini adalah ide yang baik, tetapi seseorang yang terbiasa dengan bahasa akan dapat membaca ini secara asli dan berpikir bahwa itu meningkatkan keterbacaan sementara seseorang yang tidak terbiasa dengan bahasa mungkin berpikir bahwa itu hanya menambah banyak suara ke bahasa.
Namun, setelah bekerja dengan bahasa yang didefinisikan seperti ini, saya mungkin bisa membacanya tanpa kesulitan.
Beberapa orang menyukai mereka, beberapa orang tidak. Ada banyak perang suci di berbagai forum yang memperdebatkan hal ini dan itu benar-benar memengaruhi seberapa banyak Anda telah menggunakannya.
Orang bisa mendesain bahasa baru untuk non-programmer yang menggunakan sigils dan siapa pun yang belum pernah memprogram sebelumnya tidak akan pernah mengeluh sedikit pun tentang mereka. Di sisi lain, Anda tidak dapat memilikinya sebagai bagian dari bahasa dan kemudian memiliki programmer ruby atau perl mengeluh bahwa mereka kehilangan beberapa informasi penting.
Itu tidak masalah. Yang penting adalah bagaimana sigils akan cocok dengan bahasa jika Anda menggunakannya atau tidak. Apakah Anda ingin dapat melakukan
"123 $foo 456"
atau harus melakukannya"123 " + foo + " 456"
? Di sinilah keputusan harus dibuat.sumber
"123 $foo 456"
tidak diaktifkan oleh awalan sigil dan sepenuhnya ortogonal untuknya.$asd
dalam sintaksis interpolasi string jika$
sudah digunakan untuk awalan variabel, tetapi itu tidak ada hubungannya dengan kemungkinan aktual penerapan interpolasi string di tempat pertama.#
yang digunakan dalam coffeescript misalnya. Dan coffeescript tidak awalan variabel dengan#
- sebenarnya tidak awalan variabel sama sekali)Saya tidak setuju bahwa PHP menggunakan $ untuk membedakan vars dari funcs. Setidaknya karena PHP memiliki sintaks mirip C, dan funcs () memiliki parens setelah nama.
Baca posting ini di stack overflow tentang mengapa $ ada di PHP.
Banyak bahasa populer, seperti C, C ++, C #, Java tidak menggunakan $ dan kami dapat membedakan var dari fungsinya.
Dalam PHP $ help, misalnya, ketika Anda menulis: echo "var = $ var"
Tanpa $ trik seperti itu tidak akan mungkin.
sumber
echo "var = $var"
fn()[]
mana seperti dengan tata bahasa yang masuk akal yang akan bekerja di luar kotak tanpa memikirkannya.Setelah semua jawaban ini, saya ingin memberikan beberapa poin lagi kepada Mathew Foscarini.
adalah efek samping dari LEXER ini , karena ia mampu mengenali token.
Ambil contoh: dalam SQL kita menggunakan "" untuk dapat menggunakan pengidentifikasi dengan kata-kata yang dicadangkan dan bahkan pengidentifikasi dengan spasi "Nama Depan", "Nama Grup". GROUP adalah kata kunci. Ada masalah - ada solusi khusus.
PS Komentar yang sangat bagus dari MichaelT.
sumber
$
. Juga "kemampuan untuk menempatkan variabel di dalam string" bukan karena variabel diawali dengan simbol seperti$
. Artinya,"123 $foo 456"
akan berfungsi jika bahkan jika sintaks variabel sukafoo = 3
atau@foo = 3
. Mereka tidak berhubungan satu sama lain.... sigil memungkinkan untuk:
Lebih baik membedakan variabel dari non-variabel . Orang yang masih mempelajari konsep dasar mungkin mengalami kesulitan mencari tahu kata mana yang variabel dan mana yang tidak. Mereka sering memulai dengan membaca contoh atau kode orang lain tanpa latar belakang yang memadai.
Gunakan kata kunci yang dipesan atau nama fungsi sebagai nama variabel . Kadang-kadang saya menemukan beberapa nama-nama itu menjadi yang tepat untuk suatu variabel (yaitu
$count
ketika adacount()
fungsi yang ditentukan) dan berterima kasih kepada sigils karena mengizinkan saya untuk menggunakannya.sumber
$
pertanda. Saya ingat tanda dolar membingungkan saya ketika saya masih kecil karena asosiasi uang yang melekat.%
mungkin menjadi alternatif yang layak.