Berikan cara yang diketik secara ketat untuk menangani hasil kesuksesan & kesalahan untuk aplikasi PHP Anda.
Terinspirasi oleh Neverhrow jadi di sini kita dengan implementasi sederhana Neverhrow dari PHP.
Melempar dan menangkap sangat mirip dengan menggunakan pernyataan GOTO - dengan kata lain; Itu membuat alasan tentang program Anda lebih keras. Kedua, dengan menggunakan Throw Anda membuat asumsi bahwa penelepon fungsi Anda menerapkan tangkapan. Ini adalah sumber kesalahan yang diketahui. Contoh: Satu dev melempar dan dev lain menggunakan fungsi tanpa pengetahuan sebelumnya bahwa fungsi akan dilemparkan. Dengan demikian, dan Case Edge dibiarkan tidak ditangani dan sekarang Anda memiliki pengguna yang tidak bahagia, bos, kucing, dll.
Dengan semua yang dikatakan, pasti ada kasus penggunaan yang baik untuk melempar program Anda. Tapi jauh lebih sedikit dari yang Anda pikirkan.
TL; DR: No Throw = Happy Life & Application. Lebih sedikit kesalahan produksi & meningkatkan hal -hal kering & dapat digunakan kembali di aplikasi PHP Anda.
PHP 8.2+ Sejak v2.0.0
composer require shipsaas/never-throw NeverThrow\Result kelas dan siap diperpanjang kapan saja.
isOk()isError()getOkResult()getErrorResult() Kami akan membuat dua kelas baru: Sukses & Kesalahan. Dan jangan ragu untuk meletakkan data Anda
use NeverThrow SuccessResult ;
use NeverThrow ErrorResult ;
// Success
class BookShipperOkResult extends SuccessResult
{
public function __construct (
public string $ bookingId
) {}
}
enum BookingErrors {
case NO_SHIPPER_AVAILABLE ;
case OVERWEIGHT_PACKAGE ;
case INVALID_ADDRESS ;
}
// Error
class BookShipperErrorResult extends ErrorResult
{
public function __construct (
public BookingErrors $ outcome
) {}
}Langkah terakhir sebelum menggunakan Neverhrow. Membuat kelas hasil yang berdedikasi membantu kami untuk:
use NeverThrow Result ;
class BookShipperResult extends Result
{
public function getOkResult (): BookShipperOkResult
{
return parent :: getOkResult ();
}
public function getErrorResult (): BookShipperErrorResult
{
return parent :: getErrorResult ();
}
} public function createBooking ( User $ user , BookingOrder $ order ): BookShipperResult
{
$ hasAnyShipperAvailable = $ this -> shipperService -> hasAnyShipperAvailable ();
if (! $ hasAnyShipperAvailable ) {
return new BookShipperResult (
new BookShipperErrorResult (
BookingErrors:: NO_SHIPPER_AVAILABLE
)
);
}
$ isOverweight = ! $ this -> weightService -> isValid ( $ order );
if ( $ isOverweight ) {
return new BookShipperResult (
new BookShipperErrorResult (
BookingErrors:: OVERWEIGHT_PACKAGE
)
);
}
$ bookingId = $ this -> book ( $ user , $ order );
return new BookShipperResult ( new BookShipperOkResult ( $ bookingId ));
} $ bookingResult = $ this -> service -> createBooking ( $ user , $ order );
if ( $ bookingResult -> isError ()) {
$ errorResult = $ bookingResult -> getErrorResult ();
// handle error
return showError ( match ( $ errorResult -> outcome ) {
BookingErrors:: NO_SHIPPER_AVAILABLE => ' No shipper available at the moment. Please wait ' ,
BookingErrors:: OVERWEIGHT_PACKAGE => ' Your package is overweight ' ,
});
}
return showBooking ( $ bookingResult -> getOkResult ()-> bookingId );Seperti yang dapat Anda lihat dengan kode di atas, ada:
Itu akan membawa perkembangan yang benar -benar luar biasa dan tidak ada rasa sakit.
Dengan jenis pengembalian yang diketik secara ketat, pengembang dapat mengetahui apa yang terjadi dengan layanan/perpustakaan lainnya. Dengan demikian membuat yang dapat digunakan kembali lebih baik. Dan kami tidak perlu membungkus Cobalah/Tangkap dan menggantikan kode kami.
Jangan menyalahgunakan pengecualian, mereka hanya boleh digunakan untuk situasi yang tidak terduga (dan kesalahan! == Pengecualian, fakta).
function transfer (): Transaction
{
if (! $ hasEnoughBalance ) {
thrown new InsufficientBalanceError ();
}
if (! $ invalidRecipient ) {
throw new InvalidRecipientError ();
}
if (! $ invalidMoney ) {
throw new InvalidTransferMoneyError ();
}
$ transaction = $ this -> transferService -> transfer (...);
if (! $ transaction ) {
throw new TransferFailedError ();
}
return $ transaction ;
}Sebagian besar fungsi ini sebenarnya tentang hal -hal yang bisa salah, tetapi tipe kami hanya memberi tahu kami tentang jalan yang sukses. Itu berarti 4/5 dari output fungsi tidak diketik !
"Pengecualian" atau "kesalahan" di atas tidak benar -benar pengecualian atau kesalahan sama sekali. Mereka adalah hasil. Mereka adalah bagian yang dapat diprediksi dan wajar dari sistem kami. Heuristik saya adalah, jika mereka adalah sesuatu yang akan dipedulikan oleh manajer produk yang baik, mereka bukan pengecualian dan Anda tidak boleh melemparkannya!
Pengecualian adalah hal -hal yang tidak dapat diprediksi yang tidak dapat kita rencanakan secara wajar, bahwa sistem tidak boleh mencoba pemulihan, dan kita tidak boleh merutekan ke pengguna.
Lisensi MIT