Ada dua cara berbeda untuk mengakses metode dalam PHP, tetapi apa bedanya?
$response->setParameter('foo', 'bar');
dan
sfConfig::set('foo', 'bar');
Saya berasumsi ->
(tanda hubung dengan tanda atau chevron) digunakan untuk fungsi untuk variabel, dan ::
(titik dua) digunakan untuk fungsi untuk kelas. Benar?
Apakah =>
operator penugasan hanya digunakan untuk menetapkan data dalam array? Apakah ini berbeda dengan =
operator penugasan yang digunakan untuk instantiate atau memodifikasi variabel?
Jawaban:
Ketika bagian kiri adalah contoh objek, Anda gunakan
->
. Jika tidak, Anda gunakan::
.Ini berarti bahwa
->
sebagian besar digunakan untuk mengakses anggota instance (meskipun itu juga dapat digunakan untuk mengakses anggota statis, penggunaan seperti itu tidak disarankan), sementara::
biasanya digunakan untuk mengakses anggota statis (meskipun dalam beberapa kasus khusus, ini digunakan untuk mengakses anggota contoh ).Secara umum,
::
digunakan untuk resolusi lingkup , dan mungkin memiliki sebuah nama kelas,parent
,self
, atau (di PHP 5.3)static
ke kiri.parent
mengacu pada ruang lingkup kelas superclass di mana ia digunakan;self
mengacu pada ruang lingkup kelas di mana ia digunakan;static
mengacu pada "ruang lingkup yang disebut" (lihat binding statis akhir ).Aturannya adalah bahwa panggilan dengan
::
adalah panggilan instan jika dan hanya jika:$this
ada dan$this
adalah kelas dari metode yang dipanggil atau subkelasnya.Contoh:
Keluaran:
sumber
->
Sebagian besar digunakan untuk mengakses anggota instance (meskipun itu juga dapat digunakan untuk mengakses anggota statis, penggunaan seperti itu tidak disarankan)" Saya tidak tahu itu bisa terjadi. Jadi jika "berfungsi" dengan cara tertentu ketika digunakan untuk mengakses anggota statis - perbedaan perilaku apa yang diharapkan seseorang jika salah menggunakannya seperti ini? Hanya karena penasaran.->
. Tentu saja, Anda mungkin perlu membuat instance kelas hanya untuk memanggil metode statis, jadi ada juga hit kinerja. Namun, dengan properti, ada lebih banyak masalah. Peringatan STRICT dinaikkan dan itu mungkin atau mungkin tidak bekerja . Perhatikan bahwa kebalikannya juga benar - Anda dapat memanggil metode instance secara statis, tetapi ini bahkan lebih buruk (dan Anda tidak dapat menggunakan$this
implementasi metode seperti itu).::
digunakan dalam konteks statis , yaitu. ketika beberapa metode atau properti dinyatakan sebagai statis:Juga,
::
operator (Operator Penyelesaian Ruang Lingkup, alias Paamayim Nekudotayim ) digunakan dalam konteks dinamis ketika Anda memanggil metode / properti dari kelas induk:->
digunakan dalam konteks dinamis , yaitu. ketika Anda berurusan dengan beberapa instance dari beberapa kelas:Ngomong-ngomong: Saya tidak berpikir bahwa menggunakan Symfony adalah ide yang baik ketika Anda tidak memiliki pengalaman OOP.
sumber
Sebenarnya dengan simbol ini kita dapat memanggil metode kelas yang statis dan tidak bergantung pada inisialisasi lainnya ...
Di sini
doWrite()
fungsinya tidak tergantung pada metode atau variabel lain apa pun, dan ini merupakan metode statis. Itu sebabnya kita dapat memanggil metode ini oleh operator ini tanpa menginisialisasi objek kelas ini.Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.
Tetapi jika Anda ingin memanggil
write
metode dengan cara ini, itu akan menghasilkan kesalahan karena tergantung pada inisialisasi.sumber
The
=>
operator yang digunakan untuk pasangan kunci-nilai assign dalam array asosiatif. Sebagai contoh:Makna itu serupa dalam
foreach
pernyataan:sumber
Perbedaan antara metode statis dan instantiated dan properti tampaknya menjadi salah satu kendala terbesar bagi mereka yang baru memulai dengan OOP PHP di PHP 5.
Operator usus ganda (yang disebut Paamayim Nekudotayim dari bahasa Ibrani - trivia) digunakan ketika memanggil objek atau properti dari konteks statis . Ini berarti turunan dari objek belum dibuat.
Operator panah, sebaliknya, memanggil metode atau properti yang dari referensi instance objek.
Metode statis dapat sangat berguna dalam model objek yang ditautkan ke database untuk membuat dan menghapus metode, karena Anda dapat mengatur nilai kembali ke id tabel yang disisipkan dan kemudian menggunakan konstruktor untuk instantiate objek dengan id baris.
sumber
Ya, saya baru saja memukul pertama saya
'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'
. Buruk saya, saya punya$instance::method()
yang seharusnya$instance->method()
. Saya konyol.Yang aneh adalah bahwa ini masih berfungsi dengan baik pada mesin lokal saya (menjalankan PHP 5.3.8) - tidak ada, bahkan peringatan dengan error_reporting = E_ALL - tetapi tidak sama sekali pada server uji, di sana ia meledak dengan kesalahan sintaksis dan layar putih di browser. Karena logging PHP dimatikan di mesin uji, dan perusahaan hosting terlalu sibuk untuk menyalakannya, itu tidak terlalu jelas.
Jadi, kata peringatan: ternyata, beberapa instalasi PHP akan membiarkan Anda menggunakan $ instance :: method (), sementara yang lain tidak.
Jika ada yang bisa memperluas mengapa itu terjadi, silakan lakukan.
sumber