آموزش PHP قسمت ششم

  • September 28, 2022 10:14 am
  1. کوکی ها
  2. فیلترها
  3. فیلترهای پیشرفته PHP
  4. توابع Callback
  5. PHP و JSON
  6. استثناها در PHP

۲۹. کوکی ها

کوکی چیست؟

کوکی اغلب برای شناسایی کاربر استفاده می شود. کوکی یک فایل کوچک است که سرور در رایانه کاربر قرار می دهد. هر بار که همان رایانه صفحه ای را با مرورگر درخواست می کند، کوکی را نیز ارسال می کند. با PHP، هم می توانید مقادیر کوکی را ایجاد و هم بازیابی کنید.

ساخت کوکی با PHP

یک کوکی با تابع ()setcookie ایجاد می شود.
 
سینتکس:
setcookie(name, value, expire, path, domain, secure, httponly);
فقط پارامتر name اجباری است. تمام پارامترهای دیگر اختیاری هستند.

ایجاد/بازیابی یک کوکی

مثال زیر یک کوکی به نام “user” با مقدار “John Doe” ایجاد می کند. کوکی پس از 30 روز منقضی می شود (86400 * 30).
/” به این معنی است که کوکی در کل وب سایت در دسترس است (در غیر این صورت، دایرکتوری مورد نظر باید انتخاب شود).
 
سپس مقدار کوکی “user” را بازیابی می کنیم ( با استفاده از متغیر جهانی COOKIE_$ ). ما همچنین از تابع ()isset برای بررسی اینکه آیا کوکی تنظیم شده است استفاده می کنیم:
 
مثال:
<!DOCTYPE html>
<?php
$cookie_name = "user";
$cookie_value = "John Doe";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
?>
<html>
<body>

<?php
if(!isset($_COOKIE[$cookie_name])) {
     echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
     echo "Cookie '" . $cookie_name . "' is set!<br>";
     echo "Value is: " . $_COOKIE[$cookie_name];
}
?>

<p><strong>Note:</strong> You might have to reload the page to see the value of the cookie.</p>

</body>
</html>
flesh

Cookie named ‘user’ is not set!

Note: You might have to reload the page to see the value of the cookie.

توجه: تابع ()setcookie باید قبل از تگ <html> آورده شود.

توجه: مقدار کوکی به طور خودکار هنگام ارسال کوکی URLencod می شود و هنگام دریافت به طور خودکار رمز گشایی می شود ( برای جلوگیری از کدگذاری URL، به جای آن از ()setrawcookie استفاده کنید ).

تغییر مقدار کوکی

برای اصلاح یک کوکی، کافی است (دوباره) کوکی را با استفاده از تابع ()setcookie تنظیم کنید:
 
مثال:
<?php
$cookie_name = "user";
$cookie_value = "Alex Porter";
setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/");
?>
<html>
<body>

<?php
if(!isset($_COOKIE[$cookie_name])) {
  echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
  echo "Cookie '" . $cookie_name . "' is set!<br>";
  echo "Value is: " . $_COOKIE[$cookie_name];
}
?>

</body>
</html>
flesh

Cookie named ‘user’ is not set!

توجه: باید صفحه را دوباره بارگیری کنید تا مقدار جدید کوکی را ببینید.

حذف یک کوکی

برای حذف یک کوکی، از تابع ()setcookie با تاریخ انقضا در گذشته استفاده کنید:
<?php
// set the expiration date to one hour ago
setcookie("user", "", time() - 3600);
?>
<html>
<body>

<?php
echo "Cookie 'user' is deleted.";
?>

</body>
</html>
flesh

Cookie ‘user’ is deleted.

بررسی کنید که آیا کوکی ها فعال هستند یا خیر

مثال زیر یک اسکریپت کوچک ایجاد می کند که بررسی می کند آیا کوکی ها فعال هستند یا خیر. ابتدا یک کوکی آزمایشی با تابع ()setcookie ایجاد کرده، سپس متغیر آرایه COOKIE_$ را می شمارد:
 
مثال:
 
