mySQL_fetch_array
ฉันถูกขุดผ่านรหัสบางอย่างและผมพบว่าบางสายไป PHP case มีความละเอียดอ่อนเกี่ยวกับชื่อฟังก์ชันหรือไม่? ฉันจำได้ว่าอ่านข้อความนี้ที่ไหนสักแห่ง แต่ดูเหมือนจะหาข้อมูลอ้างอิงไม่ได้
mySQL_fetch_array
ฉันถูกขุดผ่านรหัสบางอย่างและผมพบว่าบางสายไป PHP case มีความละเอียดอ่อนเกี่ยวกับชื่อฟังก์ชันหรือไม่? ฉันจำได้ว่าอ่านข้อความนี้ที่ไหนสักแห่ง แต่ดูเหมือนจะหาข้อมูลอ้างอิงไม่ได้
คำตอบ:
ไม่
ฟังก์ชัน PHP ไม่คำนึงถึงขนาดตัวพิมพ์
TL; DR: ชื่อคลาสไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ แต่ใช้กรณีเดียวกับในการประกาศเสมอ (เช่นเดียวกับฟังก์ชัน) นอกจากนี้การสร้างอินสแตนซ์คลาสด้วยเคสที่แตกต่างกันตามที่กำหนดไว้อาจทำให้เกิดปัญหากับตัวโหลดอัตโนมัติ
นอกจากนี้ชื่อคลาสยังไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่:
<?php
class SomeThing {
public $x = 'foo';
}
$a = new SomeThing();
$b = new something();
$c = new sOmEtHING();
var_dump($a, $b, $c);
ผลลัพธ์นี้:
class SomeThing#1 (1) {
public $x =>
string(3) "foo"
}
class SomeThing#2 (1) {
public $x =>
string(3) "foo"
}
class SomeThing#3 (1) {
public $x =>
string(3) "foo"
}
ปัญหาคือการใช้ตัวโหลดอัตโนมัติและระบบไฟล์ที่คำนึงถึงตัวพิมพ์เล็กและใหญ่ (เช่น ext2 / 3/4) ซึ่งคุณต้องเรียกชื่อคลาสด้วยกรณีเดียวกันกับที่ไฟล์ที่มีคลาสนั้นถูกตั้งชื่อ (ไม่ใช่วิธีการระบุชื่อคลาส) หรือใช้strtolower
:
ไฟล์คลาส:
<?php
// filename something.php
class SomeThing {
...
}
ฟังก์ชันโหลดอัตโนมัติ ( __autoload
หรือฟังก์ชันที่จะลงทะเบียนด้วยspl_autoload_register
)
function my_autloader($className) {
$filename = CLASSES_DIR . DIRECTORY_SEPARATOR . $className . '.php';
if (file_exists($filename)) {
require($filename);
}
}
ตอนนี้มีรหัสนี้:
$a = new something(); // works
$b = new SomeThing(); // does not work
$c = new SOMETHING(); // does not work
คุณสามารถทำงานนี้ได้ (กล่าวคือมีชื่อคลาสที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่อย่างมีประสิทธิภาพโดยใช้ตัวโหลดอัตโนมัติ) ถ้าคุณเพิ่มการเรียกลงstrtolower()
ในรหัสโหลดอัตโนมัติ แต่เช่นเดียวกับฟังก์ชันการอ้างอิงคลาสในลักษณะเดียวกับที่มีการประกาศไว้จะดีกว่า มีชื่อไฟล์ที่เป็นกรณีเดียวกับชื่อคลาสใช้ตัวโหลดอัตโนมัติและลืมใช้strtolower
และไลค์
ไม่ได้ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่อย่างไรก็ตามคุณควรใช้กรณีที่อยู่ในคู่มือเพื่อความสม่ำเสมอ
อย่างไรก็ตามตัวแปรจะพิจารณาตัวพิมพ์เล็กและใหญ่
ในตัวแปร PHP นั้นคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่ฟังก์ชันไม่มีปัญหาเช่นนี้คุณสามารถใช้คำสั่งต่อไปนี้เพื่อแสดงผลลัพธ์ทั้งหมดจะแสดงผลลัพธ์เดียวกัน
<?php
Echo "This is a test script";
ECHO "This is a test script";
echo "This is a test script";
?>
ในทางกลับกันถ้าคุณจะเปลี่ยน case sensitive ของตัวแปรมันจะแสดงข้อผิดพลาด
ตัวอย่าง:
<?php
$a=5;
echo $A;// It will show the error.
?>
เอาท์พุต:
Notice: Undefined variable: A in C:\xampp\htdocs\test.php on line 3
และชื่อเมธอดยังไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ เช่น:-
<?php
class C {
public function method() { }
public function METHOD() { }
}
เอาต์พุต:
PHP Fatal error: Cannot redeclare C::METHOD() in ....php on line 6
สรุปการตอบรับของทุกคน. แม้ว่าPHP จะไม่ต้องการความสอดคล้องของตัวพิมพ์เล็กและใหญ่ในทุกอินสแตนซ์จนถึงขณะนี้ใน PHP5
แนวทางปฏิบัติที่ดีที่สุดจะเป็น
ใช้กรณีเดียวกันเสมอเมื่ออ้างอิงกลับไปยังตัวแปร ('บังคับ) หรือฟังก์ชัน (' เป็นทางเลือก 'แต่แนะนำ)
คุณไม่มีทางรู้เลยว่าวันหนึ่งการโหวตจะผ่านพ้นไปและคุณจะบันทึกฝันร้ายของการเปลี่ยนแปลงกรณีต่างๆในแอปพลิเคชันของคุณเมื่อสองสามปีก่อนที่ต้องมีการอัปเดตใน PHP
หวังว่ามันจะช่วยได้
อาจจะสายเกินไป แต่ ...
ทุกคนรู้จักที่นี่แล้ว: เอ็นจิ้น PHP ไม่สนใจตัวอักษร
และมีการโหวตใน PHP bugtracker โดยส่วนใหญ่ระบุว่า: "ใช่ฉันเป็นมืออาชีพที่มีความอ่อนไหว"
แต่ฉันตรงกันข้ามเพราะในกรอบ MVC ของฉันฉันเรียกการกระทำของตัวควบคุม:
$currentController = new $controller($parameters);
$currentAction = $currentController->{$action}();
$ controller และ $ action นำมาจาก URL ตามที่เป็นอยู่
ลองคิดดูว่าหากผู้ใช้เผยแพร่ลิงก์ไปยังไซต์ของฉัน: https: // my-site / MyPartnerController / MyPartnerGallery
ในขณะที่คลาสชื่อ myPartnerController ...
หมายความว่าจะไม่มีใครได้รับหน้านี้เลยหากชื่อคลาสและฟังก์ชันของ PHP นั้นคำนึงถึงตัวพิมพ์เล็กและใหญ่
ใช่ฉันใช้ชื่อทั้งหมดในรหัสตามที่ประกาศไว้เสมอ แต่ฉันภาวนาให้พวกเขาไม่สร้างชื่อฟังก์ชันและชื่อชั้นเรียน
ขอบคุณ!