Jawaban:
PHP 7.1 atau lebih baru (dirilis 2 Desember 2016)
Anda dapat secara eksplisit mendeklarasikan variabel yang ada null
dengan sintaks ini
function foo(?Type $t) {
}
ini akan menghasilkan
$this->foo(new Type()); // ok
$this->foo(null); // ok
$this->foo(); // error
Jadi, jika Anda menginginkan argumen opsional, Anda dapat mengikuti konvensi Type $t = null
sedangkan jika Anda perlu membuat argumen menerima keduanya null
dan tipenya, Anda dapat mengikuti contoh di atas.
Anda dapat membaca lebih lanjut di sini .
PHP 7.0 atau lebih tua
Anda harus menambahkan nilai default seperti
function foo(Type $t = null) {
}
Dengan begitu, Anda bisa memberikan nilai nol.
Ini didokumentasikan di bagian dalam manual tentang Deklarasi Jenis :
Deklarasi dapat dibuat untuk menerima
NULL
nilai jika nilai default dari parameter diatur keNULL
.
function foo(Type $t)
adalah hal yang SANGAT baik; lihat Referensi Null: Kesalahan Miliar Dolar
Mulai dari PHP 7.1, tersedia tipe nullable , karena keduanya berfungsi mengembalikan tipe dan parameter. Tipe ?T
dapat memiliki nilai dari Tipe yang ditentukan T
, atau null
.
Jadi, fungsi Anda bisa terlihat seperti ini:
function foo(?Type $t)
{
}
Segera setelah Anda dapat bekerja dengan PHP 7.1, notasi ini lebih disukai daripada function foo(Type $t = null)
, karena masih memaksa pemanggil untuk secara eksplisit menentukan argumen untuk parameter $t
.
Seperti jawaban lain yang telah disebutkan, ini hanya mungkin jika Anda menetapkan null
sebagai nilai default.
Tetapi solusi berorientasi objek terbersih-tipe terbersih akan menjadi NullObject :
interface FooInterface
{
function bar();
}
class Foo implements FooInterface
{
public function bar()
{
return 'i am an object';
}
}
class NullFoo implements FooInterface
{
public function bar()
{
return 'i am null (but you still can use my interface)';
}
}
Pemakaian:
function bar_my_foo(FooInterface $foo)
{
if ($foo instanceof NullFoo) {
// special handling of null values may go here
}
echo $foo->bar();
}
bar_my_foo(new NullFoo);
NullFoo
untuk menimpa metode abstrak, meskipun mereka tidak memiliki makna (menurut definisi null
).
if (something is null)
cek, karena NullObject dimaksudkan untuk mencakup semua perilaku dari nilai yang tidak ada dan kolaborator luar tidak perlu tertarik pada apakah suatu objek tidak ada (null) atau tidak.