<?php
setcookie("test_cookie", "test", time() + 3600, '/');
?>
<html>
<body>

<?php
if(count($_COOKIE) > 0) {
  echo "Cookies are enabled.";
} else {
  echo "Cookies are disabled.";
}
?>

</body>
</html>
flesh

Cookies are enabled.

۳۰. Session ها

یک جلسه ( Session ) راهی برای ذخیره اطلاعات (در متغیرها) برای استفاده در چندین صفحه است.
برخلاف کوکی، اطلاعات در رایانه کاربر ذخیره نمی شود.

Session چیست؟

وقتی با یک برنامه کار می کنید، آن را باز می کنید، تغییراتی را انجام می دهید و سپس آن را می بندید. این خیلی شبیه یک Session است. کامپیوتر می داند که شما کی هستید. می داند چه زمانی برنامه را شروع می کنید و چه زمانی پایان می دهید. اما در اینترنت یک مشکل وجود دارد: وب سرور نمی داند شما کی هستید یا چه کار می کنید، زیرا آدرس HTTP وضعیت را ذخیره نمی کند.
 
متغیرهای جلسه ( Session ) این مشکل را با ذخیره اطلاعات کاربر برای استفاده در چندین صفحه ( مانند نام کاربری، رنگ مورد علاقه و غیره ) حل می کنند. به‌طور پیش‌فرض، متغیرهای Session تا زمانی که کاربر مرورگر را ببندد، باقی می‌مانند.
 
بنابراین؛ متغیرهای Session اطلاعات مربوط به یک کاربر را در خود نگه می دارند و برای همه صفحات در یک برنامه کاربردی در دسترس هستند.

نکته: اگر به یک حافظه دائمی نیاز دارید، ممکن است بخواهید داده ها را در یک پایگاه داده ذخیره کنید.

شروع یک Session

یک جلسه با تابع ()session_start شروع می شود.
 
متغیرهای جلسه با متغیر گلوبال PHP تنظیم می شوند: SESSION_$.
 
حالا بیایید یک صفحه جدید به نام “demo_session1.php” ایجاد کنیم. در این صفحه، یک session جدید PHP را شروع می کنیم و چند متغیر session را تنظیم می کنیم:
<?php
// Start the session
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// Set session variables
$_SESSION["favcolor"] = "green";
$_SESSION["favanimal"] = "cat";
echo "Session variables are set.";
?>

</body>
</html>
flesh

Session variables are set.

توجه: تابع ()session_start باید اولین چیز در سند شما باشد. قبل از هر تگ HTML

مقادیر متغیر Session را دریافت کنید

سپس صفحه دیگری به نام “demo_session2.php” ایجاد می کنیم. از این صفحه، به اطلاعات جلسه ای که در صفحه اول تنظیم کرده ایم (“demo_session1.php”) دسترسی خواهیم داشت.
 
توجه داشته باشید که متغیرهای session به صورت جداگانه به هر صفحه جدید منتقل نمی شوند، در عوض از جلسه ای که در ابتدای هر صفحه باز می کنیم (session_start()) بازیابی می شوند.
همچنین توجه داشته باشید که تمام مقادیر متغیر session در متغیر گلوبال SESSION_$ ذخیره می شوند:
 
مثال:
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// Echo session variables that were set on previous page
echo "Favorite color is " . $_SESSION["favcolor"] . ".<br>";
echo "Favorite animal is " . $_SESSION["favanimal"] . ".";
?>

</body>
</html>
flesh

Favorite color is green.
Favorite animal is cat.

راه دیگر برای نشان دادن تمام مقادیر متغیر session برای یک جلسه کاربر، اجرای کد زیر است:
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
print_r($_SESSION);
?>

</body>
</html>
flesh

Array ( [favcolor] => green [favanimal] => cat )

