طراحی وب سایت کتابخانه

طراحی وب سایت کتابخانه

۳۹ مطلب با موضوع «پی اچ پی (PHP)» ثبت شده است

پی اچ پی به صورت استاندارد همراه توابع و ساختارهای مختلفی ارائه می شود. توابعی وجود دارند که برای اجرا نیازمند فعال سازی توسعه های (Extension) خاصی از پی اچ پی هستند، در غیر اینصورت خطای مرگبار (Fatal error) تابع شناخته نشده رخ خواهد داد. به عنوان مثال، برای استفاده از توابع مربوط به تصویر، مانند imagecreatetruecolor()، زبان پی اچ پی باید با پشتیبانی GD کامپایل شده باشد. یا برای استفاده از تابع mysql_connect() زبان پی اچ پی باید به همراه پشتیبانی از MySQL کامپایل شده باشد. توابع هسته بسیار زیادی وجود دارند که در هر نسخه از پی اچ پی قرار دارند، مانند string و variable. فراخوانی تابع phpinfo() یا تابع get_loaded_extensions() نشان خواهد داد که پی اچ پی شما به همراه کدام یک از توسعه ها فعال شده است . همچنین توجه داشته باشید که بسیاری از توسعه ها به صورت پیش فرض فعال هستند.

به راحتی با ساختن فایل زیر و نمایش آن در داخل کامپیوتر خود (که آن را به یک سرویس دهنده وب محلی تبدیل کرده اید) می توانید مشخصات مربوط به نسخه پی اچ پی خود را که بر روی کامپیوترتان نصب شده مشاهده نمایید.

<?php
     phpinfo();
?>

مهم است که متوجه باشید هر تابع چه چیزی را برمی گرداند یا اینکه بدانید یک تابع خاص مستقیما بر روی مقداری که به آن داده می شود عمل می کند. به عنوان مثال تابع str_replace() رشته تغییرداده شده را برمی گرداند در حالی که تابع usort() خودش بر روی متغیر واقعی که به آن ارائه شده است عمل می کند.

نکته:

اگر ورودی که برای یک تابع ارسال می کنید، با آن چیزی که تابع انتظار آن را دارد متفاوت باشد، مثلا فرستادن یک آرایه در جایی که باید رشته را بفرستید، در این حالت مقدار بازگشتی توسط تابع، تعریف نشده خواهد بود. در این حالت اوضاع شبیه به این است که مقدار NULL را بر گردانید، اما این فقط یک قرارداد است، و نمی توان بر روی آن اعتماد کرد (پس همیشه در مورد مقادیر ورودی که برای یک تابع خاص در نظر می گیرد دقت کافی داشته باشید).

۰ نظر موافقین ۱ مخالفین ۰ ۲۱ خرداد ۹۴ ، ۱۲:۳۶
مهرداد یوسفی فرد

زبان پی اچ پی از مفهوم توابع متغیر (variable functions) نیز پشتیبانی می کند. این بدان معنی است که اگر یک نام متغیر دارای پرانتز باشد، پی اچ پی به دنبال یک تابع با نام مشابه می گردد تا متغیر را بر اساس آن ارزیابی نماید، و در نهایت تلاش می کند آن را اجرا کند. علاوه بر کارهای دیگر، از این ویژگی می توان برای اجرای callback، جداول تابع، و چیزهایی شبیه به آن استفاده کرد.

توابع متغیر با ساختارهای زبانی مانند echo, print, unset(), isset(), empty() include, require و چیزهایی شبیه به آن عمل نمی کنند. اگر می خواهید از هر کدام از این ساختار ها به عنوان توابع متغیر استفاده کنید، از توابع پوشش دهنده استفاده نمایید.

مثال اول: مثال تابع متغیر

