វិសាលភាពនៃអថេរគឺជាបរិបទដែលអថេរត្រូវបានកំណត់។
ក្នុងករណីភាគច្រើន អថេរ PHP ទាំងអស់មានវិសាលភាពតែមួយប៉ុណ្ណោះ។ វិសាលភាពតែមួយនេះក៏គ្របដណ្តប់ឯកសារដែលបានរួមបញ្ចូល និងដែលត្រូវការផងដែរ។ ឧទាហរណ៍៖
$a = 1 ;
?>
រួមបញ្ចូល "b.inc" ;
នៅទីនេះអថេរ $a នឹងមាននៅក្នុងស្គ្រីប b.inc ដែលរួមបញ្ចូល។ ទោះយ៉ាងណាក៏ដោយ និយមន័យ (តួ) នៃមុខងារកំណត់ដោយអ្នកប្រើប្រាស់ បញ្ជាក់ពីវិសាលភាពមូលដ្ឋាននៃមុខងារនោះ។ អថេរណាមួយដែលប្រើក្នុងអនុគមន៍គឺតាមលំនាំដើមកំណត់ចំពោះវិសាលភាពមូលដ្ឋានរបស់អនុគមន៍។
ឧទាហរណ៍៖
{
$a = 1 ; // វិសាលភាពសកល*/
}
ការធ្វើតេស្តមុខងារ ()
?>
បន្ទរ $a ;
/* យោងទៅអថេរវិសាលភាពមូលដ្ឋាន */ តេស្ត ();
ស្គ្រីបនេះនឹងមិនបង្កើតលទ្ធផលណាមួយទេ ដោយសារសេចក្តីថ្លែងការណ៍អេកូចង្អុលទៅកំណែមូលដ្ឋាននៃអថេរ $a ហើយវាមិនត្រូវបានផ្តល់តម្លៃនៅក្នុងវិសាលភាពនោះទេ។ អ្នកប្រហែលជាបានកត់សម្គាល់ឃើញថាវាខុសគ្នាបន្តិចបន្តួចពី C នៅក្នុងដែលអថេរសកលនៅក្នុង C អាចប្រើបានដោយស្វ័យប្រវត្តិចំពោះមុខងារ លុះត្រាតែពួកវាត្រូវបានសរសេរជាន់ពីលើដោយនិយមន័យក្នុងស្រុក។ នេះអាចបណ្តាលឱ្យមានបញ្ហាមួយចំនួន ដោយសារមនុស្សអាចផ្លាស់ប្តូរអថេរសកលដោយចៃដន្យ។ នៅក្នុង PHP ប្រសិនបើអថេរសកលត្រូវប្រើក្នុងមុខងារមួយ វាត្រូវតែត្រូវបានប្រកាសជាសកលនៅក្នុងនិយមន័យមុខងារ។ តេស្ត ();:
ពាក្យគន្លឹះ តេស្ត ();
ក្នុងករណីភាគច្រើន អថេរ PHP ទាំងអស់មានវិសាលភាពតែមួយប៉ុណ្ណោះ។ វិសាលភាពតែមួយនេះក៏គ្របដណ្តប់ឯកសារដែលបានរួមបញ្ចូល និងដែលត្រូវការផងដែរ។ ឧទាហរណ៍៖
សកល
ជាដំបូងឧទាហរណ៍នៃការប្រើប្រាស់
{
ឧទាហរណ៍ទី 1 ការប្រើប្រាស់
$b = 2 ;
}
ផលបូក()
សកល $a, $b;
?>
$b = $a + $b ; 3 ផលបូក();
បន្ទរ $b ;
$GLOBALS គឺជាអារេសហការដែលកូនសោគឺឈ្មោះនិងតម្លៃជាខ្លឹមសារនៃអថេរសកល។ សូមចំណាំថា $GLOBALS មាននៅក្នុងវិសាលភាពណាមួយ នេះគឺដោយសារតែ $GLOBALS ជាសកល។
ខាងក្រោមនេះជាឧទាហរណ៍ដែលបង្ហាញពីសមត្ថភាពរបស់ superglobals៖
ឧទាហរណ៍ #3 មហាសកល និងវិសាលភាព
{
មុខងារ test_global()
// អថេរដែលបានកំណត់ជាមុនភាគច្រើនគឺមិនមែនទេ។
// "អស្ចារ្យ" និងអាចរកបាននៅក្នុងតំបន់
// ភាពមើលឃើញ មុខងារតម្រូវឱ្យបញ្ជាក់ "សកល" ។
សកល $ HTTP_POST_VARS ;
អេកូ $HTTP_POST_VARS["ឈ្មោះ"];
// Superglobals មាននៅក្នុងវិសាលភាពណាមួយ។
// ភាពមើលឃើញនិងមិនតម្រូវឱ្យមាន "សកល" ត្រូវបានបញ្ជាក់។
// Superglobals មានតាំងពី PHP 4.1.0 និង
// ការប្រើប្រាស់ HTTP_POST_VARS ត្រូវបានបដិសេធ។
}
?>
បន្ទរ $_POST ["ឈ្មោះ" ];:
មតិយោបល់ តេស្ត ();ការប្រើប្រាស់ពាក្យគន្លឹះ
នៅខាងក្រៅមុខងារមិនមែនជាកំហុសទេ។ វាអាចត្រូវបានប្រើក្នុងឯកសារដែលត្រូវបានរួមបញ្ចូលក្នុងមុខងារមួយ។ ការប្រើប្រាស់ឋិតិវន្ត (ឋិតិវន្ត
) អថេរ លក្ខណៈសំខាន់មួយទៀតនៃវិសាលភាពអថេរគឺឋិតិវន្ត
អថេរ។ អថេរឋិតិវន្តមាននៅក្នុងវិសាលភាពមូលដ្ឋាននៃអនុគមន៍មួយប៉ុណ្ណោះ ប៉ុន្តែមិនបាត់បង់តម្លៃរបស់វានៅពេលដែលការប្រតិបត្តិកម្មវិធីចាកចេញពីវិសាលភាពនោះ។ សូមពិចារណាឧទាហរណ៍ខាងក្រោម៖
ឧទាហរណ៍ #4 បង្ហាញពីតម្រូវការសម្រាប់អថេរឋិតិវន្ត
{
ការធ្វើតេស្តមុខងារ ()
$a = 0 ;
បន្ទរ $a ;
}
?>
$a++; 0 មុខងារនេះពិតជាគ្មានប្រយោជន៍ទេ ព្រោះរាល់ពេលដែលគេហៅវាកំណត់ $a ទៅ 0 និងលទ្ធផល
. ការកើនឡើងនៃអថេរ $a ++ មិនដើរតួនាទីនៅទីនេះទេ ដោយសារអថេរ $a បាត់នៅពេលមុខងារចេញ។ ដើម្បីសរសេរមុខងាររាប់មានប្រយោជន៍ដែលមិនបាត់បង់តម្លៃរាប់បច្ចុប្បន្ន អថេរ $a ត្រូវបានប្រកាសថាឋិតិវន្ត៖
ឧទាហរណ៍ #4 បង្ហាញពីតម្រូវការសម្រាប់អថេរឋិតិវន្ត
{
ឧទាហរណ៍ #5 ឧទាហរណ៍នៃការប្រើប្រាស់អថេរឋិតិវន្ត
$a = 0 ;
បន្ទរ $a ;
}
?>
ឋិតិវន្ត $a = 0 ; ឥឡូវនេះ $a នឹងត្រូវបានចាប់ផ្តើមតែនៅលើការហៅមុខងារដំបូងប៉ុណ្ណោះ និងការហៅមុខងារនីមួយៗតេស្ត ()
នឹងបោះពុម្ពតម្លៃ $a ហើយបង្កើនវា។
បន្ទរ $_POST ["ឈ្មោះ" ];:
អថេរឋិតិវន្តអាចត្រូវបានប្រកាសដូចដែលបានបង្ហាញក្នុងឧទាហរណ៍មុន។ ការប៉ុនប៉ងកំណត់តម្លៃទៅអថេរទាំងនេះដែលជាលទ្ធផលនៃកន្សោមនឹងបណ្តាលឱ្យមានកំហុសក្នុងដំណើរការ។
ឧទាហរណ៍ #7 ការប្រកាសអថេរឋិតិវន្ត
មុខងារ foo ()(
ឋិតិវន្ត $int = 0 ; // ត្រូវហើយ។
ឋិតិវន្ត $int = 1 + 2 ; // មិនត្រឹមត្រូវ (ព្រោះវាជាកន្សោម)
ឋិតិវន្ត $int = sqrt(121); // មិនត្រឹមត្រូវ (ព្រោះនេះក៏ជាកន្សោមដែរ)$int++;
បន្ទរ $int ;
}
?>
បន្ទរ $_POST ["ឈ្មោះ" ];:
សេចក្តីប្រកាសឋិតិវន្តត្រូវបានវាយតម្លៃកំឡុងពេលចងក្រងស្គ្រីប។
តំណភ្ជាប់ជាមួយសកល ( តេស្ត ();) និងឋិតិវន្ត ( ការប្រើប្រាស់ឋិតិវន្ត () អថេរ
Zend Engine 1 ដែលផ្តល់ថាមពលដល់ PHP 4 ចាត់ទុកការកែប្រែអថេរឋិតិវន្ត និងសកលជាឯកសារយោង។ ឧទាហរណ៍ អថេរសកលពិតដែលបង្កប់ក្នុងវិសាលភាពនៃមុខងារដោយបញ្ជាក់ពាក្យគន្លឹះ តេស្ត ();ជាធរមាន បង្កើតសេចក្តីយោងទៅអថេរសកល។ នេះអាចនាំឱ្យមានអាកប្បកិរិយាដែលមិននឹកស្មានដល់ ដូចដែលបានបង្ហាញក្នុងឧទាហរណ៍ខាងក្រោម៖
មុខងារ test_global_ref() (
សកល $obj ;
$obj = &new stdclass ;
}
មុខងារ test_global_noref() (
សកល $obj ;
$obj = stdclass ថ្មី ;
}
test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>
លទ្ធផលនៃការដំណើរការឧទាហរណ៍នេះ៖ get_instance_noref () (
ឋិតិវន្ត $obj ;
អេកូ "វត្ថុឋិតិវន្ត៖";
var_dump($obj);
ប្រសិនបើ (!isset($obj)) (
// កំណត់វត្ថុមួយទៅអថេរឋិតិវន្ត
$obj = stdclass ថ្មី ;
}
$obj -> ទ្រព្យសម្បត្តិ ++;
ត្រឡប់ $obj ;
}
$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
បន្ទរ "\n" ;
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>
លទ្ធផលនៃការដំណើរការឧទាហរណ៍នេះ៖
វត្ថុឋិតិវន្ត៖ NULL
វត្ថុឋិតិវន្ត៖ NULL
វត្ថុឋិតិវន្ត៖ NULL
វត្ថុឋិតិវន្ត៖ object(stdClass)(1)(
["ទ្រព្យសម្បត្តិ"]=>
int(1)
}
ឧទាហរណ៍នេះបង្ហាញថា នៅពេលអ្នកកំណត់សេចក្តីយោងទៅអថេរឋិតិវន្ត វាមិនមែនទេ។ គួរឱ្យចងចាំនៅពេលអ្នកហៅមុខងារ &get_instance_ref()ជាលើកទីពីរ។
វិសាលភាពអថេរគឺជាបរិបទដែលអថេរនោះត្រូវបានកំណត់។ អថេរ PHP ភាគច្រើនមានវិសាលភាពតែមួយ។ វិសាលភាពតែមួយនេះ (ហៅផងដែរថាវិសាលភាពសកល) ក៏គ្របដណ្តប់ឯកសាររួមបញ្ចូលផងដែរ៖
ក្នុងឧទាហរណ៍នេះ អថេរ $a ក៏នឹងមាននៅក្នុងស្គ្រីបដែលបានរួមបញ្ចូលផងដែរ - main.inc .
អថេរក្នុងស្រុក
និយមន័យមុខងារផ្ទាល់ខ្លួនបញ្ជាក់ វិសាលភាពក្នុងស្រុកសម្រាប់អថេរ i.e. អថេរណាមួយដែលប្រើនៅក្នុងអនុគមន៍គឺតាមលំនាំដើមកំណត់ចំពោះវិសាលភាពមូលដ្ឋាននៃអនុគមន៍ (អាចប្រើបានតែក្នុងអនុគមន៍ដែលវាត្រូវបានកំណត់)។ របៀបដែលវាដំណើរការ៖ ដើម្បីបំបែកអថេរដែលប្រើក្នុងកូដទូទៅពីអថេរដែលប្រើក្នុងមុខងារ PHP ផ្តល់នូវការផ្ទុកដាច់ដោយឡែកសម្រាប់អថេរនៅក្នុងមុខងារនីមួយៗ។ ការបែងចែកទំហំផ្ទុកនេះបង្កប់ន័យថា វិសាលភាព ពោលគឺតំបន់ដែលតម្លៃនៃអថេរអាចប្រើបាន គឺជាកន្លែងផ្ទុកមូលដ្ឋានរបស់មុខងារ។
ឧទាហរណ៍ខាងក្រោមបង្ហាញយ៉ាងច្បាស់ថាអថេរដែលបានប្រកាសនៅខាងក្រៅអនុគមន៍មិនផ្លាស់ប្តូរនៅក្នុងអនុគមន៍ទេ។ ខណៈពេលដែលអ្នកមិនគួរព្យាយាមយល់ពីរបៀបដែលមុខងារដំណើរការ រឿងសំខាន់គឺថាវាមានសំណុំអថេរតែមួយគត់របស់វា៖
30 ?>
ជាលទ្ធផលនៃការប្រតិបត្តិបំណែកនេះ ខាងក្រោមនេះនឹងត្រូវបានបង្ហាញ៖ 30.
នៅក្នុងមុខងារ born() អថេរ $age ត្រូវបានកំណត់ជា 1 ប៉ុន្តែនេះមិនមែនជាអថេរដូចគ្នាដែលត្រូវបានកំណត់ក្នុងវិសាលភាពសកលទេ។ ដូច្នេះនៅពេលដែលតម្លៃនៃអថេរ $age ត្រូវបានបោះពុម្ព តម្លៃដើមនៃ 30 ត្រូវបានបោះពុម្ព វាគួរអោយកត់សំគាល់ថាអថេរមូលដ្ឋានត្រូវបានបង្កើតនៅពេលមុខងារត្រូវបានហៅ ហើយត្រូវបានលុបបន្ទាប់ពីមុខងារបញ្ចប់។
ប្រសិនបើអ្នកពិតជាចង់អាន ឬផ្លាស់ប្តូរតម្លៃនៃអថេរសកល (ដូចដែលអថេរដែលប្រើក្នុងវិសាលភាពសកលត្រូវបានគេហៅថា) ជាជាងមូលដ្ឋាននៅក្នុងអនុគមន៍កំណើត () វាត្រូវតែត្រូវបានប្រកាសជាសកលនៅក្នុងនិយមន័យមុខងារ។
ដើម្បីបង្កើតគេហទំព័រពេញលេញមួយដែលមានមុខងារធំទូលាយអ្នកត្រូវដឹងច្រើន។ ទោះយ៉ាងណាក៏ដោយ PHP អាចផ្តល់ឱ្យគេហទំព័រនូវភាពពិសេសពិតប្រាកដមួយ។ ភាសាសរសេរកម្មវិធីនេះមិនប្រើអថេរសកលញឹកញាប់ទេ ប៉ុន្តែពេលខ្លះវាមានប្រយោជន៍ខ្លាំងណាស់ក្នុងការដឹងពីរបៀបដែលវាដំណើរការ។
នៅក្នុងអត្ថបទនេះ យើងនឹងសិក្សាឱ្យច្បាស់ថាតើអថេរសកលគឺជាអ្វី និងរបៀបដែលវាដំណើរការ។
អថេរសកល៖ វិសាលភាព
បរិបទដែលអថេរត្រូវបានកំណត់ត្រូវបានគេហៅថាវិសាលភាពរបស់វា។ ជាធម្មតា អថេរមានវិសាលភាពតែមួយប៉ុណ្ណោះ។ នៅពេលដែលអថេរសកលនៅក្នុង PHP ត្រូវបានផ្ទុកពីឯកសារផ្សេងទៀត ពួកវាអាចត្រូវបានទាមទារ ឬរួមបញ្ចូល។ ពួកវាត្រូវបានកំណត់តាមលំនាំដើមចំពោះវិសាលភាពមូលដ្ឋាននៃមុខងារ។ តើអ្នកអាចធ្វើឱ្យអថេរដែលអាចមើលឃើញដោយឯកសារហួសពីព្រំដែនរបស់វា ហើយក៏អាចប្រើវាបានដោយរបៀបណា? នេះជាមូលហេតុដែល PHP ផ្តល់អថេរសកល។ ពាក្យសំខាន់នៅទីនេះគឺ "សកល" ។ តើធ្វើដូចម្តេចដើម្បីប្រកាសអថេរសកលនៅក្នុង PHP? ដើម្បីសម្រេចបាននូវគោលដៅនេះ ពាក្យ "សកល" ត្រូវតែប្រើ។ វាត្រូវតែត្រូវបានដាក់ភ្លាមៗមុនពេលអថេរដែលអ្នកចង់បង្កើតជាសកល។ វាមើលទៅដូចនេះ៖ "អថេរ" សកល។ បន្ទាប់ពីអនុវត្តការណែនាំប្រភេទនេះ ឯកសារណាមួយនឹងអាចដំណើរការជាមួយទិន្នន័យបាន។
ប្រសិនបើមានឯកសារយោងទៅអថេរនេះនៅកន្លែងណាមួយ កម្មវិធីនឹងយកចិត្តទុកដាក់ចំពោះកំណែសកល។ ហេតុអ្វីបានជាគេប្រើពាក្យចម្លែកបែបនេះ? រឿងនេះគឺថានៅពេលជាមួយគ្នានោះកំណែក្នុងស្រុកក៏អាចមានផងដែរ។ ប៉ុន្តែពួកវានឹងអាចចូលប្រើបានច្រើនតែនៅក្នុងឯកសារដែលពួកគេត្រូវបានប្រកាស។ សម្រាប់អ្វីដែលនៅសល់ អថេរថ្នាក់ PHP សកលនឹងអនុវត្ត។ នៅទីនេះអ្នកត្រូវធ្វើសកម្មភាពយ៉ាងប្រុងប្រយ័ត្ននិងដោយប្រុងប្រយ័ត្ន។ ដើម្បីបងា្ករការសង្ស័យណាមួយ ចូរយើងផ្តល់ឧទាហរណ៍ដ៏សាមញ្ញមួយអំពីរបៀបដែលពួកគេអាចមើលទៅ៖ សកល a. ប្រសិនបើឯកសារមួយមានសិទ្ធិចូលប្រើអថេរច្រើន វាអាចបណ្តាលឱ្យមានជម្លោះ។ ប៉ុន្តែវាមិនអាចទៅរួចទេក្នុងការនិយាយឱ្យប្រាកដនៅទីនេះថាតើអថេរសកល ឬមូលដ្ឋាននឹងត្រូវបានអាន ឬថាតើកំហុសនឹងកើតឡើង។ ប្រសិនបើអ្នកសរសេរវានៅខាងក្នុងមុខងារ នោះគ្មានបញ្ហាអ្វីកើតឡើងទេ។ ការប្រើអថេរនៅខាងក្រៅព្រំដែននៃអនុគមន៍នឹងមានបញ្ហា។ ដូច្នេះហើយ អ្នកចាំបាច់ត្រូវត្រួតពិនិត្យយ៉ាងប្រុងប្រយ័ត្ននូវរចនាសម្ព័ន្ធនៃកូដ ហើយត្រូវប្រាកដថាមិនមានតម្រូវការជាមុនសម្រាប់ជម្លោះនៅកន្លែងណាមួយឡើយ។
អថេរសកល៖ សញ្ញាណមួយទៀត
តើមានវិធីផ្សេងទៀតដើម្បីកំណត់អថេរសកលទេ? បាទ/ចាស មិនមែនតែម្នាក់ឯងទេ។ សូមក្រឡេកមើល $GLOBALS ជាមុនសិន។ វាគឺជាអារេសហការដែលកូនសោជាឈ្មោះ។ មាតិកានៃអថេរសកលត្រូវបានប្រើជាតម្លៃ។ វាគួរឱ្យកត់សម្គាល់ថាបន្ទាប់ពីការប្រកាសអារេនេះមាននៅក្នុងវិសាលភាពណាមួយ។ នេះផ្តល់ហេតុផលដើម្បីចាត់ទុកថាវាជាសកល។ វាមើលទៅដូចនេះ៖ $GLOBALS ['Variable'] ។
សកលលោក
នៅក្នុងភាសាសរសេរកម្មវិធីណាមួយ មានឈ្មោះដែលត្រូវបានបម្រុងទុកសម្រាប់មុខងារនីមួយៗ។ វាមិនអាចបង្កើតអថេរសកលនៃឈ្មោះដូចគ្នានៅក្នុង PHP បានទេ។ ភាសាសរសេរកម្មវិធីនេះមានលក្ខណៈផ្ទាល់ខ្លួនរបស់វា។ ជាឧទាហរណ៍ វាមានសារៈសំខាន់ជាពិសេសដែលអថេរដែលបានកំណត់ជាមុនមិនមានបុព្វបទ "super" ទេ។ នេះមានន័យថា ពួកវាមិនមាននៅគ្រប់ទីតាំងទាំងអស់ទេ។ តើស្ថានភាពនេះអាចត្រូវបានកែតម្រូវដោយរបៀបណា? ដើម្បីធ្វើឱ្យអថេរដែលបានកំណត់ជាមុនមាននៅលើបណ្តាញមូលដ្ឋានមួយចំនួន អ្នកត្រូវប្រកាសវាដូចនេះ៖ "អថេរ" សកល។ នេះត្រូវបានលើកឡើងរួចហើយមុននេះបន្តិច។ ទោះយ៉ាងណាក៏ដោយនេះមិនពិតទាំងស្រុងទេ។ សូមក្រឡេកមើលឧទាហរណ៍ជាក់ស្តែង៖
សកល $HTTP_POST_VARS; បន្ទរ $HTTP_POST_VARS ['name']។
តើអ្នកមានអារម្មណ៍ខុសគ្នាទេ? វាគួរអោយចងចាំថានៅក្នុង PHP អថេរសកលត្រូវតែប្រើក្នុងមុខងារមួយ។ វាក៏អាចមានទីតាំងនៅក្នុងឯកសារដែលត្រូវបានរួមបញ្ចូលនៅក្នុងវា។
សុវត្ថិភាព និងតំណភ្ជាប់
ដូចដែលអ្នកអាចឃើញដោយខ្លួនឯង ការបង្កើតអថេរសកលនៅក្នុង PHP មិនមែនជាបញ្ហាទេ។ ប៉ុន្តែតើមានភាពជាក់លាក់ណាមួយទាក់ទងនឹងតំណដែរឬទេ? នៅពេលប្រើអថេរសកល អាកប្បកិរិយាដែលមិនរំពឹងទុកមួយចំនួនអាចធ្វើទៅបាន។ ប៉ុន្តែមុននឹងសិក្សាបញ្ហានេះឱ្យបានលម្អិតបន្ថែមទៀតនោះ ចាំបាច់ត្រូវងាកទៅរកសាវតារ។ ការណែនាំ register_globals ត្រូវបានប្តូរពីបានបើកទៅជាបិទតាមលំនាំដើមនៅក្នុងកំណែ 4.2។ សម្រាប់អ្នកប្រើប្រាស់ជាច្រើន នេះគឺមិនសំខាន់ទាំងស្រុង ហើយឥតប្រយោជន៍ទេ ព្រោះសុវត្ថិភាពនៃផលិតផលដែលកំពុងត្រូវបានបង្កើតដោយផ្ទាល់អាស្រ័យលើវា។ ប្រសិនបើអ្នកត្រូវការបង្កើតអថេរសកល នោះការណែនាំរបស់ PHP នឹងមិនប៉ះពាល់ដល់ការកំណត់នេះដោយផ្ទាល់ទេ។ ទោះយ៉ាងណាក៏ដោយ ការប្រើប្រាស់មិនត្រឹមត្រូវអាចក្លាយជាហានិភ័យសុវត្ថិភាព។ ដូច្នេះ ឧទាហរណ៍ ប្រសិនបើ register_globals ស្ថិតក្នុងស្ថានភាពបានបើក នោះអថេរចាំបាច់ផ្សេងៗនឹងត្រូវបានចាប់ផ្តើម មុនពេលកូដត្រូវបានប្រតិបត្តិ។ ដូច្នេះហើយ ទើបគេសម្រេចបិទវាចោល។ ហេតុអ្វីបានជាអថេរសកលជំពាក់រដ្ឋច្រើនចំពោះការណែនាំដែលបានផ្តល់ឱ្យ? បញ្ហាគឺថានៅពេលដែលបើកដំណើរការ អ្នកអភិវឌ្ឍន៍មិនតែងតែអាចឆ្លើយសំណួរថាតើវាមកពីណានោះទេ ប៉ុន្តែផ្ទុយទៅវិញ វាបានជួយសម្រួលដល់ដំណើរការនៃការសរសេរកូដយ៉ាងខ្លាំង។ ទន្ទឹមនឹងនេះ អង្គការបែបនេះបានបង្កើតការគំរាមកំហែងជាក់លាក់មួយដល់សន្តិសុខ។ ដើម្បីជៀសវាងការលាយបញ្ចូលទិន្នន័យ និងកំហុស ការណែនាំត្រូវបានបិទ។ ឥឡូវនេះ សូមក្រឡេកមើលឧទាហរណ៍នៃកូដមិនមានសុវត្ថិភាព។ យើងក៏នឹងពិនិត្យមើលពីរបៀបដែលអ្នកអាចរកឃើញករណីនៅពេលដែលការប្រកាសនៃអថេរសកលរបស់ PHP ត្រូវបានអមដោយការប៉ុនប៉ងដើម្បីជំនួសព័ត៌មាន។ វាត្រូវបានទាមទារដើម្បីបង្កើតគេហទំព័រការងារដែលមានស្ថេរភាព ដែលមិនអាចត្រូវបានលួចចូលដោយអ្នកប្រើប្រាស់ដំបូងដែលឆ្លងកាត់ពួកវា។
លេខកូដគ្រោះថ្នាក់
ចូរកំណត់អថេរទៅពិតសម្រាប់អ្នកប្រើប្រាស់ទាំងនោះដែលត្រូវបានអនុញ្ញាត៖
ប្រសិនបើ (authenticate_user()) ($authoriza=true;) ប្រសិនបើ ($authorize) (រួមបញ្ចូល “/highly/sensitive/data.php”;) ។ អថេរនៅក្នុងស្ថានភាពនេះអាចត្រូវបានកំណត់ដោយស្វ័យប្រវត្តិ។ ដោយពិចារណាថាទិន្នន័យអាចត្រូវបានជំនួសដោយសាមញ្ញ ហើយប្រភពនៃប្រភពដើមរបស់វាមិនត្រូវបានបង្កើតឡើង នោះអ្នកប្រើប្រាស់ស្ទើរតែទាំងអស់អាចឆ្លងកាត់ការត្រួតពិនិត្យបែបនេះ និងក្លែងបន្លំនរណាម្នាក់បាន។ អ្នកវាយប្រហារ ប្រសិនបើចង់បាន អាចរំខានដល់តក្កវិជ្ជានៃស្គ្រីបទាំងមូល។ ប្រសិនបើអ្នកផ្លាស់ប្តូរតម្លៃនៃការណែនាំ នោះកូដនឹងដំណើរការត្រឹមត្រូវ។ នេះជាអ្វីដែលយើងត្រូវធ្វើ។ ទោះជាយ៉ាងណាក៏ដោយ ការចាប់ផ្ដើមអថេរមិនត្រឹមតែជាការអនុវត្តល្អក្នុងចំណោមអ្នកសរសេរកម្មវិធីប៉ុណ្ណោះទេ វាក៏ធានានូវស្ថេរភាពនៃស្គ្រីបផងដែរ។
ជម្រើសដែលអាចទុកចិត្តបាន។
ដើម្បីសម្រេចបាននូវគោលដៅនេះ អ្នកអាចព្យាយាមបិទការណែនាំ ឬសរសេរកូដស្មុគ្រស្មាញបន្ថែមទៀត ឧទាហរណ៍ដូចនេះ៖ if (isset($_SESSION ['username'])) (បន្ទរ “ជំរាបសួរ” ($_SESSION ['username'' ])”;) ផ្សេងទៀត (បន្ទរ “សួស្តីភ្ញៀវ”; បន្ទរ “សូមស្វាគមន៍!”;)។ ក្នុងករណីនេះវានឹងពិបាកក្នុងការធ្វើការជំនួស។ ទោះយ៉ាងណាក៏ដោយវាអាចទៅរួច។ ដើម្បីធ្វើដូច្នេះ អ្នកត្រូវមើលថែភាពអាចរកបាននៃឧបករណ៍ឆ្លើយតបរហ័សជាមុន។ ប្រសិនបើអ្នកត្រូវការបញ្ចូលអថេរសកលនៅក្នុង PHP អ្នកអាចប្រើឧបករណ៍ខាងក្រោម៖ ប្រសិនបើអ្នកដឹងច្បាស់ថាតម្លៃនឹងត្រូវបានទទួលនៅក្នុងជួរណានោះ អ្នកអាចសរសេរវាតាមរបៀបដែលស្គ្រីបពិនិត្យមើលការពិតដោយការប្រៀបធៀប។ ជាការពិតណាស់ នេះក៏មិនអាចធានាបាននូវការការពារ 100% ប្រឆាំងនឹងការជំនួសតម្លៃផងដែរ។ ទោះយ៉ាងណាក៏ដោយ ការឆ្លងកាត់ជម្រើសដែលអាចធ្វើបាននឹងធ្វើឱ្យប្រតិបត្តិការស្មុគស្មាញខ្លាំង។
តើធ្វើដូចម្តេចដើម្បីរកឃើញការប៉ុនប៉ងក្លែងបន្លំ?
ឥឡូវនេះ សូមពិនិត្យមើលថាតើអ្នកយល់គ្រប់យ៉ាងដែលបានសរសេរពីមុនបានត្រឹមត្រូវដែរឬទេ។ អ្នកនឹងត្រូវប្រកាសអថេរសកលនៅក្នុងមុខងារមួយដោយខ្លួនឯង។ នេះគឺជាប្រភេទនៃកិច្ចការផ្ទះ។ ដំបូងនេះជាកូដ៖
ចូរយើងផ្តល់ការពន្យល់ខ្លះ។ អថេរ C_COOKIE ត្រូវបានយកចេញពីប្រភពដែលអាចទុកចិត្តបាន។ ដើម្បីប្រាកដថាលទ្ធផលរបស់វាគឺដូចការរំពឹងទុក តម្លៃអថេរត្រូវបានពិនិត្យ។ ប្រសិនបើមានបញ្ហាកើតឡើង អ្នកគ្រប់គ្រងទទួលបានការជូនដំណឹង។ បើមិនមានអ្វីកើតឡើងទេនឹងមិនមានចំណាត់ការអ្វីឡើយ។
ចំណាំ៖កំណែអាដាប់ធ័រនៃគេហទំព័រត្រូវបានធ្វើឱ្យសកម្ម ដែលសម្របខ្លួនដោយស្វ័យប្រវត្តិទៅនឹងទំហំតូចនៃកម្មវិធីរុករករបស់អ្នក និងលាក់ព័ត៌មានលម្អិតមួយចំនួននៃគេហទំព័រសម្រាប់ភាពងាយស្រួលនៃការអាន។ សូមរីករាយទស្សនា!
ជំរាបសួរអ្នកអានប្លក់ជាទីស្រឡាញ់ គេហទំព័រលើ!
- យើងបានរៀនថាមានមុខងារមួយនៅក្នុង PHP យើងបានរៀនពីរបៀបបង្កើតមុខងារផ្ទាល់ខ្លួនរបស់យើង បញ្ជូនអាគុយម៉ង់ទៅឱ្យពួកគេ ហើយហៅពួកវាសម្រាប់ប្រតិបត្តិ។ ការបន្តប្រធានបទនៃមុខងារនៅក្នុង PHP វាចាំបាច់ដើម្បីបញ្ជាក់រឿងដូចខាងក្រោម:
- នៅក្នុងមុខងារ អ្នកអាចប្រើកូដ PHP ណាមួយ (វដ្ត លក្ខខណ្ឌ ប្រតិបត្តិការណាមួយ) រួមទាំងមុខងារផ្សេងទៀត (ទាំងភ្ជាប់មកជាមួយ និងផ្ទាល់ខ្លួន)។
- ឈ្មោះមុខងារត្រូវតែចាប់ផ្តើមដោយអក្សរឡាតាំង ឬសញ្ញាគូសក្រោម បន្តដោយអក្សរឡាតាំង លេខ ឬសញ្ញាគូសខាងក្រោម។
- មុខងារទាំងអស់មានវិសាលភាពជាសកល ដែលមានន័យថាមុខងារណាមួយអាចត្រូវបានគេហៅថាគ្រប់ទីកន្លែង ទោះបីជាមុខងារនោះត្រូវបានកំណត់នៅខាងក្នុងមួយផ្សេងទៀតក៏ដោយ។
- មុខងារមិនចាំបាច់ត្រូវបានកំណត់មុនពេលពួកវាត្រូវបានប្រើទេ។ នោះគឺប្រសិនបើអ្នកហៅមុខងារមួយជាលើកដំបូង ហើយគ្រាន់តែពណ៌នាវានៅក្នុងកូដខាងក្រោម វានឹងមិនប៉ះពាល់ដល់ដំណើរការទេ ហើយនឹងមិនបង្កឱ្យមានកំហុសឡើយ។
មុខងារតាមលក្ខខណ្ឌ
យើងអាចបង្កើត (កំណត់ ពិពណ៌នា) មុខងារមួយអាស្រ័យលើលក្ខខណ្ឌ។ ឧទាហរណ៍៖
// ហៅថាមុខងារ sayHi វាអាចហៅបានគ្រប់ទីកន្លែង
/* មុខងារ sayGoodbye មិនអាចហៅបាននៅទីនេះទេ ព្រោះយើងមិនទាន់បានពិនិត្យលក្ខខណ្ឌ និងមិនបានចូលទៅក្នុង if construct*/ if($apply)(មុខងារ sayGoodbye())(បន្ទរ "សួស្តីអ្នកទាំងអស់គ្នា!
";
}
}
/* ឥឡូវនេះយើងអាចហៅពាក្យថា Goodbye*/
";
}
លទ្ធផល៖
ហើយមើលឧទាហរណ៍នេះ៖
/* ហើយនេះជាអ្វីដែលនឹងកើតឡើង ប្រសិនបើអ្នកហៅពាក្យថា Goodbye here*/លាហើយ (); if($apply)(មុខងារ sayGoodbye())(បន្ទរ "សួស្តីអ្នកទាំងអស់គ្នា!
"; )) មុខងារ sayHi())(បន្ទរ "សួស្តីអ្នកទាំងអស់គ្នា!
";
}
លទ្ធផល៖
តាមពិតទៅ ដូចជាខ្ញុំធ្លាប់ធ្វើការ ខ្ញុំមិនដែលឃើញរឿងបែបនេះនៅកន្លែងណាទេ ប៉ុន្តែអ្នកត្រូវចងចាំពីលទ្ធភាពទាំងអស់នៃភាសា។
មុខងារដែលបានដាក់
អនុគមន៍ដែលជាប់គ្នាគឺជាអនុគមន៍ដែលបានប្រកាសនៅក្នុងអនុគមន៍ផ្សេងទៀត។ ឧទាហរណ៍៖
/* អ្នកមិនអាចហៅពាក្យថា Goodbye នៅទីនេះបានទេ ព្រោះវានឹងបង្ហាញតែបន្ទាប់ពីហៅមុខងារ sayHi*/ sayHi(); /* ហៅមុខងារ sayHi វាអាចហៅបានគ្រប់ទីកន្លែង*/
/* ឥឡូវនេះយើងអាចហៅពាក្យថា Goodbye*/លាហើយ (); មុខងារ sayHi())(បន្ទរ "សួស្តីអ្នកទាំងអស់គ្នា!
"; មុខងារ say Goodbye()) (បន្ទរ "សួស្តីអ្នកទាំងអស់គ្នា!
";
}
}
ជាថ្មីម្តងទៀត នៅលើការឆ្លងកាត់ដំបូង អ្នកបកប្រែ PHP សម្គាល់ខ្លួនវាថាវាបានរកឃើញការពិពណ៌នានៃមុខងារ sayHi ប៉ុន្តែមិនចូលទៅក្នុងខ្លួនរបស់វាទេ វាគ្រាន់តែឃើញឈ្មោះប៉ុណ្ណោះ ហើយចាប់តាំងពីអ្នកបកប្រែមិនចូលទៅក្នុងតួរបស់ sayHi បន្ទាប់មក វាមិនដឹងថាអ្វីដែលយើងកំពុងកំណត់នៅក្នុងមុខងារមួយផ្សេងទៀតនោះទេ - say Goodbye ។
បន្ទាប់មកកូដចាប់ផ្តើមប្រតិបត្តិ យើងហៅថា sayHi អ្នកបកប្រែ PHP ត្រូវចូលទៅក្នុងតួនៃអនុគមន៍ sayHi ដើម្បីប្រតិបត្តិវា ហើយនៅទីនោះវាបានរកឃើញការពិពណ៌នានៃមុខងារមួយផ្សេងទៀតដោយចៃដន្យ - sayGoodbye បន្ទាប់ពីនោះ sayGoodbye អាចហៅបានគ្រប់ទីកន្លែង ច្រើនដង។ ដូចដែលអ្នកចូលចិត្ត។
ប៉ុន្តែវាគួរអោយយកចិត្តទុកដាក់ចំពោះចំណុចដ៏ស្រទន់ក្នុងស្ថានភាពខាងលើ៖ មុខងារ sayHi ក្លាយជាតែម្តង ព្រោះប្រសិនបើយើងហៅវាម្តងទៀត PHP នឹងមកម្តងទៀតនូវនិយមន័យនៃមុខងារ sayGoodbye ហើយនៅក្នុង PHP អ្នកមិនអាចធ្វើបានទេ។ នេះ - អ្នកមិនអាចបដិសេធមុខងារបានទេ។ ខ្ញុំបានសរសេរអំពីរឿងនេះ និងរបៀបដោះស្រាយវានៅក្នុងអត្ថបទមុន។
នៅក្នុង PHP បច្ចេកទេសដែលបានពិពណ៌នាខាងលើត្រូវបានគេប្រើកម្រណាស់ ពួកគេអាចត្រូវបានគេមើលឃើញញឹកញាប់ជាងឧទាហរណ៍នៅក្នុង JavaScript ។
វិសាលភាពអថេរ
មានវិសាលភាពពីរយ៉ាងពិតប្រាកដនៅក្នុង PHP៖ សកលនិង ក្នុងស្រុក. រចនាសម្ព័ន្ធភាសាសរសេរកម្មវិធីនីមួយៗមានវិសាលភាពខុសៗគ្នា។ ឧទាហរណ៍ នៅក្នុង C ++ សូម្បីតែ loops មានវិសាលភាព (local) របស់ពួកគេ។ នៅក្នុង PHP ដោយវិធីនេះគឺជាវិសាលភាពសកល។ ប៉ុន្តែថ្ងៃនេះយើងកំពុងនិយាយអំពីមុខងារ។
មុខងារនៅក្នុង PHP មានវិសាលភាពផ្ទៃក្នុងផ្ទាល់ខ្លួន (local) ពោលគឺអថេរទាំងអស់នៅក្នុង function គឺអាចមើលឃើញតែនៅក្នុងមុខងារនេះប៉ុណ្ណោះ។
ដូច្នេះ ជាថ្មីម្តងទៀត៖ អ្វីគ្រប់យ៉ាងដែលនៅខាងក្រៅមុខងារគឺជាវិសាលភាពសកល អ្វីគ្រប់យ៉ាងដែលនៅខាងក្នុងមុខងារគឺជាវិសាលភាពក្នុងតំបន់។ ឧទាហរណ៍៖
សូមគោរពអ្នកជំនាញការយកចិត្តទុកដាក់សំណួរ! តើការណែនាំចុងក្រោយនឹងចេញអ្វីខ្លះ? បន្ទរ $name; ?
ដូចដែលអ្នកបានឃើញសម្រាប់ខ្លួនអ្នក យើងមាន 2 អថេរ $ ឈ្មោះមួយនៅខាងក្នុងអនុគមន៍ (វិសាលភាពក្នុងតំបន់) មួយទៀតនៅក្នុងកូដ (វិសាលភាពសកល) ការចាត់តាំងចុងក្រោយទៅអថេរ $ ឈ្មោះគឺ $name = "Rud Sergey";ប៉ុន្តែដោយសារវានៅក្នុងមុខងារ វានៅទីនោះ។ នៅក្នុងវិសាលភាពសកល កិច្ចការចុងក្រោយគឺ $name = "Andrey";ដែលជាអ្វីដែលយើងពិតជាឃើញជាលទ្ធផល។
នោះគឺជាអថេរពីរដូចគ្នា ប៉ុន្តែក្នុងវិសាលភាពផ្សេងៗគ្នា វាមិនប្រសព្វគ្នា និងមិនប៉ះពាល់ដល់គ្នាទៅវិញទៅមក។
ខ្ញុំសូមបង្ហាញវិសាលភាពក្នុងរូប៖
ក្នុងអំឡុងពេលឆ្លងកាត់លើកដំបូង អ្នកបកប្រែបានស្កែនវិសាលភាពជាសកលដោយសង្ខេប ដោយចងចាំនូវអថេរ និងមុខងារដែលមាន ប៉ុន្តែមិនប្រតិបត្តិកូដនោះទេ។
ការចូលប្រើអថេរសកលពីវិសាលភាពមូលដ្ឋាន
ប៉ុន្តែចុះយ៉ាងណាបើយើងនៅតែត្រូវចូលប្រើអថេរ $name ដូចគ្នាពីវិសាលភាពសកលពីមុខងារមួយ ហើយមិនត្រឹមតែចូលប្រើវាទេ ប៉ុន្តែត្រូវផ្លាស់ប្តូរវា? មានជម្រើសសំខាន់ 3 សម្រាប់រឿងនេះ។ ទីមួយគឺការប្រើពាក្យគន្លឹះ តេស្ត ();:
"; ឈ្មោះ $ សកល; /* ចាប់ពីពេលនេះតទៅ យើងមានន័យថាអថេរសកល $name*/$name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); បន្ទរ $name; // ?
លទ្ធផល៖
ប៉ុន្តែវិធីសាស្រ្តនេះមានគុណវិបត្តិចាប់តាំងពីយើងចូលប្រើអថេរសកល $ ឈ្មោះយើងបាត់បង់ (សរសេរជាន់លើ) អថេរមូលដ្ឋាន $ ឈ្មោះ.
វិធីទីពីរគឺត្រូវប្រើ អារេ PHP superglobal. PHP ខ្លួនវាដាក់អថេរនីមួយៗដែលយើងបានបង្កើតក្នុងវិសាលភាពសកលទៅក្នុងអារេនេះ។ ឧទាហរណ៍៖
$name = "Andrey"; // ដូចគ្នានឹង$GLOBALS["name"] = "Andrey";
ដូច្នេះ៖
"; $GLOBALS["name"] = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); បន្ទរ $name; // ?
លទ្ធផលគឺដូចគ្នានឹងពេលប្រើពាក្យគន្លឹះដែរ។ តេស្ត ();:
មានតែលើកនេះទេដែលយើងមិនបានសរសេរអថេរមូលដ្ឋានឡើងវិញ ពោលគឺអថេរ $ ឈ្មោះនៅខាងក្នុងមុខងារនៅតែដូចគ្នា និងស្មើគ្នា "Andrey"មិនមែនទេ។ "Rud Sergey".
ឆ្លងកាត់អាគុយម៉ង់ដោយឯកសារយោង
វិធីទីបី- នេះគឺជាការផ្ទេរអាសយដ្ឋាន ( តំណភ្ជាប់) នៃអថេរ មិនមែនតម្លៃរបស់វាទេ។ តំណភ្ជាប់ក្នុង PHP មិនជោគជ័យខ្លាំងទេ មិនដូចភាសាសរសេរកម្មវិធីផ្សេងទៀតទេ។ ទោះយ៉ាងណាក៏ដោយ ខ្ញុំនឹងប្រាប់អ្នកពីជម្រើសត្រឹមត្រូវតែមួយគត់សម្រាប់ការឆ្លងកាត់អាគុយម៉ង់ដោយយោងទៅមុខងារមួយ ដែលជាធម្មតាត្រូវបានគាំទ្រនៅក្នុង PHP 5.3 និងខ្ពស់ជាងនេះ។ មានវិធីផ្សេងទៀតដើម្បីធ្វើការជាមួយតំណភ្ជាប់ ប៉ុន្តែពួកគេបានធ្វើការនៅក្នុង PHP 5.2 និងទាបជាងនេះ ជាលទ្ធផលអ្នកអភិវឌ្ឍន៍ PHP ខ្លួនឯងបានសម្រេចចិត្តបោះបង់ចោលពួកគេ ដូច្នេះយើងនឹងមិននិយាយអំពីពួកគេទេ។
ដូច្នេះ ការឆ្លងកាត់ត្រឹមត្រូវនៃអាគុយម៉ង់ដោយយោងនៅក្នុង PHP 5.3 និងខ្ពស់ជាងនេះ ត្រូវបានធ្វើដូចខាងក្រោម:
មុខងារ sayHi(&$name)(
នៅក្នុងការពិពណ៌នាមុខងារខ្លួនវា យើងបានបន្ថែមរូបតំណាង ampersand (&) - រូបតំណាងនេះមានន័យថាយើងមិនទទួលយកតម្លៃនៃអថេរនោះទេ ប៉ុន្តែជាតំណភ្ជាប់ (អាសយដ្ឋាន) ទៅកាន់តម្លៃនេះនៅក្នុងអង្គចងចាំ។ ឯកសារយោងនៅក្នុង PHP អនុញ្ញាតឱ្យអ្នកបង្កើតអថេរពីរដែលចង្អុលទៅតម្លៃដូចគ្នា។ នេះមានន័យថានៅពេលដែលអថេរមួយក្នុងចំណោមអថេរទាំងនេះផ្លាស់ប្តូរ ការផ្លាស់ប្តូរទាំងពីរចាប់តាំងពីពួកគេសំដៅទៅលើតម្លៃដូចគ្នានៅក្នុងអង្គចងចាំ។
ហើយនៅទីបញ្ចប់យើងមាន៖
// មិនទទួលយកតម្លៃទេ ប៉ុន្តែជាការយោងទៅតម្លៃបន្ទរ "ជំរាបសួរ ".$name"!
"; $name = "Rud Sergey"; ) $name = "Andrey"; sayHi($name); បន្ទរ $name; // ?
លទ្ធផល៖
អថេរឋិតិវន្ត
ស្រមៃមើលស្ថានភាពខាងក្រោម៖ យើងត្រូវរាប់ចំនួនដងដែលយើងបាននិយាយជំរាបសួរសរុប។ នេះជាអ្វីដែលយើងកំពុងព្យាយាមធ្វើ៖
"; $c++; // បង្កើនចំនួនរាប់ដោយ 1
លទ្ធផល៖
អថេរ $cមិនចាំអត្ថន័យរបស់វាទេ វាត្រូវបានបង្កើតជាថ្មីរាល់ពេល។ យើងត្រូវធ្វើឱ្យអថេរក្នុងស្រុករបស់យើង។ $cចងចាំតម្លៃរបស់វាបន្ទាប់ពីប្រតិបត្តិមុខងារនេះ ពួកគេប្រើពាក្យគន្លឹះ ការប្រើប្រាស់ឋិតិវន្ត (:
// រាប់, ធ្វើឱ្យឋិតិវន្តបន្ទរ "ជំរាបសួរ ".$name"!
"; $c++; // បង្កើនចំនួនរាប់ដោយ 1បន្ទរ "គ្រាន់តែនិយាយថាជំរាបសួរ" ។ $c ។ "ម្តង។
";) sayHi("Rud Sergey"); sayHi("Andrey"); sayHi("Dmitry");
លទ្ធផល៖
ត្រឡប់តម្លៃ
អនុគមន៍មានភាពងាយស្រួលដូចជាការត្រឡប់តម្លៃ។ នេះគឺជាពេលដែលមុខងារមួយ ជំនួសឱ្យការបោះពុម្ពអ្វីមួយទៅអេក្រង់ ដាក់អ្វីគ្រប់យ៉ាងទៅជាអថេរ ហើយផ្តល់ឱ្យយើងនូវអថេរនោះ។ ហើយយើងកំពុងសម្រេចចិត្តរួចហើយថាត្រូវធ្វើអ្វីជាមួយវា។ ឧទាហរណ៍ ចូរយើងយកអនុគមន៍នេះ វាដាក់លេខពីរ៖
លទ្ធផល៖
ចូរធ្វើវាដើម្បីឱ្យជំនួសឱ្យការបង្ហាញវានៅលើអេក្រង់វាត្រឡប់លទ្ធផលប្រតិបត្តិ។ ដើម្បីធ្វើដូចនេះសូមប្រើពាក្យគន្លឹះត្រឡប់៖
លទ្ធផល៖
ឥឡូវនេះយើងអាចប្រើវាតាមវិធីផ្សេងៗគ្នា៖
// បង្ហាញលទ្ធផលបន្ទរ "
"; $num = getSquare(5); បន្ទរ $num;
លទ្ធផល៖
សូមចំណាំថាពាក្យគន្លឹះ ត្រឡប់មកវិញមិនគ្រាន់តែត្រឡប់តម្លៃមួយទេ ប៉ុន្តែរំខានមុខងារទាំងស្រុង ពោលគឺកូដទាំងអស់ដែលស្ថិតនៅក្រោមពាក្យគន្លឹះ ត្រឡប់មកវិញនឹងមិនដែលត្រូវបានបំពេញ។ នៅក្នុងពាក្យផ្សេងទៀត, ត្រឡប់សម្រាប់មុខងារក៏ដំណើរការដូច សម្រាកសម្រាប់រង្វិលជុំ៖
បន្ទរ "PHP នឹងមិនទៅដល់ខ្ញុំទេ:(";) អេកូ getSquare (5); // បង្ហាញលទ្ធផលបន្ទរ "
"; $num = getSquare(5); // កំណត់លទ្ធផលទៅជាអថេរបន្ទរ $num; // បង្ហាញអថេរនៅលើអេក្រង់
លទ្ធផល៖
នោះគឺជា ត្រឡប់មកវិញ- នេះក៏ជាច្រកចេញពីមុខងារផងដែរ។ វាអាចត្រូវបានប្រើដោយគ្មានតម្លៃត្រឡប់មកវិញ, គ្រាន់តែសម្រាប់ជាប្រយោជន៍នៃទិន្នផល។
មុខងារកើតឡើងវិញ។
មុខងារ recursive គឺជាមុខងារដែលហៅខ្លួនឯង។ Recursion មិនត្រូវបានប្រើញឹកញាប់ទេ ហើយត្រូវបានគេចាត់ទុកថាជាប្រតិបត្តិការដែលពឹងផ្អែកលើធនធាន (យឺត)។ ប៉ុន្តែវាកើតឡើងថាការប្រើការហៅឡើងវិញគឺជាជម្រើសជាក់ស្តែង និងសាមញ្ញបំផុត។ ឧទាហរណ៍៖
"; ប្រសិនបើ($number< 20){ // ដូច្នេះការធ្វើឡើងវិញមិនចេះចប់ countPlease(++$number); // មុខងារ countPlease ហៅខ្លួនឯង) ) រាប់សូម(1);
លទ្ធផល៖
ប្រសិនបើអ្នកដឹងពីរបៀបធ្វើដោយមិនប្រើឡើងវិញ នោះជាការប្រសើរក្នុងការធ្វើដូច្នេះ។
ការវាយអក្សរខ្លាំងនៅក្នុង PHP (ការកែលម្អប្រភេទ)
PHP បោះជំហានតូចមួយឆ្ពោះទៅរកការវាយអក្សរខ្លាំង ដូច្នេះយើងអាចបញ្ជាក់ជាមុននូវប្រភេទមុខងារដែលគួរអនុវត្ត (នេះហៅថា ប្រភេទ-ជំនួយ):
លទ្ធផល៖
កំហុសធ្ងន់ធ្ងរដែលអាចចាប់បាន៖ អាគុយម៉ង់ទី 1 បានឆ្លងទៅ countPlease() ត្រូវតែជាអារេ ចំនួនគត់ដែលបានផ្តល់ឱ្យ ហៅក្នុង /home/index.php នៅលើបន្ទាត់ទី 7 និងកំណត់ក្នុង /home/index.php នៅលើបន្ទាត់ទី 3
កំហុសប្រាប់យើងថាអនុគមន៍រំពឹងថានឹងទទួលបានអារេមួយ ប៉ុន្តែយើងកំពុងហុចវាជាលេខ។ ជាអកុសល សម្រាប់ពេលនេះ យើងអាចបញ្ជាក់បានតែប្រភេទសម្រាប់ (អារេ) ហើយជាមួយ PHP 5.4 យើងក៏បានបន្ថែមជម្រើសដូចជា អាចហៅបាន។:
អាចហៅបាន។ពិនិត្យមើលថាតើតម្លៃដែលបានឆ្លងកាត់អាចត្រូវបានហៅជាមុខងារ។ អាចហៅបានអាចជាឈ្មោះនៃមុខងារដែលបានបញ្ជាក់ដោយអថេរខ្សែអក្សរ ឬវត្ថុមួយ និងឈ្មោះនៃវិធីសាស្ត្រដែលកំពុងត្រូវបានហៅ ប៉ុន្តែយើងនឹងនិយាយអំពីវត្ថុ និងវិធីសាស្ត្រនៅពេលក្រោយ (នេះគឺជាផ្នែកនៃកម្មវិធីតម្រង់ទិសវត្ថុ) ប៉ុន្តែអ្នកធ្លាប់ស្គាល់មុខងាររួចហើយ។ ខ្ញុំមិនអាចបង្ហាញអ្នកពីលទ្ធផលនៃការងារបានទេ ព្រោះបច្ចុប្បន្នខ្ញុំមាន PHP 5.3 ប៉ុន្តែវានឹងជា៖
ហៅថាមុខងារ getEcho
ការប្រើអាគុយម៉ង់ប្រវែងអថេរ
ហើយទីបំផុត មួយបន្ថែមទៀតកម្រប្រើ nuance ។ ស្រមៃមើលស្ថានភាព៖ យើងបញ្ជូនអាគុយម៉ង់ទៅមុខងារមួយ ទោះបីជាយើងមិនបានពិពណ៌នាពួកវានៅក្នុងមុខងារក៏ដោយ ឧទាហរណ៍៖
លទ្ធផល៖
ដូចដែលអ្នកអាចឃើញមិនមានកំហុសទេ ប៉ុន្តែអាគុយម៉ង់ដែលឆ្លងកាត់របស់យើងមិនត្រូវបានប្រើនៅកន្លែងណានោះទេ។ ប៉ុន្តែនេះមិនមានន័យថាពួកវាបានបាត់នោះទេ - ពួកគេនៅតែត្រូវបានបញ្ចូលទៅក្នុងមុខងារ ហើយយើងអាចប្រើប្រាស់វាបាន មានមុខងារ PHP ដែលភ្ជាប់មកជាមួយសម្រាប់នេះ៖
func_num_args()- ត្រឡប់ចំនួនអាគុយម៉ង់ដែលបានបញ្ជូនទៅអនុគមន៍
func_get_arg (លេខលំដាប់)- ត្រឡប់ធាតុមួយពីបញ្ជីអាគុយម៉ង់
func_get_args()- ត្រឡប់អារេដែលមានអាគុយម៉ង់មុខងារ
"; echo func_get_arg(0); ) $age = 22; getEcho("Rud Sergey", $age);
លទ្ធផល៖
សេចក្តីសន្និដ្ឋាន
អត្ថបទថ្ងៃនេះជាអត្ថបទចុងក្រោយលើប្រធានបទនៃមុខងារនៅក្នុង PHP ។ ឥឡូវនេះ អ្នកអាចមានទំនុកចិត្តលើភាពពេញលេញនៃចំណេះដឹងរបស់អ្នកទាក់ទងនឹងប្រធានបទនេះ ហើយអាចប្រើប្រាស់មុខងារសម្រាប់តម្រូវការរបស់អ្នកដោយទំនុកចិត្ត។
ប្រសិនបើនរណាម្នាក់មានបំណងចង់ឱ្យវាកាន់តែប្រសើរឡើង ប៉ុន្តែមិនដឹងពីរបៀបធ្វើវា វិធីល្អបំផុតគឺត្រូវសរសេរមុខងារ PHP ដែលត្រៀមរួចជាស្រេច (ភ្ជាប់មកជាមួយ) ឧទាហរណ៍ អ្នកអាចសរសេរមុខងារ count() ផ្ទាល់ខ្លួនរបស់អ្នក។ ឬផ្សេងទៀត។
អរគុណអ្នកទាំងអស់គ្នាសម្រាប់ការចាប់អារម្មណ៍ ហើយជួបគ្នាម្តងទៀត! ប្រសិនបើមានអ្វីមិនច្បាស់ សូមសួរសំណួររបស់អ្នកនៅក្នុងមតិយោបល់!
អថេរដែលបានកំណត់ក្នុងទម្រង់ការរង (មុខងារកំណត់ដោយអ្នកប្រើប្រាស់)។ ពួកវាអាចចូលប្រើបានតែនៅក្នុងមុខងារដែលពួកគេត្រូវបានកំណត់។
សម្រាប់ PHP រាល់អថេរទាំងអស់ដែលបានប្រកាស និងប្រើក្នុងមុខងារគឺស្ថិតនៅក្នុងមូលដ្ឋាននៃមុខងារតាមលំនាំដើម។ នោះគឺតាមលំនាំដើម វាមិនអាចផ្លាស់ប្តូរតម្លៃនៃអថេរសកលនៅក្នុងតួនៃអនុគមន៍បានទេ។
ប្រសិនបើនៅក្នុងតួនៃអនុគមន៍កំណត់ដោយអ្នកប្រើប្រាស់ អ្នកប្រើអថេរដែលមានឈ្មោះដូចគ្នាបេះបិទទៅនឹងឈ្មោះនៃអថេរសកល (ដែលមានទីតាំងនៅខាងក្រៅមុខងារកំណត់ដោយអ្នកប្រើប្រាស់) នោះអថេរមូលដ្ឋាននេះនឹងមិនមានទំនាក់ទំនងជាមួយអថេរសកលទេ។ ក្នុងស្ថានភាពនេះ អថេរមូលដ្ឋានដែលមានឈ្មោះដូចគ្នាបេះបិទនឹងឈ្មោះនៃអថេរសកលនឹងត្រូវបានបង្កើតនៅក្នុងមុខងារកំណត់ដោយអ្នកប្រើប្រាស់ ប៉ុន្តែអថេរមូលដ្ឋាននេះនឹងមាននៅក្នុងមុខងារកំណត់ដោយអ្នកប្រើប្រាស់នេះប៉ុណ្ណោះ។
ចូរយើងពន្យល់ការពិតនេះជាមួយនឹងឧទាហរណ៍ជាក់លាក់មួយ៖
$a = 100 ;
មុខងារមុខងារ () (
$a = 70;
បន្ទរ "
$a
" ;}
មុខងារ ();
បន្ទរ "
$a
" ;?>
ស្គ្រីបនឹងបោះពុម្ព 70 ដំបូងហើយបន្ទាប់មក 100៖
70
100
ដើម្បីកម្ចាត់គុណវិបត្តិនេះមានការណែនាំពិសេសនៅក្នុង PHP តេស្ត ();អនុញ្ញាតឱ្យមុខងារកំណត់ដោយអ្នកប្រើប្រាស់ដើម្បីធ្វើការជាមួយអថេរសកល។ សូមក្រឡេកមើលគោលការណ៍នេះដោយប្រើឧទាហរណ៍ជាក់លាក់៖
$a = 1 ;
សកល
ផលបូក ()
{
សកល $a, $b;
$b = 2 ;
}
ផលបូក()
បន្ទរ $b ;
?>
ស្គ្រីបខាងលើនឹងចេញ " 3 "។ បន្ទាប់ពីកំណត់ $aនិង $bនៅខាងក្នុងមុខងារដូចជា តេស្ត ();សេចក្តីយោងទាំងអស់ចំពោះអថេរទាំងនេះនឹងចង្អុលទៅកំណែសកលរបស់ពួកគេ។ មិនមានដែនកំណត់ចំពោះចំនួនអថេរសកលដែលអាចត្រូវបានគ្រប់គ្រងដោយមុខងារកំណត់ដោយអ្នកប្រើប្រាស់នោះទេ។
វិធីទីពីរដើម្បីចូលប្រើអថេរវិសាលភាពសកលគឺត្រូវប្រើអារេដែលកំណត់ដោយ PHP ពិសេស $GLOBALS. ឧទាហរណ៍មុនអាចត្រូវបានសរសេរឡើងវិញដូចនេះ៖
ការប្រើប្រាស់ $GLOBALS ជំនួសឱ្យសកល៖
$a = 1 ;
សកល
ផលបូក ()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}
ផលបូក()
បន្ទរ $b ;
?>
$GLOBALSគឺជាអារេសហការដែលកូនសោគឺជាឈ្មោះ ហើយតម្លៃរបស់វាជាមាតិកានៃអថេរសកល។ ចំណាំថា $GLOBALS មាននៅក្នុងវិសាលភាពណាមួយ នេះគឺដោយសារតែនេះគឺជាអារេមួយ។ ខាងក្រោមនេះជាឧទាហរណ៍ដែលបង្ហាញពីសមត្ថភាពរបស់ superglobals៖
ឧទាហរណ៍ #3 មហាសកល និងវិសាលភាព
{
មុខងារ test_global()
// "អស្ចារ្យ" និងអាចរកបាននៅក្នុងតំបន់
// ការមើលឃើញមុខងារតម្រូវឱ្យបញ្ជាក់ "សកល" ។
// ភាពមើលឃើញ មុខងារតម្រូវឱ្យបញ្ជាក់ "សកល" ។
សកល $ HTTP_POST_VARS ;
អេកូ $HTTP_POST_VARS["ឈ្មោះ"];
// ភាពមើលឃើញនិងមិនតម្រូវឱ្យមាន "សកល" ត្រូវបានបញ្ជាក់។
// Superglobals មានតាំងពី PHP 4.1.0
// ការប្រើប្រាស់ HTTP_POST_VARS ត្រូវបានបដិសេធ។
}
?>