چگونه کار می کند؟ از کجا میداند من هستم؟
اکثر session ها یک user-key در رایانه کاربر تنظیم می کنند که چیزی شبیه به این است: 765487cf34ert8dede5a562e4f3a7e12. سپس، هنگامی که یک session در صفحه دیگری باز می شود، کامپیوتر را برای یافتن user-key اسکن می کند. اگر مطابقت وجود داشته باشد، به آن session دسترسی پیدا می کند، اگر نه، session جدیدی را شروع می کند.

تغییر یک متغیر session

برای تغییر یک متغیر session ، کافی است آن را بازنویسی کنید:
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// to change a session variable, just overwrite it
$_SESSION["favcolor"] = "yellow";
print_r($_SESSION);
?>

</body>
</html>
flesh

Array ( [favcolor] => yellow [favanimal] => cat )

از بین بردن یک session

برای حذف همه متغیرهای session سراسری و از بین بردن session ، از ()session_unset و ()session_destroy استفاده کنید:
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>

<?php
// remove all session variables
session_unset();

// destroy the session
session_destroy();

echo "All session variables are now removed, and the session is destroyed."
?>

</body>
</html>
flesh

All session variables are now removed, and the session is destroyed.

۳۱. فیلترها

اعتبارسنجی داده ها = تعیین می کند که داده ها در فرم مناسب هستند یا خیر.
پاکسازی داده ها = هر گونه کاراکتر غیرقانونی را از داده ها حذف می کند.
فیلترهای PHP برای اعتبارسنجی و پاکسازی ورودی خارجی استفاده می شوند.
فیلترها در PHP بسیاری از عملکردهای مورد نیاز برای بررسی ورودی های کاربر را دارد و به گونه‌ای طراحی شده است که اعتبارسنجی داده‌ها را آسان‌تر و سریع‌تر می کند.
تابع ()filter_list می تواند برای فهرست کردن آنچه فیلتر PHP ارائه می دهد استفاده شود:
<table>
  <tr>
    <td>Filter Name</td>
    <td>Filter ID</td>
  </tr>
  <?php
  foreach (filter_list() as $id =>$filter) {
    echo '<tr><td>' . $filter . '</td><td>' . filter_id($filter) . '</td></tr>';
  }
  ?>
</table>
flesh
Filter NameFilter ID
int257
boolean258
float259
validate_regexp272
validate_domain277
validate_url273
validate_email274
validate_ip275
validate_mac276
string513
stripped513
encoded514
special_chars515
full_special_chars522
unsafe_raw516
email517
url518
number_int519
number_float520
add_slashes523
callback1024

چرا از فیلترها استفاده کنیم؟

بسیاری از برنامه های کاربردی وب ورودی خارجی دریافت می کنند. داده خارجی می تواند شامل موارد زیر باشد:
 
  • ورودی کاربر از یک فرم
  • کوکی ها
  • داده های وب سرویس
  • متغیرهای سرور
  • نتایج پرس و جو پایگاه داده

همیشه باید داده های خارجی را تأیید کنید!
داده های ارسالی نامعتبر می تواند منجر به مشکلات امنیتی و خرابی صفحه وب شما شود!
با استفاده از فیلترهای PHP می توانید مطمئن شوید که برنامه شما ورودی صحیح را دریافت می کند!

تابع ()filter_var

تابع ()filter_var هم داده ها را تایید و هم پاکسازی می کند.
تابع ()filter_var یک متغیر را با یک فیلتر مشخص فیلتر می کند. دو پارامتر می گیرد:
  • متغیری که می خواهید بررسی کنید
  • نوع چک مورد استفاده

پاکسازی یک رشته متنی

مثال زیر از تابع ()filter_var برای حذف تمام تگ های HTML از یک رشته استفاده می کند:
<?php
$str = "<h1>Hello World!</h1>";
$newstr = filter_var($str, FILTER_SANITIZE_STRING);
echo $newstr;
?>
flesh

Hello World!

اعتبار سنجی یک عدد صحیح

مثال زیر از تابع ()filter_var برای بررسی اینکه آیا متغیر int$ یک عدد صحیح است یا خیر استفاده می کند. اگر int$ یک عدد صحیح باشد، خروجی کد زیر خواهد بود: “عدد صحیح معتبر است”. اگر int$ یک عدد صحیح نباشد، خروجی این خواهد بود: “Integer is not valid”:
<?php
$int = 100;