<?php
function foo() {
    echo "In foo()
\n"; } function bar($arg = '') { echo "In bar(); argument was '$arg'.
\n"; } // This is a wrapper function around echo function echoit($string) { echo $string; } $func = 'foo'; $func(); // This calls foo() $func = 'bar'; $func('test'); // This calls bar() $func = 'echoit'; $func('test'); // This calls echoit() ?>

متدهای شی را می توان در ساختار دستوری توابع متغیر فراخوانی کرد.

مثال دوم: مثال متد متغیر

<?php
class Foo
{
    function Variable()
    {
        $name = 'Bar';
        $this->$name(); // This calls the Bar() method
    }
    
    function Bar()
    {
        echo "This is Bar";
    }
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname();  // This calls $foo->Variable()

?>

هنگامی که متدهای ایستا را فراخوانی می کنیم، فراخوانی این تابع از عملگر ویژگی ایستا (Static property) قوی تر است:

مثال سوم: مثال متد متغیر به همراه ویژگی ایستا

<?php
class Foo
{
    static $variable = 'static property';
    static function Variable()
    {
        echo 'Method Variable called';
    }
}

echo Foo::$variable; // This prints 'static property'. It does need a $variable in this scope.
$variable = "Variable";
Foo::$variable();  // This calls $foo->Variable() reading $variable in this scope.

?>
۰ نظر موافقین ۱ مخالفین ۰ ۲۱ خرداد ۹۴ ، ۱۲:۱۷
مهرداد یوسفی فرد

با استفاده از عبارت return که یک عبارت انتخابی است، می توان مقادیر را بازگرداند. هر نوع اطلاعاتی را، شامل آرایه ها و اشیاء می توان بازگرداند. این عبارت باعث می شود تابع سریعا اجرای کدهای خود را متوقف کند و کنترل کدها را به خطی بازگرداند که از آن خط فراخوانی شده است.

نکته:
اگر عبارت return از قلم بیفتد، مقدار NULL بازگردانده خواهد شد.

مثال اول: استفاده از عبارت return:

<?php
function square($num)
{
    return $num * $num;
}
echo square(4);   // outputs '16'.
?>

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

مثال دوم: بازگرداندن یک آرایه به منظور بازگرداندن مقادیر چندگانه

<?php
function small_numbers()
{
    return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>

برای بازگرداندن یک مرجع از یک تابع، عملگر مرجع (&) را هم در اعلام تابع و هم زمانی که مقدار بازگشتی را به یک متغیر نسبت می دهید استفاده نمایید:

مثال سوم: بازگرداندن یک منبع از یک تابع

<?php
function &returns_reference()
{
    return $someref;
}

$newref =& returns_reference();
?> 
۰ نظر موافقین ۱ مخالفین ۰ ۲۱ خرداد ۹۴ ، ۱۲:۰۱
مهرداد یوسفی فرد

می توانیم اطلاعات را با استفاده از فهرست ورودی ها برای توابع بفرستیم؛ ورودی ها فهرستی از عبارت ها هستند که با علامت ویرگول از یکدیگر جدا شده اند. در تابع ها، ورودی ها از سمت چپ به راست مورد بررسی قرار می گیرند.

در پی اچ پی می توان ورودی ها را به صورت با مقدار (حالت پیش فرض)، با مرجع و مقادیر ورودی پیش فرض استفاده کرد. فهرست های ورودی طول متغیر نیز پشتیبانی می شوند.

مثال اول: ارسال کردن آرایه ها به تابع

<?php
function takes_array($input)
{
    echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>
ارسال ورودی ها به صورت با مرجع (By reference)

به صورت پیش فرض، ورودی های تابع به صورت با مقدار (By value) معرفی می شوند (بنابراین اگر مقدار ورودی در داخل تابع تغییر کند، مقدار آن در خارج از تابع تغییر نخواهد کرد). برای اینکه به یک تابع اجازه دهیم آرگومان خود را تغییر دهد (در خارج از محیط تابع)، باید به صورت با مرجع تعریف شوند.

برای اینکه اجازه دهیم یک ورودی به صورت با مرجع تعریف شود، یک علامت & قبل از نام ورودی در هنگام تعریف تابع قرار می دهیم:

مثال دوم: ارسال ورودی های تابع به صورت با مرجع

<?php
function add_some_extra(&$string)
{
    $string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // outputs 'This is a string, and something extra.'
?>
مقادیر پیش فرض برای ورودی های تابع

برای ورودی های اسکالر در داخل یک تابع، می توان به شیوه زبان C++ مقادیر پیش فرض تعریف کرد:

مثال سوم: استفاده از مقدار پیش فرض در ورودی های یک تابع

<?php
function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
?>

خروجی مثال بالا به این شکل خواهد بود:

Making a cup of cappuccino.
Making a cup of .
Making a cup of espresso.

پی اچ پی به شما این اجازه را می دهد که از آرایه ها و مقدار خاص NULL برای مقادیر پیش فرض ورودی های تابع استفاده کنید. مثال زیر را در نظر داشته باشید:

مثال چهارم: استفاده از مقادیر غیر اسکالر به عنوان مقدار پیش فرض در ورودی یک تابع

<?php
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
{
    $device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
    return "Making a cup of ".join(", ", $types)." with $device.\n";
}
echo makecoffee();
echo makecoffee(array("cappuccino", "lavazza"), "teapot");
?>

مقدار پیش فرض باید حتما یک عبارت ثابت باشد، و به عنوان مثال یک متغیر یا عضو کلاس یا فراخوانی یک تابع را نمی توان به عنوان مقدار پیش فرض برای ورودی یک تابع در نظر گرفت.

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

مثال پنجم: استفاده نادرست از مقادیر پیش فرض ورودی های یک تابع

<?php
function makeyogurt($type = "acidophilus", $flavour)
{
    return "Making a bowl of $type $flavour.\n";
}
 
echo makeyogurt("raspberry");   // won't work as expected
?>

خروجی مثال بالا:

Warning: Missing argument 2 in call to makeyogurt() in 
/usr/local/etc/httpd/htdocs/phptest/functest.html on line 41

مثال ششم: استفاده صحیح از ورودی های پیش فرض برای یک تابع

<?php
function makeyogurt($flavour, $type = "acidophilus")
{
    return "Making a bowl of $type $flavour.\n";
}
 
echo makeyogurt("raspberry");   // works as expected
?>

خروجی مثال بالا به این شکل خواهد بود:

Making a bowl of acidophilus raspberry.

نکته: در پی اچ پی 5، ورودی هایی که به صورت با مرجع تعریف می شوند نیز می توانند مقدار پیش فرض داشته باشند.

فهرست های ورودی طول متغیر(Variable-length)

پی اچ پی از فهرست های ورودی طول متغیر در توابع تعریف شده توسط کاربر پشتیبانی می کند. این کار با استفاده از نشانه … در پی اچ پی 5.6 به بعد انجام می شود. و در پی اچ پی 5.5 و قبل از آن با استفاده از تابع func_num_args() و func_get_arg() و func_get_args() این کار انجام می شود.

در نسخه 5.6 به بعد استفاده از ...

در پی اچ پی 5.6 و نسخه های بعد از آن، فهرست ورودی ها می تواند شامل علامت ... باشد که مشخص می کند تابع تعداد متغیر را به عنوان ورودی قبول می کند. به عنوان مثال می توان ورودی ها را به یک متغیر مشخص، به صورت آرایه معرفی کرد:

مثال هفتم: استفاده از علامت ... برای دسترسی به ورودی های متغیر

<?php
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);
?>

خروجی مثال بالا به این شکل خواهد بود:

10

همچنین می توانید از علامت ... در هنگام فراخوانی توابع استفاده کنید تا یک آرایه را باز کنید یا یک متغیر قابل عبور یا یک لیترال را به یک فهرست ورودی وارد نمایید:

مثال هشتم: استفاده از علامت ... برای آماده کردن ورودی ها

<?php
function add($a, $b) {
    return $a + $b;
}

echo add(...[1, 2])."\n";

$a = [1, 2];
echo add(...$a);
?>

خروجی مثال بالا به این شکل خواهد بود:

3
3

شما می توانید ورودی های وابسته به موقعیت معمولی را قبل از علامت ... قرار دهید. در این حالت فقط ورودی های پشتی که با ورودی وابسته به موقعیت سازگار نیستند به آرایه ای که توسط ... ایجاد شده است اضافه می شوند.

همچنین می توان یک اشاره گر نوع را قبل از نشانه ... قرار داد. اگر این اشاره گر وجود داشته باشد، تمامی ورودی هایی که توسط علامت ... ضبط می شوند باید اشیاء کلاس نشانه گذاری شده باشند.

مثال نهم: ورودی های متغیر که نوع آنها مشخص شده است

<?php
function total_intervals($unit, DateInterval ...$intervals) {
    $time = 0;
    foreach ($intervals as $interval) {
        $time += $interval->$unit;
    }
    return $time;
}

$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' days';

// This will fail, since null isn't a DateInterval object.
echo total_intervals('d', null);
?>

خروجی مثال بالا به این شکل خواهد بود:

3 days
Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2

در آخر اینکه شما همچنین می توانید ورودی های متغیر را به صورت با مرجع با قرار دادن علامت & قبل از ... معرفی کنید.

نسخه های قدیمی پی اچ پی

هیچ ساختار دستوری ویژه ای برای اینکه اشاره کنیم یک تابع از نوع متغیر است: با این وجود برای دسترسی به ورودی های تابع باید از توابع func_num_args(), func_get_arg() و func_get_args() استفاده کنیم.
اولین مثال ذکر شده در بالا را که برای نسخه های 5.5 به پایین تر نوشته شده است می توان به این شکل بازنویسی کرد:

مثال دهم: دسترسی به ورودی های متغیر در نسخه 5.5 پی اچ پی و نسخه های پایین تر از آن

<?php
function sum() {
    $acc = 0;
    foreach (func_get_args() as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1, 2, 3, 4);
?> 

خروجی مثال بالا به این شکل خواهد بود:

10
۰ نظر موافقین ۱ مخالفین ۰ ۲۱ خرداد ۹۴ ، ۱۱:۴۹
مهرداد یوسفی فرد

     یک تابع را می توان با استفاده از ساختار دستوری زیر ایجاد نمود:

مثال اول: شبه کد لازم برای نمایش کاربردهای تابع

<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
    echo "Example function.\n";
    return $retval;
}
?>

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

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

     نیازی نیست توابع را قبل از اینکه به آنها ارجاع دهید تعریف کرده باشید، به استثنای زمانی که یک تابع به صورت مشروط تعریف می شود، مانند دو مثال زیر.

     زمانی که یک تابع به شیوه شرطی تعریف می شود، مانند دو مثال زیر، تعریف آن باید قبل از فراخوانی تابع انجام شده باشد.

مثال دوم: توابع شرطی

<?php

$makefoo = true;

/* We can't call foo() from here 
   since it doesn't exist yet,
   but we can call bar() */

bar();

if ($makefoo) {
  function foo()
  {
    echo "I don't exist until program execution reaches me.\n";
  }
}

/* Now we can safely call foo()
   since $makefoo evaluated to true */

if ($makefoo) foo();

function bar() 
{
  echo "I exist immediately upon program start.\n";
}

?>

مثال سوم: توابع در داخل توابع

<?php
function foo() 
{
  function bar() 
  {
    echo "I don't exist until foo() is called.\n";
  }
}

/* We can't call bar() yet
   since it doesn't exist. */

foo();

/* Now we can call bar(),
   foo()'s processing has
   made it accessible. */

bar();

?>

     تمامی توابع و کلاس ها در پی اچ پی داره حوزه سراسری هستند (global scope) – آنها را می توان در خارج از یک تابع فراخوانی کرد حتی اگر در داخل تابع تعریف شده باشند و بالعکس.

     پی اچ پی از سربار (overload) توابع پشتیبانی نمی کند، همچنین امکان تعریف دوباره یا از تعریف خارج کردن توابعی که قبلا معرفی شده اند وجود ندارد.

نکته: نام توابع به بزرگی و کوچکی حروف حساس نیستند، البته معمولا بهتر است که توابع را همانگونه که در تعریفشان مشخص شده اند فراخوانی کنید.

     در پی اچ پی می توان توابع برگشتی را نیز فراخوانی کرد. با این وجود از استفاده از فراخوانی توابع یا متدهایی که بیش از 100 الی 200 مرحله بازگشتی دارند خودداری نمایید به خاطر اینکه ممکن است این مساله باعث شود پشته آسیب ببیند و اجرای اسکریپت فعلی متوقف شود.

مثال چهارم: توابع بازگشتی

<?php
function recursion($a)
{
    if ($a < 20) {
        echo "$a\n";
        recursion($a + 1);
    }
}
?> 
۰ نظر موافقین ۱ مخالفین ۰ ۲۰ خرداد ۹۴ ، ۱۳:۲۲
مهرداد یوسفی فرد

عبارت include_once در هنگام اجرای اسکریپت، فایل مشخص شده را داخل کرده و محتویات آن را ارزیابی می کند. رفتار این عبارت، همانند رفتار عبارت include می باشد، با این تفاوت که اگر یک کد از یک فایل قبلا فراخوانی شده باشد، دوباره فراخوانی نمی شود. همانگونه که از نام این عبارت پیداست، فایل فقط یکبار فراخوانی خواهد شد.

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

نکته:
در پی اچ پی 4، عبارت های _once در سیستم های عامل غیرحساس به حروف بزرگ و کوچک (مثل ویندوز) عملکرد متفاوتی دارند به عنوان مثال:

مثال اول: استفاده از دستور require_once در یک سیستم عامل غیرحساس به بزرگی و کوچکی حروف در پی اچ پی نسخه 4

<?php
include_once "a.php"; // this will include a.php
include_once "A.php"; // this will include a.php again! (PHP 4 only)
?>

این رفتار در پی اچ پی نسخه 5 تغییر کرده است، بنابراین به عنوان مثال در ویندوز، مسیر در ابتدا نرمال سازی می شود، بنابراین مسیر C:\PROGRA~1\A.php همانند مسیر C:\Program Files\a.php تشخیص داده می شود و فایل فقط یک مرتبه فراخوانی می گردد.

موافقین ۱ مخالفین ۰ ۱۹ خرداد ۹۴ ، ۱۲:۵۱
مهرداد یوسفی فرد

دستور require_once همانند دستور require است با این تفاوت که در این دستور، پی اچ پی بررسی می کند آیا فایل مورد نظر قبلا فراخوانی شده است یا خیر، و اگر چنین باشد، فایل را دوباره فراخوانی نمی کند و در نتیجه از بروز خطاهای احتمالی، مخصوصا در مورد فراخوانی توابع، جلوگیری می شود.

۰ نظر موافقین ۱ مخالفین ۰ ۱۹ خرداد ۹۴ ، ۱۲:۴۵
مهرداد یوسفی فرد

عبارت include فایلی را که مشخص کرده اید فراخوانی و ارزیابی می کند. توضیحات زیر در مورد دستور require نیز صدق می کند.

فایل ها بر اساس مسیری که برای آن مشخص شده است فراخوانی می شوند، و اگر مسیری مشخص نشده باشد، بر اساس مقدار تعیین شده در include_path فراخوانی می شوند. اگر فایل شما در داخل دایرکتوری(پوشه) مشخص شده در include_path وجود نداشته باشد، در نهایت دستور include پوشه ای که اسکریپت از داخل آن اجرا شده و دایرکتوری فعلی را قبل از بروز هرنوع خطا بررسی می کند. اگر دستور include نتواند فایل را پیدا کند، یک هشدار نمایش داده می شود؛ این رفتار با رفتار دستور require متفاوت است، چون دستور require در این حالت یک خطای مرگبار (Fatal Error) را بوجود می آورد.

اگر یک مسیر مشخص شده باشد – مسیر در ویندوز با یک حرف درایور یا علامت بک اسلش \ آغاز می شود، یا در لینوکس و یونیکس با اسلش / - مقدار تعیین شده در include_path به طور کلی نادیده گرفته می شود. به عنوان مثال اگر نام یک فایل با عبارت ../ شروع شود، پردازشگر در داخل پوشه والد (یک پوشه بالاتر) به دنبال آن می گردد تا فایل درخواست شده را پیدا نماید.

برای به دست آوردن اطلاعات بیشتر در مورد اینکه پی اچ پی چگونه فایلها را دستکاری می کند و مسیر را چگونه مشخص می کند، مستندات مربوط به include_path را مطالعه کنید.

هنگامی که یک فایل را فراخوانی می کنید، کدی که در داخل این فایل قرار دارد از لحاظ محدوده متغیرها، از همان خطی (خطی که در فایل اصلی، دستور include در داخل آن قرارداده شده است) تبعیت می کند که دستور include در داخل آن قرار داده شده. از آن نقطه به بعد هر متغیری که در خطی که فایل فراخوانی شده است وجود داشته باشد در داخل فایل فراخوانی شده نیز در دسترس خواهد بود. با این وجود، تمامی توابع و کلاسهایی که در فایل فراخوانی شده وجود دارند دارای محدوده سراسری هستند.

مثال اول: کاربرد دستور include در حالت کلی

vars.php
<?php

$color = 'green';
$fruit = 'apple';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

اگر دستور include در داخل یک تابع در فایل فراخوانی شده استفاده شود، پس از آن تمام کدهایی که در داخل فایل فراخوانی شده قرار دارند به گونه ای عمل می کنند که گویا در داخل تابع تعریف شده اند. بنابراین از لحاظ محدوده متغیرها، از محدوده تابع تبعیت می کنند. یک استثناء در این مورد وجود دارد: ثابت های جادویی (magic_constants )، پردازشگر آنها را قبل از فراخوانی ارزیابی می کند.

مثال دوم: استفاده از دستور include در داخل توابع

<?php

function foo()
{
    global $color;

    include 'vars.php';

    echo "A $color $fruit";
}

/* vars.php is in the scope of foo() so    *
* $fruit is NOT available outside of this  *
* scope.  $color is because we declared it *
* as global.                               */

foo();                    // A green apple
echo "A $color $fruit";   // A green

?>

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

اگر حالت URL include wrappers در پی اچ پی فعال باشد، شما می توانید به جای اینکه مسیر محلی را مشخص نمایید فایل مورد نظر خود را با استفاده از یو آر ال مشخص کنید (اینکار را می توانید با استفاده از اچ تی تی پی یا سایر بسته بندی های پشتیبانی شده انجام دهید). اگر سرویس دهنده هدف، فایل هدف را به عنوان یک کد پی اچ پی تفسیر کند، ممکن است متغیرها با استفاده از رشته های درخواست (Query Strings) از طریق یو آر ال ( همانگونه که با استفاده از HTTP GET انجام می شود ) برای فایل مورد استفاده، ارسال گردد. این حالت دقیقا شبیه به حالتی نیست که فایل را وارد می کنیم و متغیرها، همان حوزه متغیرهای فایل والد را به ارث می برند؛ در واقع کد بر روی سرور بیرونی اجرا می شود و سپس نتیجه در داخل فایل محلی قرار می گیرد.

مثال سوم: استفاده از دستور include با استفاده از پروتکل HTTP

<?php

/* This example assumes that www.example.com is configured to parse .php
* files and not .txt files. Also, 'Works' here means that the variables
* $foo and $bar are available within the included file. */

// Won't work; file.txt wasn't handled by www.example.com as PHP
include 'http://www.example.com/file.txt?foo=1&bar=2';

// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the
// local filesystem.
include 'file.php?foo=1&bar=2';

// Works.
include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;
$bar = 2;
include 'file.txt';  // Works.
include 'file.php';  // Works.

?>

هشدار امنیتی

فایل های راه دور ممکن است بر روی سرویس دهنده راه دور اجرا شوند (این امر به توسعه فایل - پسوند فایل - شما بستگی دارد و اینکه آیا سرویس دهنده راه دور توانایی اجرای فایل های پی اچ پی را دارد یا خیر). اما در هر صورت این فایل ها باید یک کد پی اچ پی معتبر را ایجاد کنند به خاطر اینکه خروجی آن بر روی سرویس دهنده محلی اجرا خواهد شد. اگر قرار است فایل موجود بر روی سرویس دهنده راه دور پردازش شود و سپس فقط خروجی خود را ارائه کند، استفاده از تابع readfile() بسیار مناسب تر است. در غیر اینصورت، باید مراقبتهای خاصی را به عمل آورید که اسکریپت راه دور کد مورد نظر شما را به صورت معتبر ایجاد نماید.

مدیریت کردن مقادیر بازگشتی: دستور include در هنگام بروز خطا مقدار FALSE را بر می گرداند و یک هشدار را نمایش می دهد. دستور include موفق، حتی اگر با فایل وارد شده جایگزین شده باشد، مقدار 1 را بر می گرداند. می توان مقدار عبارت return را در داخل فایل وارد شده اجرا کرد تا پردازش آن را در داخل آن فایل پایان دهیم و مقدار را به اسکریپتی که آن را فراخوانی کرده است برگردانیم. همچنین می توان مقادیر را از داخل فایل های وارد شده بازگردانیم. شما می توانید مقدار فایل فراخوانی شده را همانگونه که در مورد یک تابع معمولی انجام می دهیم، بازگردانید. این کار در مورد فایلهایی که بر روی یک سرویس دهنده راه دور قرار دارند عملی نیست؛ مگر اینکه خروجی فایل راه دور تگهای استاندارد آغازین و پایانی پی اچ پی را داشته باشند (همانند یک فایل محلی). شما می توانید متغیرهای مورد نیاز را در بین آن تگ ها معرفی کنید و آنها در هر نقطه ای از فایل که وارد شده باشند، معرفی خواهند شد.

از آنجا که دستور include یک ساختار زبانی خاص است، نیازی به استفاده از پرانتز در اطراف آرگومان های آن نیست. در هنگام مقایسه مقادیر بازگشتی بیشتر احتیاط کنید.

مثال چهارم: مقایسه مقدار بازگشتی توسط دستور include

<?php
// won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
    echo 'OK';
}

// works
if ((include 'vars.php') == 'OK') {
    echo 'OK';
}
?>

مثال پنجم: دستور include و عبارت return

return.php
<?php

$var = 'PHP';

return $var;

?>

noreturn.php
<?php

$var = 'PHP';

?>

testreturns.php
<?php

$foo = include 'return.php';

echo $foo; // prints 'PHP'

$bar = include 'noreturn.php';

echo $bar; // prints 1

?>

مقدار متغیر $bar عدد 1 است، به این خاطر که فرایند فراخوانی فایل به درستی انجام شده (در این حالت دستور include مقدار 1 را بر می گرداند). به تفاوت بین دو مثال بالا دقت کنید. در مثال اول از عبارت return در داخل فایل فراخوانی شده استفاده کرده ایم در حالی که در فایل دیگر این کار را انجام نداده ایم. اگر فایل را نتوانیم فراخوانی کنیم، مقدار FALSE برگردانده می شود و یک هشدار سطح E_WARNING بروز خواهد کرد.

اگر توابعی وجود دارند که در داخل فایل فراخوانی شده تعریف شده اند، در صورتی که قبل یا بعد از آن توابع از عبارت return استفاده کرده باشیم، می توانیم از آن توابع در داخل فایل اصلی استفاده نماییم. اگر فایل را دو مرتبه فراخوانی کنیم، در پی اچ پی 5 یک خطای مرگبار رخ خواهد داد به خاطر اینکه قبلا تابع ها معرفی شده اند، در پی اچ پی 4 هیچ شکایتی نسبت به توابعی که بعد از return تعریف شده اند وجود ندارد. توصیه می شود به جای اینکه بررسی کنید آیا فایل قبلا فراخوانی شده است یا خیر، از دستور include_once استفاده نمایید.

یک روش دیگر برای اینکه محتوای یک فایل پی اچ پی را در داخل یک متغیر قرار دهید این است که از توابع کنترل خروجی با استفاده از include استفاده کنید. به عنوان مثال:

مثال ششم: استفاده از بافر کردن خروجی برای اینکه مقدار یک عبارت پی اچ پی را در یک رشته قرار دهیم

<?php
$string = get_include_contents('somefile.php');

function get_include_contents($filename) {
    if (is_file($filename)) {
        ob_start();
        include $filename;
        return ob_get_clean();
    }
    return false;
}

?>

به منظور اینکه به صورت خودکار فایل ها را در داخل کدهای خود فراخوانی کنید، به گزینه های پیکربندی auto_prepend_file و auto_append_file توجه کنید.

نکته: به خاطر اینکه این دستور، یک ساختار زبانی است و یک تابع نیست، نمی توان آن را با استفاده از توابع متغیر (Variable functions) فراخوانی کرد.

۰ نظر موافقین ۱ مخالفین ۰ ۱۹ خرداد ۹۴ ، ۱۲:۴۲
مهرداد یوسفی فرد

دستور require مشابه دستور include عمل می کند، با تفاوت در سطح ایجاد خطا؛ به این معنی که این دستور می تواند خطایی در سطح E_COMPILE_ERROR ایجاد نماید. در حقیقت، این دستور با ایجاد چنین خطایی می تواند کدهای شما را متوقف کند در حالی که دستور include فقط یک هشدار (E_WARNING) بوجود می آورد و به کدهای شما اجازه می دهد کار خود را ادامه دهند.

۰ نظر موافقین ۱ مخالفین ۰ ۱۸ خرداد ۹۴ ، ۱۲:۵۵
مهرداد یوسفی فرد

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

البته مطمئنا اینکه کار کدنویسی صفحات پی اچ پی را بر روی یک سرور فعال در اینترنت انجام دهیم کاری درست و منطقی به نظر نمی رسد. برای برنامه نویسان بهترین روش، و البته صحیح ترین روش، این است که کدهای خود را بر روی یک کامپیوتر محلی بنویسند و پس از آزمایش و اطمینان از صحیح بودن کدهای نوشته شده، کدها را به یک سرور فعال بر روی اینترنت منتقل نمایند. برای این منظور باید پی اچ پی را بر روی کامپیوتر شخصی خود نصب کنید تا بتوانید کدهای پی اچ پی را اجرا کنید. البته توجه داشته باشید که برای اجرای فایل های پی اچ پی خود علاوه بر پی اچ پی حداقل به یک سرویس دهنده وب (Web Server) نیز نیاز دارید؛ اگر در کدهای خود به یک پایگاه اطلاعاتی نیز نیاز داشته باشید، مطمئنا باید یک پایگاه اطلاعاتی نیز بر روی کامپیوتر شخصی خود نصب کنید که معمولا در زبان پی اچ پی از پایگاه اطلاعاتی MySQL استفاده می شود. بنابراین به طور خلاصه برای کد نویسی پی اچ پی به صورت محلی بر روی کامپیوتر شخصی خود به این موارد نیاز دارید:

- پی اچ پی (PHP)
- سرویس دهنده وب (Web Server)
- و به احتمال زیاد یک پایگاه اطلاعاتی (که معمولا از یک پایگاه اطلاعاتی MySQL استفاده می شود)

می توانید هرکدام از ملزومات ذکر شده در بالا را به صورت جداگانه دانلود کنید و بر روی کامپیوتر خود نصب نمایید. فایلهای پی اچ پی و MySQL از روی وب سایت های مربوط به آنها قابل دسترسی و دانلود کردن هستند که می توانید متناسب با سیستم عامل کامپیوتر شخصی خود نسخه مناسب را دانلود کرده و آن را به صورت جداگانه نصب نمایید. به عنوان سرویس دهنده وب نیز می توانید از سرویس دهنده وب IIS که مخصوص ویندوز است استفاده کنید و یا از سرویس دهنده وب آپاچی (که البته پرطرفدارتر، بهتر و سریعتر است) استفاده نمایید.

نصب هر کدام از این اجزا به صورت جداگانه، وقت گیر و کمی تخصصی است و ممکن است در برخی مراحل نصب دچار مشکل شوید. به همین دلیل نرم افزارهایی وجود دارند که تمامی این ملزومات را به صورت یکجا برای شما بر روی کامپیوترتان نصب می کنند. دو مورد از نرم افزارهایی که پی اچ پی، سرویس دهنده وب آپاچی، پایگاه اطلاعاتی MySQL و رابط کاربری مربوط به این پایگاه اطلاعاتی (phpmyadmin) را برای ما به صورت یکجا نصب می کنند، نرم افزارهای Wamp و Xamp هستند. در این قسمت به آموزش نصب نرم افزارWamp می پردازیم.

پیش از شروع به کار نصب نرم افزار Wamp باید توجه داشته باشید که به چه نسخه ای از پی اچ پی، MySQL، Apache و phpmyadmin نیاز دارید. اگر کدهای نوشته شده توسط شما، یا سیستم مدیریت محتوایی که قصد نصب آن را دارید، به نسخه خاصی از پی اچ پی نیاز دارد حتما باید این مورد را در نظر بگیرید، بنابراین قبل از دانلود نرم افزار Wamp حتما توجه کنید که چه نسخه ای از موارد یاد شده را بر روی کامپیوتر شما نصب می کند.

ما در اینجا نسخه 2.2 نرم افزار WampServer را برای نصب دانلود کرده ایم.

توجه داشته باشید که در هنگام دانلود نرم افزار Wamp امکان انتخاب نسخه 64 بیتی نیز وجود دارد. ما در این قسمت نسخه 32 بیتی را انتخاب کرده ایم. مانند هر نرم افزار تحت ویندوز دیگر، بر روی فایل اجرایی مربوط به نرم افزار دبل کلیک می کنیم تا نصب نرم افزار آغاز شود:

همانطور که در تصویر بالا مشاهده می کنید در پنجره اول مربوط به نصب نرم افزار، نسخه های پی اچ پی، MySQL، آپاچی، phpmyadmin، و موارد دیگر نمایش داده می شود. اگر نسخه های موارد یاد شده با نیازهای شما تطبیق داشت بر روی دکمه next کلیک کنید.

در این مرحله می توانید مجوز نرم افزار را مطالعه نموده و در صورت توافق، گزینه I accept … را انتخاب کرده و بر روی دکمه next کلیک کنید.

حالا باید مسیر مربوط به نصب نرم افزار را انتخاب کنیم. به صورت پیش فرض، نرم افزار بر روی درایو c و در داخل پوشه ای با نام wamp نصب می شود. اگر بخواهیم می توانید با کلیک بر روی دکمه Browse مسیر دیگری را برای نصب انتخاب کنید. در نظر داشته باشید که تمام فایل های مربوط به نرم افزار در این پوشه نصب می گردد و در آینده با سر زدن به این پوشه می توانید به تمام فایل ها دسترسی داشته باشید. پس از انتخاب پوشه و درایو مورد نظر، بر روی دکمه next کلیک کنید:

در مرحله بعد (تصویر بالا)، دو گزینه موجود را انتخاب کنید: ایجاد یک آیکون در منوی مربوط به ویندوز، و ایجاد یک آیکون بر روی دسکتاپ. البته اگر احساس می کنید به این دو گزینه نیاز ندارید می توانید آنها را انتخاب نشده رها کنید. حالا دوباره بر روی کلید next کلیک کنید.

حالا همه چیز برای نصب برنامه آماده است. مسلما مانند تمام برنامه های تحت ویندوز، می توانید با زدن دکمه back به مرحله قبلی برگردید و تنظیمات را مجددا انجام دهید. اگر تا اینجای کار از فرایند انجام شده مطمئن هستید، بر روی دکمه install کلیک کنید تا نصب برنامه آغاز شود.

در این مرحله، نصب برنامه شروع شده و تمامی اجزاء نرم افزار بر روی کامپیوتر شما نصب خواهد شد.

در انتهای مرحله نصب، از شما درخواست می شود که مرورگر وب پیش فرض خود را انتخاب نمایید. به صورت پیش فرض، مرورگر IE انتخاب شده است که ما نیز همان را انتخاب کرده و بر روی دکمه open کلیک می کنیم تا مراحل نصب ادامه پیدا کند.

در این مرحله تنظیمات مربوط به سرور SMTP و ایمیل را انجام می دهیم. در قسمت SMTP مقدار localhost را قرار دهید و در قسمت ایمیل، ایمیل خود را وارد کنید. حالا بر روی دکمه next کلیک کنید.

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

با فشار دادن دکمه finish در مرحله قبل، نرم افزار WampServer راه اندازی می شود. توجه کنید که اگر در مرحله قبلی، گزینه راه اندازی نرم افزار را کلیک نکرده باشید برای دسترسی به WampServer و راه اندازی آن باید از منوی start نرم افزار WampServer را پیدا کرده و بر روی آن کلیک نمایید. با راه اندازی WampServer ، در نوار پایین صفحه در سمت راست آیکون مربوط به نرم افزار پدیدار می شود که در ابتدا قرمز رنگ است و سپس نارنجی شده و پس از آنکه تمام سرویس ها فعال شد (php, MySQL, Apache) به رنگ سبز در می آید(شکل زیر).

رنگ سبز آیکون مربوط به نرم افزار WampServer به این معنی است که تمام سرویس ها به درستی در حال اجرا هستند و شما به پی اچ پی دسترسی دارید و سرویس دهنده وب نیز به درستی راه اندازی شده است.

اگر بر روی آیکون نرم افزار WampServer (که در نوار پایین صفحه ویندوز، در قسمت سمت راست قابل مشاهده است) کلیک چپ کنید، گزینه های مربوط به نرم افزار قابل مشاهده می باشد. همانطور که در تصویر بالا مشاهده می کنید، می توانید نسخه مربوط به آپاچی، پی اچ پی، و MySQL را از این طریق مشاهده کنید. موس را که بر روی هر کدام از گزینه های قرار دهید، می توانید به تنظیمات مربوط به سرویس ها، و توسعه های مربوط به آن سرویس دسترسی داشته باشید. مثلا همانطور که در تصویر بالا مشاهده می کنید می توانید نام های مستعار مربوط به دایرکتوری ها را مدیریت کنید، ماژول های آپاچی را فعال یا غیر فعال کنید ... .

با کلیک بر روی پی اچ پی (تصویر بالا) می توانید به گزینه های مربوط به تنظیمات پی اچ پی دسترسی داشته باشید و آنها را فعال یا غیر فعال کنید. در برخی موارد هنگام برنامه نویسی یا نصب یک سیستم مدیریت محتوا یا چیزی شبیه به آن ممکن است که به یکی از ویژگیهای پی اچ پی نیاز داشته باشید یا اینکه لازم باشد یکی از تنظیمات را غیر فعال کنید. این کار را می توانید در این قسمت به راحتی انجام دهید.

توسعه های (Extension) مربوط به پی اچ پی را نیز می توانید با استفاده از منوی PHP Extensions فعال یا غیر فعال کنید.

توجه داشته باشید هنگامی که در پی اچ پی یا آپاچی یا MySQL یک ویژگی را فعال یا غیر فعال می کنیم یا یک توسعه یا ماژول را فعال یا غیر فعال می کنیم، برای دسترسی به امکاناتی که آن تغییرات در اختیار ما قرار می دهد، باید سرویس ها را دوباره راه اندازی کنیم (Restart). گزینه های قسمت پایین منوی مربوط به نرم افزار WampServer این امکانات را در اختیار ما قرار می دهد. می توانید تمام سرویس ها را متوقف کنید(Stop all services)، می توانید تمام سرویس ها را فعال کنید(Start all services)، می توانید تمام سرویس ها را دوباره راه اندازی کنید (Restart all services). اگر در حین انجام کار مشکلی برای یکی از سرویس های پی اچ پی، آپاچی، یا MySQL پیش آمد می توانید با راه اندازی مجدد سرویس ها، به سیستم اجازه دهید خود را بازسازی کرده و مشکل شما را حل کند.

اگر بر روی آیکون مربوط به نرم افزار WampServer کلیک راست نمایید، می توانید با کلیک کردن بر روی منوی exit به طور کلی از نرم افزار خارج شوید. با این کار تمام سرویس ها غیر فعال می شوند.

حالا که نرم افزار WampServer را راه اندازی کرده ایم و به تمام سرویس های مربوط به پی اچ پی، آپاچی، و MySQL دسترسی داریم، چگونه باید از این سرویس ها استفاده کنیم؟ با فعال بودن WampServer کامپیوتر ما به یک سرویس دهنده وب محلی تبدیل شده و می توانیم کدهای پی اچ پی و البته اچ تی ام ال خود را با استفاده از مرورگر وب مشاهده کنیم. با تایپ کردن عبارت localhost در نوار آدرس مرورگر وب خود می توانید به صفحه اول سرویس دهنده وب محلی خودتان دسترسی داشته باشید. با کلیک چپ بر روی آیکون نرم افزار WampServer و انتخاب گزینه localhost به همین صفحه هدایت می شوید. WampServer این صفحه را با مرورگر وبی که به صورت پیش فرض انتخاب شده است باز می کند که ما IE را به عنوان مرورگر پیش فرض انتخاب کردیم.

حتما برای شما این سوال پیش می آید که صفحه مربوط به localhost در کجا قرار دارد و اگر بخواهیم صفحات دیگری ایجاد کنیم باید آنها را در کجا قرار دهیم؟ اگر یادتان باشد در هنگام نصب، نرم افزار WampServer را بر روی درایو c و در پوشه wamp نصب کردیم. اگر به این پوشه سری بزنیم مشاهده می کنیم که پوشه ای با نام www در داخل آن وجود دارد. این پوشه همان پوشه اصلی است که باید فایلهای مربوط به کدهای خود را در داخل آن قرار دهیم. فرض کنید یک فایل با نام sample.php ایجاد کرده ایم. اگر این فایل را در داخل مسیر c:/wamp/www قرار دهیم، با تایپ آدرس localhsot/sample.php در نوار آدرس مرورگر وب خود، می توانیم به سادگی به محتویات آن دسترسی داشته باشیم. یا به عنوان مثال دیگر اگر یک پوشه با نام touk در مسیر c:/wamp/www ایجاد کنیم (c:/wamp/www/touk) برای دسترسی به محتویات این پوشه باید در نوار آدرس مرورگر وب خود اینگونه تایپ کنیم: localhost/touk- البته آپاچی به صورت پیش فرض دنبال فایل های index. (مثلا با پسوند htm, html, php) می گردد. در غیر اینصورت باید دقیقا مشخص کنیم که قصد باز کردن و خواندن چه فایلی را داریم. نگران نباشید، با جزئیات مربوط به این موارد به مرور زمان آشنا خواهید شد.

در شکل بالا، صفحه قابل مشاهده در آدرس localhost را مشاهده می کنید. همانطور که می بینید در این صفحه اطلاعات مربوط به نسخه پی اچ پی، آپاچی و MySQL را مشاهده می کنیم. توسعه های (Extensions) نصب شده توسط پی اچ پی نیز قابل مشاهده می باشند. در قسمت ابزارها (Tools) دو لینک وجود دارد، یکی phpinfo() و دیگری phpmyadmin. Phpinfo() ما را به صفحه ای منتقل می کند که در واقع همان اطلاعات بازگردانده شده توسط تابع phpinfo() را نمایش می دهد. در این صفحه (شکل زیر) تمامی اطلاعات مربوط به نسخه پی اچ پی نصب شده بر روی سیستم ما قابل مشاهده می باشد. مطالعه این صفحه به شما کمک می کند به طور دقیق بدانید پی اچ پی نصب شده بر روی سیستم شما از چه امکاناتی برخوردار است.

Phpmyadmin یک رابط کاربری بسیار مفید برای کار کردن با پایگاه اطلاعاتی MySQL است. با کلیک بر روی این گزینه به صفحه اول مربوط به رابط کاربری Phpmyadmin منتقل می شوید. در اینجا می توانید کارهای زیادی از قبیل مشاهده پایگاه های اطلاعاتی موجود و جداول آنها، ایجاد پایگاه اطلاعاتی جدید، ایجاد نام کاربری جدید، و همه کارهای مربوط به پایگاه اطلاعاتی را انجام دهید. در فرصت های آینده توضیحات کامل تری در مورد کار با Phpmyadmin ارائه خواهد شد.

۰ نظر موافقین ۱ مخالفین ۰ ۱۷ خرداد ۹۴ ، ۱۰:۴۸
مهرداد یوسفی فرد