Ini kode saya:
function phpwtf(string $s) {
echo "$s\n";
}
phpwtf("Type hinting is da bomb");
Yang menghasilkan kesalahan ini:
Kesalahan fatal yang dapat ditangkap: Argumen 1 yang diteruskan ke phpwtf () harus berupa string, string yang diberikan
Lebih dari Orwellian kecil melihat PHP mengenali dan menolak jenis yang diinginkan dengan cara yang sama. Ada lima lampu, sial.
Apa yang setara dengan tipe hinting untuk string di PHP? Pertimbangan bonus untuk jawaban yang menjelaskan apa yang sebenarnya terjadi di sini.
php
types
type-hinting
leepower
sumber
sumber
Jawaban:
Sebelum PHP 7, mengisyaratkan tipe hanya dapat digunakan untuk memaksa jenis objek dan array. Tipe skalar tidak dapat diisyaratkan tipe. Dalam hal ini objek dari kelas
string
diharapkan, tetapi Anda memberikannya (skalar)string
. Pesan kesalahan mungkin lucu, tapi itu seharusnya tidak berfungsi untuk memulai. Mengingat sistem pengetikan yang dinamis, ini sebenarnya masuk akal.Anda hanya bisa secara manual "mengetikkan petunjuk" jenis skalar:
sumber
Dari manual PHP :
Jadi kamu memilikinya. Pesan kesalahannya tidak terlalu membantu, saya berikan itu.
** 2017 Edit **
PHP7 memperkenalkan lebih banyak deklarasi tipe data fungsi, dan tautan tersebut telah dipindahkan ke argumen Fungsi: Ketikkan deklarasi . Dari halaman itu:
Peringatan terakhir sebenarnya penting untuk memahami kesalahan "Argumen harus bertipe string, string diberikan"; karena sebagian besar hanya nama kelas / antarmuka diizinkan sebagai tipe argumen, PHP mencoba mencari nama kelas "string", tetapi tidak dapat menemukannya karena ini adalah tipe primitif, sehingga gagal dengan kesalahan canggung ini.
sumber
PHP memungkinkan "memberi isyarat" di mana Anda menyediakan kelas untuk menentukan objek. Menurut manual PHP, "Tip Petunjuk hanya bisa dari tipe objek dan array (karena PHP 5.1). Tipe tradisional yang mengisyaratkan int dan string tidak didukung." Kesalahan membingungkan karena pilihan Anda "string" - menempatkan "myClass" di tempatnya dan kesalahan akan berbunyi berbeda: "Argumen 1 diteruskan ke phpwtf () harus menjadi instance dari myClass, string diberikan"
sumber
Seperti yang telah dikatakan orang lain, tipe hinting saat ini hanya berfungsi untuk tipe objek. Tapi saya pikir kesalahan tertentu yang Anda picu mungkin dalam persiapan tipe string mendatang SplString .
Secara teori itu berperilaku seperti string, tetapi karena itu adalah objek akan melewati verifikasi tipe objek. Sayangnya itu belum dalam PHP 5.3, mungkin datang dalam 5,4, jadi belum menguji ini.
sumber
Sebagai PHP 7.0 deklarasi tipe memungkinkan jenis skalar, sehingga jenis ini sekarang tersedia:
self
,array
,callable
,bool
,float
,int
,string
. Tiga yang pertama tersedia di PHP 5, tetapi empat yang terakhir baru dalam PHP 7. Jika Anda menggunakan hal lain (misalnyainteger
atauboolean
) yang akan ditafsirkan sebagai nama kelas.Lihat manual PHP untuk informasi lebih lanjut .
sumber
Mungkin tidak aman dan cantik tetapi jika Anda harus:
sumber
new string(array(1,2,3))
Saya mendapatkan kesalahan ini ketika menjalankan fungsi dari Laravel Controller ke file PHP.
Setelah beberapa jam, saya menemukan masalah: Saya menggunakan $ this dari dalam fungsi statis.
sumber
Using $this when not in object context
memang pesan samar.(awalnya diposting oleh leepowers dalam pertanyaannya)
Pesan kesalahan membingungkan karena satu alasan besar:
Nama tipe primitif tidak disediakan dalam PHP
Berikut ini adalah semua deklarasi kelas yang valid:
Kesalahan saya adalah berpikir bahwa pesan kesalahan merujuk semata-mata ke tipe primitif string - kata 'instance' seharusnya membuat saya berhenti. Contoh untuk menggambarkan lebih lanjut:
Keluaran:
Dalam PHP dimungkinkan untuk
string
menjadistring
kecuali ketika itu sebenarnya astring
. Seperti bahasa apa pun yang menggunakan konversi tipe implisit, konteks adalah segalanya.sumber
Saya pikir typecasting pada php pada blok di dalam, String pada PHP bukan objek seperti yang saya tahu:
sumber
(string) $s
dapat melempar kesalahan jika$s
merupakan objek yang tidak dapat dilemparkan ke dalam string (tidak memiliki__toString()
metode yang diterapkan), jadi tidak semudah itu