if (!filter_var($int, FILTER_VALIDATE_INT) === false) {
  echo("Integer is valid");
} else {
  echo("Integer is not valid");
}
?>
flesh

Integer is valid

نکته: ()filter_var و مشکل با 0

در مثال بالا، اگر int$ روی 0 تنظیم شده بود، تابع بالا “عدد صحیح معتبر نیست” را برمی گرداند. برای حل این مشکل از کد زیر استفاده کنید:
<?php
$int = 0;

if (filter_var($int, FILTER_VALIDATE_INT) === 0 || !filter_var($int, FILTER_VALIDATE_INT) === false) {
  echo("Integer is valid");
} else {
  echo("Integer is not valid");
}
?>
flesh

Integer is valid

اعتبارسنجی یک آدرس IP

مثال زیر از تابع ()filter_var برای بررسی اینکه آیا متغیر ip$ یک آدرس IP معتبر است استفاده می کند:
<?php
$ip = "127.0.0.1";

if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {
  echo("$ip is a valid IP address");
} else {
  echo("$ip is not a valid IP address");
}
?>
flesh

127.0.0.1 is a valid IP address

پاکسازی و اعتبارسنجی یک آدرس ایمیل

مثال زیر از تابع ()filter_var استفاده می کند تا ابتدا تمام کاراکترهای غیرقانونی را از متغیر email$ حذف کند، سپس بررسی کنید که آیا آدرس ایمیل معتبری است یا خیر:
<?php

$email = "john.doe@example.com";

// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Validate e-mail
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
  echo("$email is a valid email address");
} else {
  echo("$email is not a valid email address");
}

?>
flesh

john.doe@example.com is a valid email address

پاکسازی و اعتبارسنجی یک URL

مثال زیر از تابع ()filter_var استفاده می‌کند تا ابتدا همه کاراکترهای غیر مجاز را از URL حذف کند، سپس بررسی می کند که آیا url$ یک URL معتبر است یا خیر.
<?php

$url = "https://www.raiatec.com";

// Remove all illegal characters from a url
$url = filter_var($url, FILTER_SANITIZE_URL);

// Validate url
if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
  echo("$url is a valid URL");
} else {
  echo("$url is not a valid URL");
}

?>
flesh

https://www.raiatec.com is a valid URL

۳۲. فیلترهای پیشرفته PHP

اعتبار سنجی یک عدد صحیح در محدوده

مثال زیر از تابع ()filter_var برای بررسی اینکه آیا متغیری از نوع INT و بین 1 و 200 است یا خیر استفاده می‌کند:
<?php
$int = 122;
$min = 1;
$max = 200;

if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) {
  echo("Variable value is not within the legal range");
} else {
  echo("Variable value is within the legal range");
}
?>
flesh

Variable value is within the legal range

اعتبارسنجی یک آدرس IPV6

مثال زیر از تابع ()filter_var برای بررسی اینکه آیا متغیر ip$ یک آدرس IPv6 معتبر است یا خیر استفاده می کند:
<?php
$ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";

if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
  echo("$ip is a valid IPv6 address");
} else {
  echo("$ip is not a valid IPv6 address");
}
?>
flesh

2001:0db8:85a3:08d3:1319:8a2e:0370:7334 is a valid IPv6 address

اعتبارسنجی URL – باید حاوی QueryString باشد

مثال زیر از تابع ()filter_var استفاده می کند تا بررسی کند که آیا متغیر url$ یک URL با یک querystring است یا خیر:
<?php
$url = "https://www.raiatec.com";

if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
  echo("$url is a valid URL with a query string");
} else {
  echo("$url is not a valid URL with a query string");
}
?>
flesh

https://www.raiatec.com is not a valid URL with a query string

حذف کاراکترهایی با مقدار ASCII بزرگتر از 127

