วิธีตรวจสอบว่าตัวแปรว่างเปล่าหรือไม่ใน php ฝึกใช้ฟังก์ชัน PHP Empty() PHP ว่างเปล่า() สำหรับวัตถุและอาร์เรย์
การเขียนโปรแกรมสมัยใหม่ประสบความสำเร็จในการจัดการตัวแปรที่ไม่ได้พิมพ์มาเป็นเวลานาน ไม่สามารถระบุประเภทของตัวแปรล่วงหน้าได้และสามารถเปลี่ยนแปลงได้ระหว่างการทำงานของโปรแกรม
แนวคิดนี้ได้กลายเป็นศูนย์กลางของกระบวนทัศน์การเขียนโปรแกรมทั่วไป ในช่วงเริ่มต้นของยุคการเขียนโปรแกรม ภาษาที่มีความมั่นใจเหมือนกันนั้นต้องการให้โปรแกรมเมอร์กำหนดตัวแปรล่วงหน้าและรับรองอย่างเคร่งครัดว่าไม่มีการกำหนดสิ่งผิดกฎหมาย ทั้งโปรแกรมและภาษาโปรแกรมไม่มีแนวคิดใด ๆ มาก่อนว่าตัวแปรจะเปลี่ยนประเภทของมัน
เกี่ยวกับ ความว่างเปล่า และไม่มีอยู่จริง
ฟังก์ชัน PHP Empty() เป็นสิ่งที่ตรงกันข้ามกับฟังก์ชัน isset() และมีคุณสมบัติการใช้งานพิเศษบางอย่าง หากไม่มีตัวแปร ฟังก์ชันแรกจะตอบสนองในทางบวกและผลลัพธ์จะเป็นจริง และฟังก์ชันที่สองจะตอบสนองในทางลบ นั่นคือค่าของมันจะเป็นเท็จ
ตามคำจำกัดความ isset() ได้รับการออกแบบมาเพื่อตรวจสอบการมีอยู่ของตัวแปร ไม่สำคัญว่าจะกำหนดตัวแปรอะไรและอย่างไร สิ่งสำคัญคือตัวแปรนั้นมีอยู่จริงและไม่ถูกทำลายโดยฟังก์ชัน unset() ผลลัพธ์ของฟังก์ชัน isset() จะเป็นค่าบวก - จริง สิ่งสำคัญคือต้องจำไว้ว่าถ้า $iVar = 0; จากนั้น isset($iVar) จะเป็นจริง แต่ว่าง($iVar) ก็จะเป็นจริงเช่นกัน
ในกรณีแรก ผลลัพธ์หมายความว่ามีตัวแปรอยู่ ในกรณีที่สองตัวแปรว่างเปล่า นั่นคือค่า “0” ในรูปแบบใดๆ ไม่ว่าจะเป็นสตริง (“0”) หรือตัวเลข (เศษส่วน - 0.0 หรือจำนวนเต็ม - 0) เหมือนกัน: Empty($iVar) จะเป็นจริง
เกี่ยวกับความปลอดภัยและการควบคุม
การปฏิบัติแสดงให้เห็นว่าภาษาที่ไม่ได้พิมพ์ให้อิสระแก่โปรแกรมเมอร์มากขึ้น แต่ถือว่าทัศนคติของเขาในการทำงานกับอัลกอริทึมนั้นมีความรับผิดชอบมากกว่า
PHP มีไวยากรณ์สมัยใหม่ที่รองรับความหมายที่กำหนดไว้ มีข้อผิดพลาดเล็กน้อย แต่ต้องได้รับการดูแลอย่างระมัดระวัง ตัวอย่างเช่น การเรียกใช้ฟังก์ชันใดๆ ต้องใช้พารามิเตอร์จำนวนหนึ่ง
เมื่อเรียกใช้ฟังก์ชัน ไม่จำเป็นต้องส่งพารามิเตอร์ทั้งหมดเลย คุณสามารถส่งผ่านเฉพาะส่วนที่สำคัญเท่านั้น ฟังก์ชัน "ต้อง" ตรวจสอบการมีอยู่และการมีอยู่ของพารามิเตอร์ทั้งหมด ส่วนที่หายไปหรือมีค่าไม่ถูกต้องจะต้องคืนค่าเป็นรูปแบบปกติและกำหนดค่าที่ต้องการ
ในบริบทนี้ ฟังก์ชัน PHP Empty() ถือเป็นสิ่งสำคัญ การแสดงออก:
$a = "1;2" + 20
จะกำหนดตัวแปร $a เป็นค่า 21 เนื่องจากส่วนแรกของนิพจน์จะแสดงเป็น 1 และส่วนที่สองจะเป็น 20
ผลลัพธ์จะเป็นหมายเลขประเภทและฟังก์ชัน PHP ว่างเปล่า($a) จะให้ผลลัพธ์เป็นเท็จ นั่นคือตัวแปร $a ไม่ว่างเปล่า
ในบริบทนี้ การมีฟังก์ชัน:
funcTest($a = 0, $b = 20)
เมื่อโทร:
$res = funcTest($aVal, $bVal)
จะได้สิ่งที่ต้องการนั่นคือผลลัพธ์ของฟังก์ชัน และเมื่อถูกเรียก:
- $res = funcTest($aVal. $bVal)
เนื้อความของฟังก์ชันมีพารามิเตอร์เพียงตัวเดียวที่มีค่า "$aVal . $bVal" และเป็นไปได้มากว่าพารามิเตอร์นี้จะถูกตีความว่าเป็นสตริงอักขระ
PHP ว่างเปล่า() สำหรับวัตถุและอาร์เรย์
ไวยากรณ์ของภาษามีจำนวนโครงสร้างและฟังก์ชันเพียงพอสำหรับการทำงานกับวัตถุและอาร์เรย์ แต่จากมุมมองของการตรวจสอบการมีอยู่และการมีอยู่ของค่า ไม่มีความแตกต่างพิเศษจากตัวแปร
PHP ว่างเปล่า (อาร์เรย์) - เทียบเท่ากับการเรียกว่าง (ตัวแปรอย่างง่าย) อย่างไรก็ตาม มีข้อควรพิจารณาที่สำคัญมากเกี่ยวกับวัตถุ สำหรับการตรวจสอบวัตถุเพื่อการดำรงอยู่ (isset) คำถามนี้แทบจะไม่สมเหตุสมผลเลย เกี่ยวกับ ฟังก์ชั่น PHPว่างเปล่า() ดังนั้นความเหมาะสมในการใช้งานยังคงเป็นปัญหาอยู่
ตามตรรกะของการเขียนโปรแกรมเชิงวัตถุ อ็อบเจ็กต์มีเนื้อหาของตัวเองและชุดวิธีการของตัวเอง มีเพียงออบเจ็กต์เท่านั้นที่สามารถบอกได้ว่าว่างเปล่าหรือไม่ว่าง แต่ไม่ใช่ฟังก์ชันของบุคคลที่สาม แม้ว่าจะเป็นส่วนหนึ่งของไวยากรณ์ของภาษาก็ตาม
วัตถุและฟังก์ชันของมันว่างเปล่า()
บนพื้นฐานที่เรียบง่ายแต่ถูกต้องตามกฎหมายนี้ ทุกวัตถุควรได้รับการพิจารณาในบริบทของความเข้าใจเรื่อง "ความว่างเปล่า" ตัวอย่างเช่น การใช้งานออบเจ็กต์ "ตารางการรับพนักงาน" ประกอบด้วยเรกคอร์ด "พนักงาน" แต่หากไม่มีพนักงานเพียงคนเดียว ใน "รายชื่อพนักงาน" จะมีตัวเลือกสำหรับตำแหน่งงานของผู้มีโอกาสเป็นพนักงานเสมอ
ฉันควรใช้ฟังก์ชันวัตถุว่าง PHP ที่นี่ในระดับใด ในระดับ "พนักงาน" ทุกอย่างมีอยู่จริง แม้ว่าจะไม่มีพนักงานสักคนเดียวก็ตาม ในระดับ "พนักงาน" วัตถุนั้นมีอยู่แล้ว แม้ว่าจะไม่ได้เติมเต็มทั้งหมดก็ตาม วัตถุที่เติมไม่เต็มสามารถจัดเป็นวัตถุว่างเปล่าได้ ไม่มีประโยชน์อะไรกับโต๊ะพนักงาน
ขึ้นอยู่กับสไตล์การเขียนโปรแกรมของคุณ ฟังก์ชัน PHP Empty() และ isset() มีความสำคัญมากสำหรับการสร้างอัลกอริธึมที่ปลอดภัยและเชื่อถือได้ แต่สำหรับอ็อบเจ็กต์ ยังดีกว่าที่จะมีตัวแปรของ Empty() ที่กำหนดโดยเนื้อหา
สตริงตัวแปร (12)
ฉันมีฟังก์ชัน isNotEmpty ที่คืนค่าเป็นจริงหากสตริงไม่ว่างเปล่า และคืนค่าเป็นเท็จหากสตริงว่างเปล่า ฉันพบว่ามันใช้งานไม่ได้หากฉันผ่านบรรทัดว่างผ่านมัน
ฟังก์ชั่น isNotEmpty($input) ( $strTemp = $input; $strTemp = trim($strTemp); if(strTemp != "") //Also try this "if(strlen($strTemp) > 0)" ( return true ; ) กลับเท็จ ;
ตรวจสอบสตริงโดยใช้ isNotEmpty:
If(isNotEmpty($userinput["phoneNumber"])) ( //ตรวจสอบหมายเลขโทรศัพท์ ) else ( echo "ไม่ได้กรอกหมายเลขโทรศัพท์
";
}
หากบรรทัดว่างเปล่า อย่างอื่นจะไม่ถูกดำเนินการ ฉันไม่เข้าใจว่าทำไม ใครช่วยอธิบายเรื่องนี้ได้บ้าง
คำตอบ
หากคุณมีฟิลด์ชื่อ serial_number และต้องการตรวจสอบพื้นที่ว่าง
$serial_number = ตัด($_POST); $q="select * จากผลิตภัณฑ์โดยที่ user_id="$_SESSION""; $rs=mysql_query($q); ในขณะที่($row=mysql_fetch_assoc($rs))( if(empty($_POST["irons"]))( $irons=$row["product1"]; )
ด้วยวิธีนี้คุณสามารถวนซ้ำลูปทั้งหมดในลูปด้วยฟังก์ชันว่างอื่น
แทนที่จะตอบ (ฉันเชื่อว่าคุณได้แก้ไขปัญหาของคุณแล้ว) ฉันจะให้คำแนะนำแก่คุณ
คนอื่นๆ ฉันไม่รู้ แต่โดยส่วนตัวแล้วฉันรู้สึกรำคาญมากเมื่อเห็นอะไรประมาณนี้:
ถ้า(<
สิ่งนี้ต้องการผลตอบแทน " อันสง่างาม (<
ฉันแค่เขียนของฉัน ฟังก์ชั่นของตัวเอง is_string สำหรับการตรวจสอบประเภท และ strlen สำหรับการตรวจสอบความยาว
ฟังก์ชั่น EmptyStr($str) ( return is_string($str) && strlen($str) === 0; ) print EmptyStr("") ? "ว่างเปล่า" : "ไม่ว่างเปล่า"; // ว่างเปล่า
แก้ไข: คุณยังสามารถใช้ฟังก์ชันตัดแต่งเพื่อตรวจสอบว่าสตริงไม่มีอยู่หรือไม่
Is_string($str) && strlen(ตัดแต่ง($str)) === 0;
PHP มีฟังก์ชันในตัวที่เรียกว่า Empty() การทดสอบทำได้โดยการพิมพ์ if(empty($string))(...) ลิงก์ php.net: php Empty
คุณมีคำตอบ แต่ในกรณีของคุณคุณสามารถใช้ได้
กลับว่างเปล่า($input);
กลับ is_string($input);
ปัญหาง่ายๆ- เปลี่ยน:
ถ้า(strTemp != "")
ถ้า($strTemp != "")
บางทีคุณอาจเปลี่ยนเป็น:
ถ้า($strTemp !== "")
เนื่องจาก != "" จะส่งคืนค่าจริงหากคุณส่งผ่านตัวเลข 0 และอีกสองสามกรณีเนื่องจากการแปลงประเภทอัตโนมัติของ PHP
โปรดทราบว่า PHP มีฟังก์ชัน Empty() อยู่แล้ว
PHP ประเมินสตริงว่างเป็นเท็จ ดังนั้นคุณสามารถใช้:
If (trim($userinput["phoneNumber"])) ( // ตรวจสอบหมายเลขโทรศัพท์ ) else ( echo "ไม่ได้ป้อนหมายเลขโทรศัพท์
";
}
ฉันใช้เสมอ การแสดงออกปกติสำหรับการตรวจสอบสตริงว่าง ย้อนกลับไปในสมัยของ CGI/Perl รวมถึง Javascript ดังนั้นทำไมไม่ลองใช้ PHP เป็นตัวอย่าง (แม้ว่าจะยังไม่ทดลองก็ตาม)
กลับ preg_match("/\S/", $input);
โดยที่ \S แทนอักขระใดๆ ที่ไม่มีช่องว่าง
เพียงใช้ฟังก์ชัน strlen()
ถ้า (strlen($s)) ( // ไม่ว่างเปล่า )
ฉันเพิ่งถามตัวเองด้วยคำถามเดียวกัน
มีหลายอย่าง แนวทางแก้ไขที่เป็นไปได้มี 3 รายการที่ถูกต้อง:
- s.indexOf(เริ่มต้น) === 0
- s.substr(0,starter.length) === สตาร์ทเตอร์
- s.lastIndexOf(starter, 0) === 0 (เพิ่มหลังจากดูคำตอบของ Mark Bayer)
ใช้ลูป:
ฟังก์ชั่น startWith(s,starter) ( for (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 (ความสามัคคี) แนะนำวิธีการเริ่มต้นด้วยสตริงของตัวเอง
ลองนึกดูว่าจะประหยัดเวลาได้มากเพียงใดหากพวกเขาคิดที่จะรวมวิธีการที่จำเป็นมากนี้ไว้ในเวอร์ชันแรก
อัปเดต
โปรดทราบว่ามีการเพิ่มประสิทธิภาพลูป 2 แบบที่ Steve รวมไว้ โดยแบบแรกจากทั้งสองแบบมีประสิทธิภาพที่ดีกว่า ดังนั้นฉันจะโพสต์โค้ดนั้นด้านล่าง:
ฟังก์ชั่น startWith2(str, คำนำหน้า) ( if (str.length< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === คำนำหน้า[i]); --i) ดำเนินการต่อ;< 0; }
กลับมาฉัน ในความหมายของ PHP
FALSE และ NULL และค่าที่เกี่ยวข้องนั้นแตกต่างจากที่มักใช้ในภาษาอื่นและมีคุณสมบัติที่ไม่ชัดเจนในตัวเอง
บทความนี้กล่าวถึงคุณลักษณะเหล่านี้
สำหรับผู้เริ่มต้น สิ่งนี้อาจมีประโยชน์สำหรับการดูภาพเต็มสำหรับผู้อ่านที่มีประสบการณ์ - เพื่อรีเฟรชความทรงจำหากมีความแตกต่างเล็กน้อยบางอย่างทำให้จิตใจของพวกเขาหลุดลอยไป
FALSE ในคำสั่ง If- ตามเอกสาร PHP ค่าต่อไปนี้เป็น FALSE หลังจากส่งไปที่บูลีน:
- ค่าบูลีนนั้นเป็น FALSE
- สตริงว่าง ("") และสตริง "0"
- อาร์เรย์ว่าง (อาร์เรย์) – อาร์เรย์()
- ออบเจ็กต์ที่มีตัวแปรสมาชิกเป็นศูนย์ (PHP 4 เท่านั้น ไม่ครอบคลุมในบทความนี้)
- ค่า NULL พิเศษ (รวมถึงตัวแปรที่ไม่ได้ตั้งค่า)
ซึ่งหมายความว่าหากค่าดังกล่าวถูกส่งไปยังเงื่อนไข:
ถ้า (…) สะท้อน “1”; อย่างอื่นสะท้อน “0”;
จากนั้นสตริง "0" จะถูกพิมพ์
หากไม่ได้ตั้งค่าของตัวแปร (ไม่ได้ตั้งค่า) อาจมีการออกคำเตือนด้วย เราขอเตือนคุณว่าคำเตือนในเงื่อนไขสามารถลบออกได้โดยการเขียน @ หน้าตัวแปร
ตัวอย่างเช่น:
ถ้า (@$undefVar) ( …)
แต่คุณควรใช้ @ เฉพาะในกรณีที่รุนแรงเท่านั้น เมื่อคุณคิดอย่างรอบคอบแล้วและไม่มีตัวเลือกอื่นที่เหมาะสม ดูฟังก์ชัน isset()
is_null() ส่งคืน TRUE สำหรับตัวแปรที่ไม่ได้กำหนดค่าใด ๆ หรือกำหนดค่า NULL เท่านั้นisset() ส่งคืนค่าบูลีนแบบหนึ่งต่อหนึ่งเมื่อเปรียบเทียบกับ is_null()
หากตัวแปรไม่ได้รับการกำหนดค่า ดังนั้น is_null() จะแสดงคำเตือน "ตัวแปรที่ไม่ได้กำหนด" เช่นกัน ซึ่งแตกต่างจาก isset() ซึ่งจะไม่แสดงคำเตือนใดๆ
โปรดทราบว่าหากต้องการลบค่าของตัวแปร คุณสามารถใช้ฟังก์ชัน unset() ได้ คุณยังสามารถกำหนดค่า NULL เพื่อจุดประสงค์นี้เพื่อหลีกเลี่ยงคำเตือนของคอมไพเลอร์เมื่อพยายามอ่านค่าของตัวแปร
โปรดทราบว่าในการทำงานกับค่าคงที่นั้นต่างจากตัวแปรตรงที่คุณต้องใช้โครงสร้างที่กำหนด ()
การแสดงสตริง
ลองดูการแสดงสตริงของค่าคงที่เท็จ
ตัวอย่างเช่น การต่อข้อมูลจะแปลงค่าเป็นสตริงต่อไปนี้ ดังแสดงในตารางด้านล่าง:
หัวข้อของการแปลงเป็นสตริงได้อธิบายไว้ในรายละเอียดเพิ่มเติมบนเว็บไซต์อย่างเป็นทางการในย่อหน้าการแปลงเป็นสตริง
ตัวดำเนินการเปรียบเทียบ
มาดูตัวดำเนินการเปรียบเทียบกันดีกว่าค่าเท็จทั้งหมดจะคืนค่าเป็นจริงตามที่คาดไว้ เมื่อเปรียบเทียบกับ FALSE โดยใช้ตัวดำเนินการ " == "
แต่คุณไม่ควรพึ่งพาการเปลี่ยนแปลงในที่นี้เมื่อเปรียบเทียบค่าคงที่สตริงเท็จระหว่างกัน
นี่คือตารางที่สมบูรณ์สำหรับการเปรียบเทียบค่าเท็จ (บวกหมายถึงองค์ประกอบของตารางที่เมื่อเปรียบเทียบโดยใช้ตัวดำเนินการ " != " จะส่งกลับค่าจริง:
$undef – ตัวแปรที่ยังไม่ได้กำหนดค่า
สามารถสรุปข้อสรุปที่น่าพอใจได้จากตาราง:
1. หากเรารู้ว่าเราใช้เฉพาะสตริง เราก็สามารถเปรียบเทียบได้อย่างปลอดภัย และไม่ต้องกังวลว่า "" (สตริงว่าง) จะเท่ากับ "0"
2. อาร์เรย์ไม่เท่ากับสตริง จำนวนเต็ม หรือจำนวนจริง
เนื่องจากประเภทของค่าคงที่เท็จที่แตกต่างกันจะแตกต่างกัน สามารถใช้ตัวดำเนินการคู่ === และ !== เพื่อแยกแยะความแตกต่างได้
ตัวดำเนินการ === ส่งคืนค่าเท็จสำหรับคู่ค่าเท็จทั้งหมด
ส่งกลับค่าจริงเฉพาะสำหรับอาร์กิวเมนต์หนึ่งซึ่งกำหนดค่าเป็น NULL และอาร์กิวเมนต์ตัวที่สองไม่ได้กำหนดค่าใดๆ
ความแตกต่างระหว่างตัวแปรที่มีค่า NULL และตัวแปรที่ไม่ได้กำหนด
ตัวดำเนินการ === ช่วยให้คุณสามารถแยกแยะค่าเท็จทั้งหมดได้ ยกเว้นตัวแปรที่มีค่า NULL จากตัวแปรที่ยังไม่ได้กำหนดค่า
ตัวแปรดังกล่าวสามารถแยกแยะได้โดยใช้ฟังก์ชัน get_defin_vars()
หากคุณต้องการตรวจสอบว่าได้กำหนดค่าให้กับตัวแปร $var หรือไม่ คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้เพื่อทำสิ่งนี้:
if (array_key_exists("var", get_defin_vars())) ( echo "var is Defined"; // $var ถูกกำหนดให้เป็น NULL ) else ( echo "var is NOT Defed"; // $var ไม่ได้ถูกกำหนดไว้หรือไม่ได้ตั้งค่า($ var) ถูกเรียก)
ข้อสรุป
คุณควรจำไว้เสมอว่าใน PHP ค่าเท็จสองค่าอาจไม่เท่ากันและตัวแปรที่ดูเหมือนจะแตกต่างกันตั้งแต่แรกเห็นอาจกลายเป็นค่าเดียวกันเมื่อเปรียบเทียบ เพื่อหลีกเลี่ยงเหตุการณ์ไม่คาดคิด คุณสามารถใช้ตัวดำเนินการ === และ !==เมื่อทำงานกับอาร์เรย์เพื่อหลีกเลี่ยงความประหลาดใจคุณสามารถเขียนฟังก์ชันเพื่อแปลงค่าเป็นดัชนีที่แตกต่างกันที่รับประกันได้ หลังจากนั้นองค์ประกอบของอาร์เรย์สามารถเข้าถึงได้โดยใช้เท่านั้น นี่อาจทำให้โปรแกรมช้าลง แต่จะช่วยหลีกเลี่ยงเรื่องเซอร์ไพรส์ได้
การทดสอบดำเนินการบน PHP 5.3.1
ลิงค์เพิ่มเติม
1. ตารางเปรียบเทียบประเภท PHP2. MySQl Null และสตริงว่างในบริบทของ PHP
แท็ก: เพิ่มแท็ก
ใน PHP ค่า FALSE และ NULL และค่าที่เกี่ยวข้องจะแตกต่างจากค่าปกติในภาษาอื่นและมีคุณสมบัติที่ไม่ชัดเจนในตัวเอง
FALSE และ NULL และค่าที่เกี่ยวข้องนั้นแตกต่างจากที่มักใช้ในภาษาอื่นและมีคุณสมบัติที่ไม่ชัดเจนในตัวเอง
บทความนี้กล่าวถึงคุณลักษณะเหล่านี้
สำหรับผู้เริ่มต้น สิ่งนี้อาจมีประโยชน์สำหรับการดูภาพเต็มสำหรับผู้อ่านที่มีประสบการณ์ - เพื่อรีเฟรชความทรงจำหากมีความแตกต่างเล็กน้อยบางอย่างทำให้จิตใจของพวกเขาหลุดลอยไป
FALSE ในคำสั่ง If- ตามเอกสาร PHP ค่าต่อไปนี้เป็น FALSE หลังจากส่งไปที่บูลีน:
- ค่าบูลีนนั้นเป็น FALSE
- สตริงว่าง ("") และสตริง "0"
- อาร์เรย์ว่าง (อาร์เรย์) – อาร์เรย์()
- ออบเจ็กต์ที่มีตัวแปรสมาชิกเป็นศูนย์ (PHP 4 เท่านั้น ไม่ครอบคลุมในบทความนี้)
- ค่า NULL พิเศษ (รวมถึงตัวแปรที่ไม่ได้ตั้งค่า)
ซึ่งหมายความว่าหากค่าดังกล่าวถูกส่งไปยังเงื่อนไข:
ถ้า (…) สะท้อน “1”; อย่างอื่นสะท้อน “0”;
จากนั้นสตริง "0" จะถูกพิมพ์
หากไม่ได้ตั้งค่าของตัวแปร (ไม่ได้ตั้งค่า) อาจมีการออกคำเตือนด้วย เราขอเตือนคุณว่าคำเตือนในเงื่อนไขสามารถลบออกได้โดยการเขียน @ หน้าตัวแปร
ตัวอย่างเช่น:
ถ้า (@$undefVar) ( …)
แต่คุณควรใช้ @ เฉพาะในกรณีที่รุนแรงเท่านั้น เมื่อคุณคิดอย่างรอบคอบแล้วและไม่มีตัวเลือกอื่นที่เหมาะสม ดูฟังก์ชัน isset()
is_null() ส่งคืน TRUE สำหรับตัวแปรที่ไม่ได้กำหนดค่าใด ๆ หรือกำหนดค่า NULL เท่านั้นisset() ส่งคืนค่าบูลีนแบบหนึ่งต่อหนึ่งเมื่อเปรียบเทียบกับ is_null()
หากตัวแปรไม่ได้รับการกำหนดค่า ดังนั้น is_null() จะแสดงคำเตือน "ตัวแปรที่ไม่ได้กำหนด" เช่นกัน ซึ่งแตกต่างจาก isset() ซึ่งจะไม่แสดงคำเตือนใดๆ
โปรดทราบว่าหากต้องการลบค่าของตัวแปร คุณสามารถใช้ฟังก์ชัน unset() ได้ คุณยังสามารถกำหนดค่า NULL เพื่อจุดประสงค์นี้เพื่อหลีกเลี่ยงคำเตือนของคอมไพเลอร์เมื่อพยายามอ่านค่าของตัวแปร
โปรดทราบว่าในการทำงานกับค่าคงที่นั้นต่างจากตัวแปรตรงที่คุณต้องใช้โครงสร้างที่กำหนด ()
การแสดงสตริง
ลองดูการแสดงสตริงของค่าคงที่เท็จ
ตัวอย่างเช่น การต่อข้อมูลจะแปลงค่าเป็นสตริงต่อไปนี้ ดังแสดงในตารางด้านล่าง:
หัวข้อของการแปลงเป็นสตริงได้อธิบายไว้ในรายละเอียดเพิ่มเติมบนเว็บไซต์อย่างเป็นทางการในย่อหน้าการแปลงเป็นสตริง
ตัวดำเนินการเปรียบเทียบ
มาดูตัวดำเนินการเปรียบเทียบกันดีกว่าค่าเท็จทั้งหมดจะคืนค่าเป็นจริงตามที่คาดไว้ เมื่อเปรียบเทียบกับ FALSE โดยใช้ตัวดำเนินการ " == "
แต่คุณไม่ควรพึ่งพาการเปลี่ยนแปลงในที่นี้เมื่อเปรียบเทียบค่าคงที่สตริงเท็จระหว่างกัน
นี่คือตารางที่สมบูรณ์สำหรับการเปรียบเทียบค่าเท็จ (บวกหมายถึงองค์ประกอบของตารางที่เมื่อเปรียบเทียบโดยใช้ตัวดำเนินการ " != " จะส่งกลับค่าจริง:
$undef – ตัวแปรที่ยังไม่ได้กำหนดค่า
สามารถสรุปข้อสรุปที่น่าพอใจได้จากตาราง:
1. หากเรารู้ว่าเราใช้เฉพาะสตริง เราก็สามารถเปรียบเทียบได้อย่างปลอดภัย และไม่ต้องกังวลว่า "" (สตริงว่าง) จะเท่ากับ "0"
2. อาร์เรย์ไม่เท่ากับสตริง จำนวนเต็ม หรือจำนวนจริง
เนื่องจากประเภทของค่าคงที่เท็จที่แตกต่างกันจะแตกต่างกัน สามารถใช้ตัวดำเนินการคู่ === และ !== เพื่อแยกแยะความแตกต่างได้
ตัวดำเนินการ === ส่งคืนค่าเท็จสำหรับคู่ค่าเท็จทั้งหมด
ส่งกลับค่าจริงเฉพาะสำหรับอาร์กิวเมนต์หนึ่งซึ่งกำหนดค่าเป็น NULL และอาร์กิวเมนต์ตัวที่สองไม่ได้กำหนดค่าใดๆ
ความแตกต่างระหว่างตัวแปรที่มีค่า NULL และตัวแปรที่ไม่ได้กำหนด
ตัวดำเนินการ === ช่วยให้คุณสามารถแยกแยะค่าเท็จทั้งหมดได้ ยกเว้นตัวแปรที่มีค่า NULL จากตัวแปรที่ยังไม่ได้กำหนดค่า
ตัวแปรดังกล่าวสามารถแยกแยะได้โดยใช้ฟังก์ชัน get_defin_vars()
หากคุณต้องการตรวจสอบว่าได้กำหนดค่าให้กับตัวแปร $var หรือไม่ คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้เพื่อทำสิ่งนี้:
if (array_key_exists("var", get_defin_vars())) ( echo "var is Defined"; // $var ถูกกำหนดให้เป็น NULL ) else ( echo "var is NOT Defed"; // $var ไม่ได้ถูกกำหนดไว้หรือไม่ได้ตั้งค่า($ var) ถูกเรียก)
ข้อสรุป
คุณควรจำไว้เสมอว่าใน PHP ค่าเท็จสองค่าอาจไม่เท่ากันและตัวแปรที่ดูเหมือนจะแตกต่างกันตั้งแต่แรกเห็นอาจกลายเป็นค่าเดียวกันเมื่อเปรียบเทียบ เพื่อหลีกเลี่ยงเหตุการณ์ไม่คาดคิด คุณสามารถใช้ตัวดำเนินการ === และ !==เมื่อทำงานกับอาร์เรย์เพื่อหลีกเลี่ยงความประหลาดใจคุณสามารถเขียนฟังก์ชันเพื่อแปลงค่าเป็นดัชนีที่แตกต่างกันที่รับประกันได้ หลังจากนั้นองค์ประกอบของอาร์เรย์สามารถเข้าถึงได้โดยใช้เท่านั้น นี่อาจทำให้โปรแกรมช้าลง แต่จะช่วยหลีกเลี่ยงเรื่องเซอร์ไพรส์ได้
เมื่อทำงานกับสตริง หากจำเป็นต้องตรวจสอบว่าสตริงว่างหรือไม่ โปรแกรมเมอร์มือใหม่มักจะใช้ฟังก์ชันนี้ สเตรน()- ฟังก์ชันนี้ค่อนข้างเร็วเนื่องจากไม่ได้ทำการคำนวณใดๆ แต่เพียงส่งคืนค่าที่ทราบอยู่แล้วของความยาวสตริงซึ่งมีอยู่ในรูปแบบ zval (PHP ใช้โครงสร้าง C เพื่อจัดเก็บตัวแปร) แต่ถึงอย่างนั้นก็เพราะว่า สเตรน()- นี่คือฟังก์ชัน มันช้านิดหน่อยเพราะเมื่อถูกเรียกต้องมีการดำเนินการหลายอย่าง เช่น การแปลงเป็นตัวพิมพ์เล็กและการค้นหาตารางแฮช ในบางกรณี คุณสามารถเพิ่มความเร็วในการดำเนินการโค้ดของคุณได้โดยใช้ ว่างเปล่า()...แต่ก็เช่นกัน ว่างเปล่า()คุณยังคงสามารถเพิ่มประสิทธิภาพได้เล็กน้อย
ลองมาตัวอย่างตัวอย่างเช่น ตรวจสอบเส้นทางของภาพฟังก์ชันจะตรวจสอบว่าเส้นทางว่างเปล่าหรือไม่ จากนั้นแทนที่ด้วยเส้นทางอื่น เช่น “images/noimage.jpg”
ดังนั้นงานทั้งหมดจึงต้องตรวจสอบว่าตัวแปรประเภทสตริงว่างเปล่าหรือไม่ ลอง 4 วิธี:
- ถ้า(strlen($img_path)>0)
- ถ้า($img_path(0))
- ถ้า(ว่าง($img_path))
- และอีกวิธีหนึ่งสุดท้าย
ดังนั้นเราจะเขียนในลักษณะแรก:
ฟังก์ชั่น check_image_path($img_path ) ( if (strlen ($img_path ) >0 ) ( $img_path = "images/noimage.jpg" ; ) ส่งคืน $img_path ; )เรามาทำการทดสอบกัน โดยใช้เวลาทดสอบโดยเฉลี่ย 1.43795800209 วินาที
ลองคิดดูอีกหน่อย... คุณสามารถเข้าถึงอักขระตัวแรกของบรรทัดได้ในคราวเดียว แทนที่จะเข้าถึงทั้งบรรทัด หากมีอักขระตัวแรก แสดงว่าสตริงนั้นไม่ว่างเปล่า อักขระตัวแรกในบรรทัดมีหมายเลข "0"
ฟังก์ชั่น check_image_path($img_path) ( if ($img_path ( 0 ) ) ( $img_path = "images/noimage.jpg" ; ) ส่งคืน $img_path ; )ใช้เวลาทดสอบโดยเฉลี่ย 1.19431300163 วินาที 17% ของเวลาที่เล่น
มาลองเขียนโดยใช้ Empty() กัน:
ฟังก์ชั่น check_image_path($img_path) ( if (empty ($img_path) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )ใช้เวลาทดสอบโดยเฉลี่ย 1.1341319084 วินาที 5% ของเวลาที่เล่นจากตัวอย่างก่อนหน้า
ตอนนี้เรามาดูตัวอย่างสุดท้ายและตัวอย่างสุดท้ายด้านบนเรากัน มาดูกันว่าสิ่งนี้สามารถรวมกันได้อย่างไร คิดว่า... คุณจะเพิ่มประสิทธิภาพได้อย่างไร?
ฟังก์ชั่น check_image_path($img_path) ( if (empty ($img_path ( 0 ) ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )ใช้เวลาทดสอบโดยเฉลี่ย 1.07465314865 วินาที และอีกครั้งที่เราชนะ 5% ของเวลา...
มันทำงานอย่างไรและทำไมมันถึงเร็วกว่า? แต่ $img_path(0)ส่งคืนอักขระตัวแรก... จากนั้นฟังก์ชัน ว่างเปล่า()ตรวจสอบสตริงว่าง... ความแตกต่างจากตัวอย่างก่อนหน้านี้คือมีเพียงอักขระเดียวเท่านั้นที่ถูกส่งไปยังฟังก์ชัน ไม่ใช่ทั้งสตริง ดังนั้นตั้งแต่ตัวอย่างแรกจนถึงตัวอย่างสุดท้ายที่เราชนะ 25% เวลา.