php ប្រសិនបើមិនទទេ។ អនុវត្តមុខងារ PHP ទទេ () ។ ភាពខុសគ្នារវាងអថេរដែលមានតម្លៃ NULL និងអថេរដែលមិនបានកំណត់

ខ្សែអក្សរអថេរ (12)

ខ្ញុំមានមុខងារមួយគឺ NotEmpty ដែលត្រឡប់ពិត ប្រសិនបើខ្សែអក្សរមិនទទេ ហើយមិនពិត ប្រសិនបើខ្សែអក្សរទទេ។ ខ្ញុំបានរកឃើញថាវាមិនដំណើរការទេប្រសិនបើខ្ញុំឆ្លងកាត់បន្ទាត់ទទេតាមរយៈវា។

មុខងារ isNotEmpty($ input) ( $strTemp = $input; $strTemp = trim($strTemp); if(strTemp != "") // សាកល្បងវាផងដែរ "if(strlen($strTemp) > 0)" (ត្រឡប់ពិត ;) ត្រឡប់​មិន​ពិត ;

ខ្សែអក្សរត្រូវបានធីកដោយប្រើ isNotEmpty:

If(isNotEmpty($userinput["phoneNumber"])) ( // validate the phone number ) else ( បន្ទរ "លេខទូរស័ព្ទមិនបានបញ្ចូលទេ
"; }

ប្រសិនបើបន្ទាត់នៅទទេ ផ្សេងទៀតមិនត្រូវបានប្រតិបត្តិ ខ្ញុំមិនយល់ថាហេតុអ្វីទេ អ្នកណាម្នាក់អាចបំភ្លឺអំពីបញ្ហានេះ។

ចម្លើយ

ប្រសិនបើអ្នកមានវាលមួយឈ្មោះ serial_number ហើយអ្នកចង់ពិនិត្យមើលកន្លែងទំនេរ

$serial_number = trim($_POST); $q="ជ្រើសរើស * ពីផលិតផលដែល user_id="$_SESSION""; $rs=mysql_query($q); while($row=mysql_fetch_assoc($rs))(ប្រសិនបើ(ទទេ($_POST["irons"])))($irons=$row["product1"];)

វិធីនេះអ្នកអាចធ្វើម្តងទៀតតាមរយៈរង្វិលជុំទាំងអស់នៅក្នុងរង្វិលជុំជាមួយនឹងមុខងារទទេផ្សេងទៀត។

ជាការប្រសើរណាស់, ជំនួសឱ្យការឆ្លើយ (ខ្ញុំជឿថាអ្នកបានដោះស្រាយបញ្ហារបស់អ្នករួចហើយ) ខ្ញុំនឹងផ្តល់ឱ្យអ្នកនូវដំបូន្មានមួយចំនួន។

ខ្ញុំ​មិន​ដឹង​ពី​អ្នក​ដទៃ​ទេ ប៉ុន្តែ​ខ្ញុំ​ផ្ទាល់​មាន​អារម្មណ៍​តានតឹង​ពេល​ឃើញ​រឿង​មួយ​ដូច​ជា៖

ប្រសិនបើ(<>) (ត្រឡប់ពិត;) ត្រឡប់មិនពិត;

នេះតម្រូវឱ្យមានការត្រឡប់មកវិញ "ឆើតឆាយ<>); " សូមក្រឡេកមើលកូដរបស់អ្នកជានិច្ច ហើយដកតក្កវិជ្ជានេះចេញ។ សម្រាប់ គ្នាស្ថានភាពអ្នកមិនត្រូវការសេចក្តីថ្លែងការណ៍ IF ទេ។

ខ្ញុំគ្រាន់តែសរសេរមុខងារ is_string ផ្ទាល់ខ្លួនរបស់ខ្ញុំ ដើម្បីពិនិត្យមើលប្រភេទ និង strlen ដើម្បីពិនិត្យមើលប្រវែង។

មុខងារទទេStr($str) (ត្រឡប់ is_string($str) && strlen($str) === 0; ) បោះពុម្ពទទេStr("") ? "ទទេ" : "មិនទទេ"; // ទទេ

កែសម្រួល៖ អ្នកក៏អាចប្រើមុខងារ trim ដើម្បីពិនិត្យមើលថាតើខ្សែអក្សរមិនមាន។

Is_string($str) && strlen(trim($str)) === 0;

PHP មានមុខងារដែលភ្ជាប់មកជាមួយហៅថាទទេ() ការធ្វើតេស្តនេះត្រូវបានធ្វើដោយវាយ if(empty($string))(...) php.net link: php empty

អ្នកមានចម្លើយ ប៉ុន្តែក្នុងករណីរបស់អ្នកអ្នកអាចប្រើបាន។

ត្រឡប់ទទេ ($ input);

ត្រឡប់ is_string($ input);

បញ្ហាសាមញ្ញ។ ផ្លាស់ប្តូរ៖

ប្រសិនបើ (strTemp !="")

ប្រសិនបើ ($strTemp !="")

ប្រហែលជាអ្នកក៏អាចប្តូរវាទៅជា៖

ប្រសិនបើ($strTemp !== "")

ចាប់តាំងពី !="" នឹងត្រឡប់ពិត ប្រសិនបើអ្នកឆ្លងកាត់លេខ 0 និងករណីមួយចំនួនផ្សេងទៀត ដោយសារការបំប្លែងប្រភេទស្វ័យប្រវត្តិរបស់ PHP ។

សូមចងចាំផងដែរថា PHP មានមុខងារទទេ () រួចហើយ។

PHP វាយតម្លៃខ្សែអក្សរទទេទៅជាមិនពិត ដូច្នេះអ្នកអាចប្រើបានយ៉ាងសាមញ្ញ៖

ប្រសិនបើ (trim($userinput["phoneNumber"])) ( // បញ្ជាក់លេខទូរស័ព្ទ ) else ( បន្ទរ "លេខទូរស័ព្ទមិនបានបញ្ចូលទេ
"; }

ខ្ញុំតែងតែប្រើ regex ដើម្បីពិនិត្យមើលខ្សែអក្សរទទេ ដែលមានអាយុកាលតាំងពីសម័យ CGI/Perl ក៏ដូចជា Javascript ដូច្នេះហេតុអ្វីមិនមែនជាឧទាហរណ៍ PHP (ទោះបីជាមិនបានសាកល្បងក៏ដោយ)

ត្រឡប់ preg_match("/\S/", $ input);

កន្លែងដែល \S តំណាងឱ្យតួអក្សរណាមួយដោយគ្មានចន្លោះ

គ្រាន់តែប្រើមុខងារ strlen()

ប្រសិនបើ (strlen($s)) ( // មិនទទេ)

ថ្មីៗនេះខ្ញុំបានសួរខ្លួនឯងនូវសំណួរដូចគ្នា។
មានដំណោះស្រាយជាច្រើនដែលអាចមាន ខាងក្រោមនេះជាដំណោះស្រាយត្រឹមត្រូវចំនួន 3៖

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === ចាប់ផ្តើម
  • s.lastIndexOf(starter, 0) === 0 (បន្ថែមបន្ទាប់ពីមើលចម្លើយរបស់ Mark Bayer)
  • ដោយប្រើរង្វិលជុំ៖

    មុខងារ startsWith(s,starter) (សម្រាប់ (var i=0,cur_c; i< starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

ខ្ញុំមិនទាន់បានឆ្លងកាត់ដំណោះស្រាយចុងក្រោយដែលពាក់ព័ន្ធនឹងការប្រើរង្វិលជុំទេ។
គួរឱ្យភ្ញាក់ផ្អើល ដំណោះស្រាយនេះគឺអស្ចារ្យជាង 3 ដំបូង។
នេះជាការសាកល្បង jsperf ដែលខ្ញុំបានរត់ដើម្បីឈានដល់ការសន្និដ្ឋាននេះ៖ http://jsperf.com/startswith2/2

ps: ecmascript 6 (សុខដុមរមនា) ណែនាំ startsWith របស់វាផ្ទាល់ជាមួយនឹងវិធីសាស្រ្តសម្រាប់ខ្សែអក្សរ។
គិតថាតើពេលវេលាប៉ុន្មាននឹងត្រូវបានរក្សាទុក ប្រសិនបើពួកគេបានគិតថានឹងរួមបញ្ចូលវិធីសាស្ត្រដែលត្រូវការច្រើននេះនៅក្នុងកំណែដំបូង។

ធ្វើបច្ចុប្បន្នភាព

ចំណាំថាមានការបង្កើនប្រសិទ្ធភាពរង្វិលជុំចំនួន 2 ដែល Steve រួមបញ្ចូល ទីមួយក្នុងចំណោមទាំងពីរបានបង្ហាញពីដំណើរការប្រសើរជាងមុន ដូច្នេះខ្ញុំនឹងបង្ហោះកូដនោះខាងក្រោម៖

អនុគមន៍ startsWith2(str, prefix) ( if (str.length< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === បុព្វបទ[i]); --i) បន្ត; ត្រឡប់ i< 0; }

ប្រសិនបើនៅពេលធ្វើការជាមួយខ្សែអក្សរ អ្នកត្រូវពិនិត្យមើលថាតើខ្សែអក្សរទទេឬអត់ អ្នកសរសេរកម្មវិធីចាប់ផ្តើមប្រើជាធម្មតា strlen(). មុខងារនេះគឺលឿនណាស់ព្រោះវាមិនអនុវត្តការគណនាណាមួយទេ ប៉ុន្តែគ្រាន់តែត្រឡប់តម្លៃដែលស្គាល់រួចមកហើយនៃប្រវែងខ្សែអក្សរដែលមាននៅក្នុង zval (PHP ប្រើរចនាសម្ព័ន្ធ C ដើម្បីរក្សាទុកអថេរ)។ ប៉ុន្តែនៅតែដោយសារតែ strlen()- នេះគឺជាមុខងារ វាយឺតបន្តិច ព្រោះវាទាមទារសកម្មភាពជាច្រើននៅពេលហៅ ដូចជាការបំប្លែងទៅជាអក្សរតូច និងស្វែងរកតារាង hash ។ ក្នុងករណីខ្លះ អ្នកអាចបង្កើនល្បឿនប្រតិបត្តិនៃកូដរបស់អ្នកដោយប្រើ ទទេ ()..., ប៉ុន្តែផងដែរ។ ទទេ ()អ្នកនៅតែអាចបង្កើនប្រសិទ្ធភាពវាបន្តិច។

សូមលើកឧទាហរណ៍មួយ។ឧទាហរណ៍ ពិនិត្យផ្លូវរូបភាពមុខងារពិនិត្យមើលថាតើផ្លូវទទេឬអត់ បន្ទាប់មកជំនួសវាដោយផ្លូវផ្សេងទៀត ឧទាហរណ៍ “images/noimage.jpg”។

ដូច្នេះហើយ កិច្ចការទាំងមូលនឹងចាប់ផ្តើមដើម្បីពិនិត្យមើលថាតើអថេរនៃប្រភេទខ្សែអក្សរគឺទទេ។ តោះសាកល្បងវិធី ៤ យ៉ាង៖

  • ប្រសិនបើ(strlen($img_path)>0)
  • ប្រសិនបើ($img_path(0))
  • ប្រសិនបើ (ទទេ($img_path))
  • និងវិធីមួយទៀតសម្រាប់ចុងក្រោយ។

ដូច្នេះ​ហើយ​យើង​នឹង​សរសេរ​តាម​វិធី​ដំបូង៖

មុខងារ check_image_path($img_path ) (ប្រសិនបើ (strlen ($img_path) >0 ) ( $img_path = "images/noimage.jpg" ; ) ត្រឡប់ $img_path ; )

ចូរអនុវត្តការធ្វើតេស្ត ពេលវេលាសាកល្បងជាមធ្យមបានយក 1.43795800209 វិ។

គិតអំពីវាបន្តិច... អ្នកអាចចូលប្រើតួអក្សរទីមួយនៃបន្ទាត់ក្នុងពេលតែមួយ ជាជាងបន្ទាត់ទាំងមូល។ ប្រសិនបើតួអក្សរទីមួយនៅទីនោះ នោះខ្សែអក្សរមិនទទេទេ។ តួអក្សរទីមួយនៅក្នុងបន្ទាត់គឺលេខ "0" ។

មុខងារ check_image_path($img_path) (ប្រសិនបើ ($img_path ( 0 ) ) ( $img_path = "images/noimage.jpg" ; ) ត្រឡប់ $img_path ;)

ពេលវេលាសាកល្បងជាមធ្យមបានយក 1.19431300163 វិនាទី ១៧% នៃពេលវេលាលេង

តោះព្យាយាមសរសេរដោយប្រើទទេ () ឥឡូវនេះ៖

មុខងារ check_image_path($img_path) (ប្រសិនបើ (ទទេ ($img_path))) ( $img_path = "images/noimage.jpg" ;) ត្រឡប់ $img_path ;)

ពេលវេលាសាកល្បងជាមធ្យមបានយក 1.1341319084 វិ។ 5% នៃពេលវេលាលេងឡើងវិញពីឧទាហរណ៍មុន។

ឥឡូវនេះ សូមក្រឡេកមើលឧទាហរណ៍ចុងក្រោយ និងចុងក្រោយខាងលើយើង។ តោះមើលពីរបៀបដែលវាអាចបញ្ចូលគ្នា។ គិត... តើអ្នកអាចបង្កើនប្រសិទ្ធភាពដោយរបៀបណាទៀត?

មុខងារ check_image_path($img_path) (ប្រសិនបើ (ទទេ ($img_path ( 0 ) ) ) ( $img_path = "images/noimage.jpg" ; ) ត្រឡប់ $img_path ; )

ពេលវេលាសាកល្បងជាមធ្យមបានយក 1.07465314865 វិនាទី ហើយម្តងទៀត យើងបានឈ្នះ 5% នៃពេលវេលា...

តើវាដំណើរការដោយរបៀបណា ហើយហេតុអ្វីបានជាវាលឿនជាង? ហើយនៅទីនេះ $img_path(0)ត្រឡប់​តួអក្សរ​ដំបូង... និង​បន្ទាប់​មក​មុខងារ ទទេ ()ពិនិត្យរកខ្សែអក្សរទទេ... ភាពខុសគ្នាពីឧទាហរណ៍មុនគឺមានតែតួអក្សរមួយប៉ុណ្ណោះដែលត្រូវបានបញ្ជូនទៅមុខងារ មិនមែនខ្សែអក្សរទាំងមូលទេ។ ដូច្នេះ ចាប់ពី​ឧទាហរណ៍​ដំបូង​ដល់​លើក​ចុងក្រោយ​យើង​ឈ្នះ 25% ពេលវេលា។

នៅក្នុង PHP តម្លៃ FALSE និង NULL និងតម្លៃដែលជាប់ទាក់ទងរបស់ពួកគេគឺខុសពីរបៀបដែលវាជាធម្មតានៅក្នុងភាសាផ្សេងទៀត ហើយមានលក្ខណៈពិសេសមិនច្បាស់ផ្ទាល់ខ្លួន។
អត្ថបទពិភាក្សាអំពីលក្ខណៈពិសេសទាំងនេះ។
សម្រាប់អ្នកចាប់ផ្តើមដំបូង វាអាចមានប្រយោជន៍សម្រាប់ការមើលរូបភាពពេញលេញ សម្រាប់អ្នកអានដែលមានបទពិសោធន៍ វាអាចមានប្រយោជន៍ក្នុងការធ្វើឱ្យការចងចាំរបស់ពួកគេឡើងវិញ ប្រសិនបើភាពស្រពិចស្រពិលខ្លះបានធ្វើឱ្យគំនិតរបស់ពួកគេ។

FALSE ក្នុង If statements

យោងតាមឯកសារ PHP តម្លៃខាងក្រោមគឺ FALSE បន្ទាប់ពីបោះទៅប៊ូលីន៖
  • តម្លៃប៊ូលីនខ្លួនវាគឺជា FALSE
  • ខ្សែអក្សរទទេ ("") និងខ្សែអក្សរ "0" ។
  • អារេទទេ (អារេ) - អារេ () ។
  • វត្ថុដែលមានអថេរសមាជិកសូន្យ (PHP 4 តែប៉ុណ្ណោះ មិនត្រូវបានគ្របដណ្តប់នៅក្នុងអត្ថបទនេះទេ)
  • តម្លៃ NULL ពិសេស (រួមទាំងអថេរដែលមិនបានកំណត់)
  • វត្ថុ SimpleXML (មិនត្រូវបានគ្របដណ្តប់នៅក្នុងអត្ថបទនេះ)
នេះមានន័យថាប្រសិនបើតម្លៃបែបនេះត្រូវបានបញ្ជូនទៅលក្ខខណ្ឌ:
ប្រសិនបើ (…) បន្ទរ “1”; ផ្សេងទៀតបន្ទរ “0”;
បន្ទាប់មកខ្សែអក្សរ "0" នឹងត្រូវបានបោះពុម្ព។

ប្រសិនបើតម្លៃនៃអថេរមិនត្រូវបានកំណត់ (មិនកំណត់) នោះការព្រមានក៏អាចត្រូវបានចេញផងដែរ។ អនុញ្ញាតឱ្យយើងរំលឹកអ្នកថាការព្រមាននៅក្នុងលក្ខខណ្ឌអាចត្រូវបានយកចេញដោយការសរសេរ @ មុនពេលអថេរ។

ឧទាហរណ៍:

ប្រសិនបើ (@$undefVar) (…)
ប៉ុន្តែអ្នកគួរតែប្រើ @ តែក្នុងករណីធ្ងន់ធ្ងរនៅពេលដែលអ្នកបានគិតដោយប្រុងប្រយ័ត្ន ហើយមិនមានជម្រើសសមរម្យផ្សេងទៀតទេ។ មើលមុខងារ isset()។

មុខងារ is_null() និងភាសាបង្កើត isset() និងទទេ()

is_null() ត្រឡប់ TRUE សម្រាប់តែអថេរដែលមិនត្រូវបានផ្តល់តម្លៃណាមួយ ឬដែលត្រូវបានកំណត់តម្លៃ NULL ។
isset() ត្រឡប់តម្លៃប៊ូលីនមួយទល់នឹងមួយ ប្រៀបធៀបទៅនឹង is_null() ។
ប្រសិនបើអថេរមិនត្រូវបានផ្តល់តម្លៃទេ នោះ is_null() ក៏ចេញការព្រមាន "អថេរដែលមិនបានកំណត់" មិនដូច isset() ដែលមិនចេញការព្រមានណាមួយឡើយ។
សូមចាំថា ដើម្បីលុបតម្លៃនៃអថេរ អ្នកអាចប្រើមុខងារ unset()។ អ្នកក៏អាចកំណត់តម្លៃ NULL សម្រាប់គោលបំណងនេះ ដើម្បីជៀសវាងការព្រមានពីអ្នកចងក្រង នៅពេលព្យាយាមអានតម្លៃនៃអថេរមួយ។

សូមចំណាំថា មិនដូចអថេរ ដើម្បីធ្វើការជាមួយ constants អ្នកត្រូវតែប្រើ defined() construct ។

តំណាងខ្សែអក្សរ

សូមក្រឡេកមើលខ្សែអក្សរតំណាងនៃថេរមិនពិត។
ឧទាហរណ៍ concatenation បំប្លែង​តម្លៃ​ទៅ​ជា​ខ្សែ​ដូច​ខាង​ក្រោម ដែល​បង្ហាញ​ក្នុង​តារាង​ខាងក្រោម៖

ប្រធាន​បទ​នៃ​ការ​បំប្លែង​ទៅ​ជា​ខ្សែ​អក្សរ​ត្រូវ​បាន​ពិពណ៌នា​យ៉ាង​លម្អិត​នៅ​លើ​គេហទំព័រ​ផ្លូវការ​ក្នុង​កថាខណ្ឌ​ការ​បំប្លែង​ទៅ​ជា​ខ្សែអក្សរ។

ប្រតិបត្តិករប្រៀបធៀប

ចូរបន្តទៅប្រតិបត្តិករប្រៀបធៀប។
តម្លៃ​មិន​ពិត​ទាំងអស់​ត្រឡប់​ពិត​ដូច​ដែល​បាន​រំពឹង​ទុក បើ​ប្រៀបធៀប​នឹង FALSE ដោយ​ប្រើ​ប្រតិបត្តិករ " ==" ។
ប៉ុន្តែ​អ្នក​មិន​គួរ​ពឹង​ផ្អែក​លើ​ការ​បញ្ជូន​បន្ត​នៅ​ទីនេះ​ទេ​នៅ​ពេល​ដែល​ប្រៀបធៀប​ថេរ​ខ្សែ​អក្សរ​មិន​ពិត​ជាមួយ​គ្នា។
នេះ​ជា​តារាង​ពេញលេញ​សម្រាប់​ការ​ប្រៀបធៀប​តម្លៃ​មិន​ពិត (បូក​នឹង​បង្ហាញ​ធាតុ​តារាង​ដែល​បើ​ប្រៀបធៀប​ដោយ​ប្រើ​ប្រតិបត្តិករ " != " ត្រឡប់​តម្លៃ​ពិត៖

$undef – អថេរ​ដែល​មិន​ត្រូវ​បាន​កំណត់​តម្លៃ

ការសន្និដ្ឋានដ៏រីករាយមួយចំនួនអាចត្រូវបានទាញចេញពីតារាង៖
1. ប្រសិនបើយើងដឹងថាយើងប្រើតែខ្សែអក្សរ នោះយើងអាចប្រៀបធៀបពួកវាដោយសុវត្ថិភាព ហើយកុំបារម្ភថា "" (ខ្សែអក្សរទទេ) នឹងស្មើនឹង "0" ។
2. អារេមិនដែលស្មើនឹងខ្សែអក្សរ ចំនួនគត់ ឬចំនួនពិតទេ។

ដោយសារប្រភេទនៃថេរមិនពិតខុសគ្នា ប្រតិបត្តិករមួយគូ === និង !== អាចត្រូវបានប្រើដើម្បីសម្គាល់ពួកវា។
ប្រតិបត្តិករ === ត្រឡប់ false សម្រាប់គូទាំងអស់នៃតម្លៃមិនពិត។
ត្រឡប់​តម្លៃ​ពិត​សម្រាប់​តែ​អាគុយម៉ង់​ដែល​មួយ​ត្រូវ​បាន​កំណត់​តម្លៃ NULL ហើយ​ទីពីរ​មិន​ត្រូវ​បាន​កំណត់​តម្លៃ​ណាមួយ​ទេ។

ភាពខុសគ្នារវាងអថេរដែលមានតម្លៃ NULL និងអថេរដែលមិនបានកំណត់

ប្រតិបត្តិករ === អនុញ្ញាតឱ្យអ្នកបែងចែករវាងតម្លៃមិនពិតទាំងអស់ លើកលែងតែអថេរដែលមានតម្លៃ NULL ពីអថេរដែលមិនត្រូវបានផ្តល់តម្លៃ។

អថេរបែបនេះអាចត្រូវបានសម្គាល់ដោយប្រើមុខងារ get_defined_vars() ។

ប្រសិនបើអ្នកត្រូវកំណត់ថាតើតម្លៃមួយត្រូវបានផ្តល់ទៅឱ្យអថេរ $var ឬអត់នោះ អត្ថបទកូដខាងក្រោមអាចត្រូវបានប្រើដើម្បីធ្វើការនេះ៖
ប្រសិនបើ (array_key_exists("var", get_defined_vars())) ( echo "var is defined"; // $var ត្រូវបានកំណត់ NULL ) else ( echo "var is not defined"; // $var is not defined or unset($ var) ត្រូវបានគេហៅថា)

ការសន្និដ្ឋាន

អ្នកគួរចងចាំជានិច្ចថានៅក្នុង PHP តម្លៃមិនពិតពីរអាចមិនស្មើគ្នា ហើយអថេរដែលហាក់ដូចជាខុសគ្នានៅ glance ដំបូងអាចប្រែទៅជាដូចគ្នានៅពេលប្រៀបធៀប។ ដើម្បីជៀសវាងការភ្ញាក់ផ្អើលបែបនេះ អ្នកអាចប្រើប្រតិបត្តិករ === និង !== ។

នៅពេលធ្វើការជាមួយអារេ ដើម្បីជៀសវាងការភ្ញាក់ផ្អើល អ្នកអាចសរសេរមុខងារមួយដើម្បីបំប្លែងតម្លៃទៅជាលិបិក្រមផ្សេងគ្នាដែលត្រូវបានធានា។ បន្ទាប់ពីនោះ ធាតុនៃអារេអាចចូលប្រើបានដោយប្រើវា។ វាអាចធ្វើឱ្យកម្មវិធីថយចុះ ប៉ុន្តែនឹងជួយជៀសវាងការភ្ញាក់ផ្អើល។

ការធ្វើតេស្តត្រូវបានអនុវត្តនៅលើ PHP 5.3.1 ។

តំណភ្ជាប់បន្ថែម

1. តារាងប្រៀបធៀបប្រភេទ PHP ។
2. MySQl Null និង Empty Strings នៅក្នុងបរិបទនៃ PHP ។

ស្លាក: បន្ថែមស្លាក

កម្មវិធីទំនើបត្រូវបានគ្រប់គ្រងដោយជោគជ័យនូវអថេរដែលមិនបានវាយបញ្ចូលអស់រយៈពេលជាយូរ។ ប្រភេទ​នៃ​អថេរ​មិន​អាច​បញ្ជាក់​ជា​មុន​បាន​ទេ ហើយ​អាច​ត្រូវ​បាន​ផ្លាស់​ប្តូរ​អំឡុង​ពេល​ប្រតិបត្តិ​កម្មវិធី។

គំនិតនេះបានក្លាយជាចំណុចកណ្តាលនៃគំរូកម្មវិធីទូទៅ។ នៅដើមដំបូងនៃយុគសម័យសរសេរកម្មវិធី ភាសាដែលមានទំនុកចិត្តហ្មត់ចត់ដូចគ្នាតម្រូវឱ្យអ្នកសរសេរកម្មវិធីកំណត់អថេរជាមុន ហើយធានាយ៉ាងតឹងរ៉ឹងថាគ្មានអ្វីខុសច្បាប់ត្រូវបានចាត់តាំងឱ្យពួកគេ។ ទាំងកម្មវិធី ឬភាសាសរសេរកម្មវិធីមិនមានគំនិតណាមួយមុនពេលដែលអថេរផ្លាស់ប្តូរប្រភេទរបស់វា។

អំពីភាពទទេ និងមិនមាន

មុខងារ PHP empty() គឺជាមុខងារបញ្ច្រាសនៃមុខងារ isset() ហើយមានមុខងារពិសេសមួយចំនួនក្នុងការប្រើប្រាស់។ ប្រសិនបើមិនមានអថេរទេ អនុគមន៍ទីមួយឆ្លើយតបជាវិជ្ជមាន ហើយលទ្ធផលរបស់វាគឺពិត ហើយទីពីរឆ្លើយតបអវិជ្ជមាន ពោលគឺតម្លៃរបស់វានឹងមិនពិត។

តាមនិយមន័យ isset() ត្រូវបានរចនាឡើងដើម្បីពិនិត្យមើលអត្ថិភាពនៃអថេរ។ វាមិនមានបញ្ហាអ្វី និងរបៀបដែលអថេរត្រូវបានចាត់ចែងនោះទេ រឿងសំខាន់គឺថាវាមាន ហើយមិនត្រូវបានបំផ្លាញដោយមុខងារ unset() ទេ។ លទ្ធផលនៃអនុគមន៍ isset() នឹងមានលក្ខណៈវិជ្ជមាន-ពិត។ វាជាការសំខាន់ក្នុងការចងចាំថាប្រសិនបើ $iVar = 0; បន្ទាប់មក isset($iVar) នឹងក្លាយជាការពិត ប៉ុន្តែទទេ($iVar) ក៏នឹងជាការពិតផងដែរ។

ក្នុងករណីទី 1 លទ្ធផលមានន័យថាអថេរមាន នៅក្នុងករណីទីពីរ អថេរគឺទទេ ពោលគឺតម្លៃ "0" ក្នុងទម្រង់ណាមួយ ថាតើវាជាខ្សែអក្សរ ("0") ឬលេខ (ប្រភាគ - 0.0 ឬចំនួនគត់ - 0) គឺដូចគ្នា៖ ទទេ ($iVar) នឹងពិត។

អំពីសុវត្ថិភាព និងការគ្រប់គ្រង

ការអនុវត្តបង្ហាញថាភាសាដែលមិនបានវាយបញ្ចូលផ្តល់សេរីភាពកាន់តែច្រើនដល់អ្នកសរសេរកម្មវិធី ប៉ុន្តែសន្មតថាអាកប្បកិរិយារបស់គាត់ក្នុងការធ្វើការលើក្បួនដោះស្រាយគឺទទួលខុសត្រូវជាង។

PHP ផ្តល់នូវវាក្យសម្ព័ន្ធទំនើបដែលគាំទ្រអត្ថន័យដែលបានបង្កើតឡើង មានកំហុសតិចតួច ប៉ុន្តែទាមទារការយកចិត្តទុកដាក់យ៉ាងប្រុងប្រយ័ត្ន។ ឧទាហរណ៍ ការហៅមុខងារណាមួយតម្រូវឱ្យមានចំនួនប៉ារ៉ាម៉ែត្រជាក់លាក់។

នៅពេលហៅមុខងារមួយ វាមិនចាំបាច់ក្នុងការឆ្លងកាត់ប៉ារ៉ាម៉ែត្រទាំងអស់ទេ អ្នកអាចឆ្លងកាត់បានតែផ្នែកសំខាន់នៃពួកវាប៉ុណ្ណោះ។ មុខងារ "ត្រូវតែ" ពិនិត្យវត្តមាន និងអត្ថិភាពនៃប៉ារ៉ាម៉ែត្រទាំងអស់។ របស់ដែលបាត់ ឬមានតម្លៃមិនត្រឹមត្រូវ ត្រូវតែត្រូវបានស្ដារឡើងវិញនូវទម្រង់ធម្មតា និងកំណត់តម្លៃដែលត្រូវការ។

នៅក្នុងបរិបទនេះ មុខងារ PHP empty() គឺចាំបាច់។ កន្សោម៖

$a = "1; 2" + 20

នឹងកំណត់តម្លៃ 21 ទៅអថេរ $a ដោយហេតុថាផ្នែកទីមួយនៃកន្សោមនឹងត្រូវបានតំណាងជា 1 ហើយទីពីរនឹងមាន 20។

លទ្ធផលនឹងជាលេខប្រភេទ ហើយមុខងារ PHP ទទេ ($a) នឹងមានលទ្ធផល - មិនពិត នោះគឺ អថេរ $a មិនទទេទេ។

ក្នុងបរិបទនេះ មានមុខងារមួយ៖

FuncTest($a=0,$b=20)

ពេល​ហៅ​ទូរសព្ទ៖

$res = funcTest($aVal, $bVal)

នឹងមានអ្វីដែលចង់បាន នោះគឺជាលទ្ធផលនៃមុខងារ។ ហើយនៅពេលគេហៅ៖

  • $res = funcTest($aVal. $bVal)

តួមុខងារមានប៉ារ៉ាម៉ែត្រតែមួយគត់ដែលមានតម្លៃ "$aVal . $bVal" ហើយភាគច្រើនទំនងជាប៉ារ៉ាម៉ែត្រនេះនឹងត្រូវបានបកស្រាយជាខ្សែអក្សរ។

PHP ទទេ() សម្រាប់វត្ថុ និងអារេ

វាក្យសម្ព័ន្ធភាសាមានចំនួនគ្រប់គ្រាន់នៃការសាងសង់ និងមុខងារសម្រាប់ធ្វើការជាមួយវត្ថុ និងអារេ ប៉ុន្តែតាមទស្សនៈនៃការពិនិត្យរកអត្ថិភាពរបស់វា និងសម្រាប់វត្តមានតម្លៃ វាមិនមានភាពខុសគ្នាពិសេសពីអថេរទេ។

PHP ទទេ (អារេ) - ស្មើនឹងការហៅទទេ (អថេរសាមញ្ញ) ។ ទោះយ៉ាងណាក៏ដោយមានការពិចារណាយ៉ាងសំខាន់ទាក់ទងនឹងវត្ថុ។ សម្រាប់ការពិនិត្យវត្ថុសម្រាប់អត្ថិភាព (isset) សំណួរពិបាកយល់ណាស់។ ចំពោះមុខងារ PHP empty() ការណែនាំនៃការប្រើប្រាស់របស់វានៅតែមានចម្ងល់។

យោងតាមតក្កវិជ្ជានៃកម្មវិធីតម្រង់ទិសវត្ថុ វត្ថុមួយមានខ្លឹមសាររបស់វា និងសំណុំនៃវិធីសាស្ត្រផ្ទាល់ខ្លួនរបស់វា។ មានតែវត្ថុខ្លួនវាទេដែលអាចប្រាប់ថាតើវាទទេឬមិនទទេ ប៉ុន្តែមិនមែនជាមុខងារភាគីទីបីទេ បើទោះបីជាវាជាផ្នែកមួយនៃវាក្យសម្ព័ន្ធនៃភាសាក៏ដោយ។

វត្ថុមួយ និងមុខងាររបស់វាទទេ ()

នៅលើមូលដ្ឋានដ៏សាមញ្ញ ប៉ុន្តែស្របច្បាប់នេះ រាល់វត្ថុទាំងអស់គួរតែត្រូវបានពិចារណានៅក្នុងបរិបទនៃការយល់ដឹងអំពី "ភាពទទេ" របស់វា។ ឧទាហរណ៍ការអនុវត្តវត្ថុ "តារាងបុគ្គលិក" មានកំណត់ត្រា "និយោជិត" ។ ប៉ុន្តែប្រសិនបើមិនមានបុគ្គលិកតែមួយទេនោះនៅក្នុង "បញ្ជីបុគ្គលិក" តែងតែមានជម្រើសសម្រាប់មុខតំណែងរបស់បុគ្គលិកសក្តានុពល។

តើ​ខ្ញុំ​គួរ​ប្រើ​មុខងារ​វត្ថុ​ទទេ PHP នៅ​កម្រិត​ណា? នៅកម្រិត "បុគ្គលិក" អ្វីគ្រប់យ៉ាងមាន ទោះបីជាមិនមានបុគ្គលិកតែមួយក៏ដោយ។ នៅកម្រិត "និយោជិត" វត្ថុមានរួចហើយ ទោះបីជាវាមិនត្រូវបានបំពេញទាំងស្រុងក៏ដោយ។ វត្ថុដែលមិនបានបំពេញទាំងស្រុងអាចត្រូវបានចាត់ថ្នាក់ជាវត្ថុទទេ។ មិនមានអត្ថប្រយោជន៍ពីវាដល់តុបុគ្គលិកទេ។

អាស្រ័យលើរចនាប័ទ្មការសរសេរកម្មវិធីរបស់អ្នក មុខងារ PHP ទទេ() និង isset() មានសារៈសំខាន់ខ្លាំងណាស់សម្រាប់ការកសាងក្បួនដោះស្រាយដែលមានសុវត្ថិភាព និងអាចទុកចិត្តបាន ប៉ុន្តែសម្រាប់វត្ថុ វានៅតែប្រសើរជាងដែលមានវ៉ារ្យ៉ង់ទទេ () ដែលកំណត់ដោយមាតិការបស់វា។

នៅក្នុង PHP តម្លៃ FALSE និង NULL និងតម្លៃដែលជាប់ទាក់ទងរបស់ពួកគេគឺខុសពីរបៀបដែលវាជាធម្មតានៅក្នុងភាសាផ្សេងទៀត ហើយមានលក្ខណៈពិសេសមិនច្បាស់ផ្ទាល់ខ្លួន។
អត្ថបទពិភាក្សាអំពីលក្ខណៈពិសេសទាំងនេះ។
សម្រាប់អ្នកចាប់ផ្តើមដំបូង វាអាចមានប្រយោជន៍សម្រាប់ការមើលរូបភាពពេញលេញ សម្រាប់អ្នកអានដែលមានបទពិសោធន៍ វាអាចមានប្រយោជន៍ក្នុងការធ្វើឱ្យការចងចាំរបស់ពួកគេឡើងវិញ ប្រសិនបើភាពស្រពិចស្រពិលខ្លះបានធ្វើឱ្យគំនិតរបស់ពួកគេ។

FALSE ក្នុង If statements

យោងតាមឯកសារ PHP តម្លៃខាងក្រោមគឺ FALSE បន្ទាប់ពីបោះទៅប៊ូលីន៖
  • តម្លៃប៊ូលីនខ្លួនវាគឺជា FALSE
  • ខ្សែអក្សរទទេ ("") និងខ្សែអក្សរ "0" ។
  • អារេទទេ (អារេ) - អារេ () ។
  • វត្ថុដែលមានអថេរសមាជិកសូន្យ (PHP 4 តែប៉ុណ្ណោះ មិនត្រូវបានគ្របដណ្តប់នៅក្នុងអត្ថបទនេះទេ)
  • តម្លៃ NULL ពិសេស (រួមទាំងអថេរដែលមិនបានកំណត់)
  • វត្ថុ SimpleXML (មិនត្រូវបានគ្របដណ្តប់នៅក្នុងអត្ថបទនេះ)
នេះមានន័យថាប្រសិនបើតម្លៃបែបនេះត្រូវបានបញ្ជូនទៅលក្ខខណ្ឌ:
ប្រសិនបើ (…) បន្ទរ “1”; ផ្សេងទៀតបន្ទរ “0”;
បន្ទាប់មកខ្សែអក្សរ "0" នឹងត្រូវបានបោះពុម្ព។

ប្រសិនបើតម្លៃនៃអថេរមិនត្រូវបានកំណត់ (មិនកំណត់) នោះការព្រមានក៏អាចត្រូវបានចេញផងដែរ។ អនុញ្ញាតឱ្យយើងរំលឹកអ្នកថាការព្រមាននៅក្នុងលក្ខខណ្ឌអាចត្រូវបានយកចេញដោយការសរសេរ @ មុនពេលអថេរ។

ឧទាហរណ៍:

ប្រសិនបើ (@$undefVar) (…)
ប៉ុន្តែអ្នកគួរតែប្រើ @ តែក្នុងករណីធ្ងន់ធ្ងរនៅពេលដែលអ្នកបានគិតដោយប្រុងប្រយ័ត្ន ហើយមិនមានជម្រើសសមរម្យផ្សេងទៀតទេ។ មើលមុខងារ isset()។

មុខងារ is_null() និងភាសាបង្កើត isset() និងទទេ()

is_null() ត្រឡប់ TRUE សម្រាប់តែអថេរដែលមិនត្រូវបានផ្តល់តម្លៃណាមួយ ឬដែលត្រូវបានកំណត់តម្លៃ NULL ។
isset() ត្រឡប់តម្លៃប៊ូលីនមួយទល់នឹងមួយ ប្រៀបធៀបទៅនឹង is_null() ។
ប្រសិនបើអថេរមិនត្រូវបានផ្តល់តម្លៃទេ នោះ is_null() ក៏ចេញការព្រមាន "អថេរដែលមិនបានកំណត់" មិនដូច isset() ដែលមិនចេញការព្រមានណាមួយឡើយ។
សូមចាំថា ដើម្បីលុបតម្លៃនៃអថេរ អ្នកអាចប្រើមុខងារ unset()។ អ្នកក៏អាចកំណត់តម្លៃ NULL សម្រាប់គោលបំណងនេះ ដើម្បីជៀសវាងការព្រមានពីអ្នកចងក្រង នៅពេលព្យាយាមអានតម្លៃនៃអថេរមួយ។

សូមចំណាំថា មិនដូចអថេរ ដើម្បីធ្វើការជាមួយ constants អ្នកត្រូវតែប្រើ defined() construct ។

តំណាងខ្សែអក្សរ

សូមក្រឡេកមើលខ្សែអក្សរតំណាងនៃថេរមិនពិត។
ឧទាហរណ៍ concatenation បំប្លែង​តម្លៃ​ទៅ​ជា​ខ្សែ​ដូច​ខាង​ក្រោម ដែល​បង្ហាញ​ក្នុង​តារាង​ខាងក្រោម៖

ប្រធាន​បទ​នៃ​ការ​បំប្លែង​ទៅ​ជា​ខ្សែ​អក្សរ​ត្រូវ​បាន​ពិពណ៌នា​យ៉ាង​លម្អិត​នៅ​លើ​គេហទំព័រ​ផ្លូវការ​ក្នុង​កថាខណ្ឌ​ការ​បំប្លែង​ទៅ​ជា​ខ្សែអក្សរ។

ប្រតិបត្តិករប្រៀបធៀប

ចូរបន្តទៅប្រតិបត្តិករប្រៀបធៀប។
តម្លៃ​មិន​ពិត​ទាំងអស់​ត្រឡប់​ពិត​ដូច​ដែល​បាន​រំពឹង​ទុក បើ​ប្រៀបធៀប​នឹង FALSE ដោយ​ប្រើ​ប្រតិបត្តិករ " ==" ។
ប៉ុន្តែ​អ្នក​មិន​គួរ​ពឹង​ផ្អែក​លើ​ការ​បញ្ជូន​បន្ត​នៅ​ទីនេះ​ទេ​នៅ​ពេល​ដែល​ប្រៀបធៀប​ថេរ​ខ្សែ​អក្សរ​មិន​ពិត​ជាមួយ​គ្នា។
នេះ​ជា​តារាង​ពេញលេញ​សម្រាប់​ការ​ប្រៀបធៀប​តម្លៃ​មិន​ពិត (បូក​នឹង​បង្ហាញ​ធាតុ​តារាង​ដែល​បើ​ប្រៀបធៀប​ដោយ​ប្រើ​ប្រតិបត្តិករ " != " ត្រឡប់​តម្លៃ​ពិត៖

$undef – អថេរ​ដែល​មិន​ត្រូវ​បាន​កំណត់​តម្លៃ

ការសន្និដ្ឋានដ៏រីករាយមួយចំនួនអាចត្រូវបានទាញចេញពីតារាង៖
1. ប្រសិនបើយើងដឹងថាយើងប្រើតែខ្សែអក្សរ នោះយើងអាចប្រៀបធៀបពួកវាដោយសុវត្ថិភាព ហើយកុំបារម្ភថា "" (ខ្សែអក្សរទទេ) នឹងស្មើនឹង "0" ។
2. អារេមិនដែលស្មើនឹងខ្សែអក្សរ ចំនួនគត់ ឬចំនួនពិតទេ។

ដោយសារប្រភេទនៃថេរមិនពិតខុសគ្នា ប្រតិបត្តិករមួយគូ === និង !== អាចត្រូវបានប្រើដើម្បីសម្គាល់ពួកវា។
ប្រតិបត្តិករ === ត្រឡប់ false សម្រាប់គូទាំងអស់នៃតម្លៃមិនពិត។
ត្រឡប់​តម្លៃ​ពិត​សម្រាប់​តែ​អាគុយម៉ង់​ដែល​មួយ​ត្រូវ​បាន​កំណត់​តម្លៃ NULL ហើយ​ទីពីរ​មិន​ត្រូវ​បាន​កំណត់​តម្លៃ​ណាមួយ​ទេ។

ភាពខុសគ្នារវាងអថេរដែលមានតម្លៃ NULL និងអថេរដែលមិនបានកំណត់

ប្រតិបត្តិករ === អនុញ្ញាតឱ្យអ្នកបែងចែករវាងតម្លៃមិនពិតទាំងអស់ លើកលែងតែអថេរដែលមានតម្លៃ NULL ពីអថេរដែលមិនត្រូវបានផ្តល់តម្លៃ។

អថេរបែបនេះអាចត្រូវបានសម្គាល់ដោយប្រើមុខងារ get_defined_vars() ។

ប្រសិនបើអ្នកត្រូវកំណត់ថាតើតម្លៃមួយត្រូវបានផ្តល់ទៅឱ្យអថេរ $var ឬអត់នោះ អត្ថបទកូដខាងក្រោមអាចត្រូវបានប្រើដើម្បីធ្វើការនេះ៖
ប្រសិនបើ (array_key_exists("var", get_defined_vars())) ( echo "var is defined"; // $var ត្រូវបានកំណត់ NULL ) else ( echo "var is not defined"; // $var is not defined or unset($ var) ត្រូវបានគេហៅថា)

ការសន្និដ្ឋាន

អ្នកគួរចងចាំជានិច្ចថានៅក្នុង PHP តម្លៃមិនពិតពីរអាចមិនស្មើគ្នា ហើយអថេរដែលហាក់ដូចជាខុសគ្នានៅ glance ដំបូងអាចប្រែទៅជាដូចគ្នានៅពេលប្រៀបធៀប។ ដើម្បីជៀសវាងការភ្ញាក់ផ្អើលបែបនេះ អ្នកអាចប្រើប្រតិបត្តិករ === និង !== ។

នៅពេលធ្វើការជាមួយអារេ ដើម្បីជៀសវាងការភ្ញាក់ផ្អើល អ្នកអាចសរសេរមុខងារមួយដើម្បីបំប្លែងតម្លៃទៅជាលិបិក្រមផ្សេងគ្នាដែលត្រូវបានធានា។ បន្ទាប់ពីនោះ ធាតុនៃអារេអាចចូលប្រើបានដោយប្រើវា។ វាអាចធ្វើឱ្យកម្មវិធីថយចុះ ប៉ុន្តែនឹងជួយជៀសវាងការភ្ញាក់ផ្អើល។