مثال زیر از تابع ()filter_var برای پاکسازی یک رشته استفاده می کند. هم همه تگ‌های HTML و هم همه کاراکترهای دارای مقدار ASCII > 127 را از رشته حذف می‌کند: ( 127 کد اولیه میان تمام کامپیوترها یکسان و قابل تبادل می باشند . اما کدهای 128 تا 255 خاص هستند )
<?php
$str = "<h1>Hello WorldÆØÅ!</h1>";

$newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
echo $newstr;
?>
flesh

Hello World!

۳۳. توابع Callback

تابع callback تابعی است که به عنوان آرگومان به تابع دیگری ارسال می شود.
 
هر تابع موجود را می توان به عنوان یک تابع callback استفاده کرد.
 
برای استفاده از یک تابع به عنوان یک تابع callback ، باید رشته ای حاوی نام تابع را به عنوان آرگومان یک تابع دیگر ارسال کنید.

مثال:

برای محاسبه طول هر رشته در یک آرایه، یک callback به تابع ()array_map ارسال کنید:
<?php
function my_callback($item) {
  return strlen($item);
}

$strings = ["apple", "orange", "banana", "coconut"];
$lengths = array_map("my_callback", $strings);
print_r($lengths);
?>
flesh
Array
(
    [0] => 5
    [1] => 6
    [2] => 6
    [3] => 7
)

از 7 PHP به بعد می توانید توابع ناشناس را به عنوان توابع callback ارسال کنید.

مثال:
از یک تابع ناشناس به عنوان یک فراخوان برای تابع ()array_map استفاده کنید:
<?php
$strings = ["apple", "orange", "banana", "coconut"];
$lengths = array_map( function($item) { return strlen($item); } , $strings);
print_r($lengths);
?>
flesh
Array
(
    [0] => 5
    [1] => 6
    [2] => 6
    [3] => 7
)

callback در توابع تعریف شده توسط کاربر

توابع و متدهای تعریف شده توسط کاربر نیز می توانند توابع Callback را به تماس را به عنوان آرگومان دریافت کنند. برای استفاده از توابع Callback در داخل یک تابع یا متد تعریف شده توسط کاربر، آن را با افزودن پرانتز به متغیر فراخوانی کنید و آرگومان ها را مانند توابع عادی ارسال کنید:
 
مثال:
اجرای یک Callback از یک تابع تعریف شده توسط کاربر:
<?php
function exclaim($str) {
  return $str . "! ";
}

function ask($str) {
  return $str . "? ";
}

function printFormatted($str, $format) {
  // Calling the $format callback function
  echo $format($str);
}

// Pass "exclaim" and "ask" as callback functions to printFormatted()
printFormatted("Hello world", "exclaim");
printFormatted("Hello world", "ask");
?>
flesh

Hello world! Hello world?

۳۴. PHP و JSON

JSON چیست؟

JSON مخفف عبارت JavaScript Object Notation می باشد و سینتکسی برای ذخیره و تبادل داده است.
 
از آنجایی که فرمت JSON یک فرمت مبتنی بر متن است، می توان آن را به راحتی به سرور ارسال کرد و از آن به عنوان فرمت داده توسط هر زبان برنامه نویسی استفاده کرد.
 
PHP دارای برخی توابع داخلی برای مدیریت JSON است.
ابتدا دو تابع زیر را بررسی خواهیم کرد:
  • ()json_encode
  • ()json_decode

تابع ()json_encode

تابع ()json_encode برای کدگذاری یک مقدار به فرمت JSON استفاده می شود.
مثال۱:
این مثال نحوه کدگذاری یک آرایه انجمنی را در یک شی JSON نشان می دهد:
<?php
$age = array("Peter"=>35, "Ben"=>37, "Joe"=>43);

echo json_encode($age);
?>
flesh

{“Peter”:35,”Ben”:37,”Joe”:43}

مثال۲:

این مثال نحوه کدگذاری یک آرایه نمایه شده را در یک آرایه JSON نشان می دهد:

<?php
$cars = array("Volvo", "BMW", "Toyota");

echo json_encode($cars);
?>
flesh

[“Volvo”,”BMW”,”Toyota”]

تابع ()json_decode

تابع ()json_decode برای رمزگشایی یک شی JSON به یک شی PHP یا یک آرایه انجمنی استفاده می شود.

مثال۱:

این مثال داده های JSON را به یک شی PHP رمزگشایی می کند:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';

var_dump(json_decode($jsonobj));
?>
flesh

object(stdClass)#1 (3) { [“Peter”]=> int(35) [“Ben”]=> int(37) [“Joe”]=> int(43) }

تابع ()json_decode به صورت پیش فرض یک شی را برمی گرداند. تابع ()json_decode دارای یک پارامتر دوم است و وقتی روی true تنظیم شود، اشیاء JSON در آرایه های انجمنی رمزگشایی می شوند.

مثال۲:

این مثال داده های JSON را در یک آرایه انجمنی PHP رمزگشایی می کند:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';

var_dump(json_decode($jsonobj, true));
?>
flesh

array(3) { [“Peter”]=> int(35) [“Ben”]=> int(37) [“Joe”]=> int(43) }

دسترسی به مقادیر رمزگشایی شده

در اینجا دو مثال از نحوه دسترسی به مقادیر رمزگشایی شده از یک شی و از یک آرایه انجمنی آورده شده است:

مثال۱:

این مثال نحوه دسترسی به مقادیر یک شی PHP را نشان می دهد:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';

$obj = json_decode($jsonobj);

echo $obj->Peter;
echo $obj->Ben;
echo $obj->Joe;
?>
flesh

353743

مثال۲:

این مثال نحوه دسترسی به مقادیر یک آرایه انجمنی PHP را نشان می دهد:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';

$arr = json_decode($jsonobj, true);

echo $arr["Peter"];
echo $arr["Ben"];
echo $arr["Joe"];
?>
flesh

353743

حلقه زدن از طریق مقدارها

همچنین می توانید با حلقه ()foreach مقادیر را حلقه بزنید:

مثال۱:

این مثال نحوه حلقه زدن مقادیر یک شی PHP را نشان می دهد:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';

$obj = json_decode($jsonobj);

foreach($obj as $key => $value) {
  echo $key . " => " . $value . "<br>";
}
?>
flesh

Peter => 35
Ben => 37
Joe => 43

مثال۲:

این مثال نشان می دهد که چگونه می توان مقادیر یک آرایه انجمنی PHP را حلقه کرد:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';

$arr = json_decode($jsonobj, true);

foreach($arr as $key => $value) {
  echo $key . " => " . $value . "<br>";
}
?>
flesh

Peter => 35
Ben => 37
Joe => 43

۳۵. استثناها در PHP

  • یک استثنا شیئی است که خطا یا رفتار غیرمنتظره یک اسکریپت PHP را توصیف می کند.
  • استثنائات توسط بسیاری از توابع و کلاس های PHP ایجاد می شود.
  • توابع و کلاس های تعریف شده توسط کاربر نیز می توانند استثناء ایجاد کنند.
  • استثناها راه خوبی برای متوقف کردن یک تابع در هنگام برخورد با داده هایی است که نمی تواند از آنها استفاده کند.

پرتاب یک استثنا

دستور throw به یک تابع یا متد تعریف شده توسط کاربر اجازه می دهد تا یک استثنا ایجاد کند. هنگامی که یک استثنا پرتاب می شود، کدهای زیر آن اجرا نمی شود.
اگر یک استثنا شناسایی نشود، یک خطای مرگبار (“fatal error”) با پیام استثنای کشف نشده (“Uncaught Exception”) رخ می دهد.
بیایید سعی کنیم یک استثنا پرتاب کنیم بدون اینکه آن را بگیریم:
<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

echo divide(5, 0);
?>
flesh

Fatal error: Uncaught Exception: Division by zero in C:\xampp\htdocs\phptest.com\public_html\index.php:8 Stack trace: #0 C:\xampp\htdocs\phptest.com\public_html\index.php(13): divide(5, 0) #1 {main} thrown in C:\xampp\htdocs\phptest.com\public_html\index.php on line 8

دستور try…catch

برای جلوگیری از خطای مثال بالا، می‌توانیم از دستور try…catch برای گرفتن استثناها و ادامه فرآیند استفاده کنیم.
 
سینتکس:
try {
  code that can throw exceptions
} catch(Exception $e) {
  code that runs when an exception is caught
}

مثال:

هنگامی که یک استثنا پرتاب می شود یک پیام نشان دهید:
<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} catch(Exception $e) {
  echo "Unable to divide.";
}
?>
flesh

Unable to divide.

بلوک catch نشان می دهد که چه نوع استثنایی باید گرفته شود و نام متغیری که می تواند برای دسترسی به استثنا مورد استفاده قرار گیرد. در مثال بالا، نوع استثنا Exception و نام متغیر e$ است.

try…catch…finally

دستور try…catch…finally را می توان برای گرفتن استثناها استفاده کرد. کد موجود در بلوک نهایی همیشه بدون در نظر گرفتن اینکه آیا استثنا گرفته شده است اجرا می شود. اگر در نهایت وجود داشته باشد، بلوک catch اختیاری است.
 
سینتکس:
try {
  code that can throw exceptions
} catch(Exception $e) {
  code that runs when an exception is caught
} finally {
  code that always runs regardless of whether an exception was caught
}

مثال۱:

هنگامی که یک استثنا پرتاب می شود پیامی را نشان دهید و سپس نشان دهید که فرآیند به پایان رسیده است:
<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} catch(Exception $e) {
  echo "Unable to divide. ";
} finally {
  echo "Process complete.";
}
?>
flesh

Unable to divide. Process complete.

مثال۲:

خروجی یک رشته حتی اگر یک استثنا گرفته نشده باشد:
<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero");
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} finally {
  echo "Process complete.";
}
?>
flesh

Process complete.

شیء استثنا

Exception Object حاوی اطلاعاتی در مورد خطا یا رفتار غیرمنتظره ای است که تابع با آن مواجه شده است.
 
سینتکس:
new Exception(message, code, previous)

مقادیر پارامترها

پارامتر توضیح
message
اختیاری. رشته ای که توضیح می دهد چرا استثنا پرتاب شده است
code
اختیاری. یک عدد صحیح که می تواند برای تشخیص آسان این استثنا از سایر موارد مشابه استفاده شود
previous
اختیاری. اگر این استثنا در یک بلوک catch یک استثنا دیگر پرتاب شده باشد، توصیه می شود آن استثنا را به این پارامتر منتقل کنید

متدها:

هنگام گرفتن یک استثنا، جدول زیر برخی از متدهایی را نشان می دهد که می توان از آنها برای به دست آوردن اطلاعات در مورد استثنا استفاده کرد:
متد شرح
getMessage()
رشته ای را برمی گرداند که توضیح می دهد چرا استثنا پرتاب شده است
getPrevious()
اگر این استثنا توسط یکی دیگر راه اندازی شده باشد، این روش استثنا قبلی را برمی گرداند. اگر نه، آنگاه null برمی‌گرداند
getCode()
کد استثنا را برمی گرداند
getFile()
مسیر کامل فایلی که استثنا در آن پرتاب شده را برمی گرداند
getLine()
شماره خط خط کدی را که استثنا را ایجاد کرده است برمی‌گرداند

مثال:

اطلاعات خروجی در مورد استثنایی که پرتاب شده است:
<?php
function divide($dividend, $divisor) {
  if($divisor == 0) {
    throw new Exception("Division by zero", 1);
  }
  return $dividend / $divisor;
}

try {
  echo divide(5, 0);
} catch(Exception $ex) {
  $code = $ex->getCode();
  $message = $ex->getMessage();
  $file = $ex->getFile();
  $line = $ex->getLine();
  echo "Exception thrown in $file on line $line: [Code $code]
  $message";
}
?>
flesh

Exception thrown in C:\xampp\htdocs\phptest.com\public_html\index.php on line 4: [Code 1] Division by zero

منبع:

w3schools.com