ฟังก์ชัน PHP มีความละเอียดอ่อนหรือไม่?


101

mySQL_fetch_arrayฉันถูกขุดผ่านรหัสบางอย่างและผมพบว่าบางสายไป PHP case มีความละเอียดอ่อนเกี่ยวกับชื่อฟังก์ชันหรือไม่? ฉันจำได้ว่าอ่านข้อความนี้ที่ไหนสักแห่ง แต่ดูเหมือนจะหาข้อมูลอ้างอิงไม่ได้


1
ไม่พวกเขาดูเหมือนจะไม่เป็น ความชอบมักเป็นตัวพิมพ์เล็ก
Jason

3
สำเนาstackoverflow.com/questions/2749781/… . ไม่ฟังก์ชันไม่
คำนึงถึงขนาดตัว

สำหรับการอ้างอิง: มันถูกฝังไว้ที่กลางphp.net/manual/en/functions.user-defined.phpในNote: block
มาริโอ

3
ฉันโหวตให้ปล่อยไว้ - ชื่อเรื่องนี้มีความกว้างและชัดเจนกว่ามากดังนั้นจึงน่าจะช่วยคนได้มากขึ้น
coreyward

คำตอบ:


100

ฉันอ้างจากสิ่งนี้ :

หมายเหตุ: ชื่อฟังก์ชันไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่แม้ว่าโดยปกติแล้วจะเป็นรูปแบบที่ดีในการเรียกใช้ฟังก์ชันตามที่ปรากฏในการประกาศ

ดังนั้นดูเหมือนว่าฟังก์ชันที่ผู้ใช้กำหนดเองจะไม่คำนึงถึงขนาดตัวพิมพ์มีการโหวตให้สร้างฟังก์ชัน / อ็อบเจ็กต์ภายใต้ PHP5 case-sensitive


3
PHP5 หมดแล้วความหวังเดียวของคุณคือ PHP6 และฉันไม่คิดว่าพวกเขาจะทำตามขั้นตอนนั้น มันจะแตกมากเพื่อผลประโยชน์เพียงเล็กน้อย
Mark Tomlin

3
@Mark Tomlin ฉันไม่เห็นด้วย แนวทางปฏิบัติที่ดีที่สุดคือการรักษากรณีเดียวกับที่มีในคู่มือดังนั้นจึงควรทำลายเพียงเล็กน้อยในขณะที่เพิ่มความชัดเจน
Ben Dauphinee

12
ว้าว. นั่นเป็นเรื่องน่าเศร้า แม้ว่า ImAgEcReAtEfRoMpNg () จะเป็นวิธีที่ดีในการสร้างรหัสที่ทำให้สับสน ...
Pontomedon

8
เนื่องจากคำพูดระบุว่า "ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่" เหตุใดคุณจึงพูดว่า "จึงดูเหมือนว่าผู้ใช้กำหนดจะพิจารณาตัวพิมพ์เล็กและใหญ่" หากเป็นการพิมพ์ผิดคุณควรแก้ไขจริงๆ
Barmar

13
ว้าว! นี่เป็นเรื่องดีมากที่ได้ทราบหลังจาก 7 ปีของการเขียนโค้ด!
Daan


19

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และไลค์


7

ไม่ได้ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่อย่างไรก็ตามคุณควรใช้กรณีที่อยู่ในคู่มือเพื่อความสม่ำเสมอ

อย่างไรก็ตามตัวแปรจะพิจารณาตัวพิมพ์เล็กและใหญ่


3

ในตัวแปร 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

2

และชื่อเมธอดยังไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ เช่น:-

<?php
       class C { 

           public function method() { } 

           public function METHOD() { } 
       }

เอาต์พุต:

PHP Fatal error:  Cannot redeclare C::METHOD() in ....php on line 6

1

สรุปการตอบรับของทุกคน. แม้ว่าPHP จะไม่ต้องการความสอดคล้องของตัวพิมพ์เล็กและใหญ่ในทุกอินสแตนซ์จนถึงขณะนี้ใน PHP5

แนวทางปฏิบัติที่ดีที่สุดจะเป็น

ใช้กรณีเดียวกันเสมอเมื่ออ้างอิงกลับไปยังตัวแปร ('บังคับ) หรือฟังก์ชัน (' เป็นทางเลือก 'แต่แนะนำ)

คุณไม่มีทางรู้เลยว่าวันหนึ่งการโหวตจะผ่านพ้นไปและคุณจะบันทึกฝันร้ายของการเปลี่ยนแปลงกรณีต่างๆในแอปพลิเคชันของคุณเมื่อสองสามปีก่อนที่ต้องมีการอัปเดตใน PHP

หวังว่ามันจะช่วยได้


Re "บันทึกฝันร้ายทั้งหมดของการเปลี่ยนแปลงกรณี": ไม่ฉันเข้าใจว่าหากมีการเปลี่ยนแปลงขึ้นมาความไวของตัวพิมพ์จะเป็นตัวเลือกที่ตั้งค่าใน php.ini จึงรักษาความเข้ากันได้แบบย้อนกลับ
ToolmakerSteve

-2

อาจจะสายเกินไป แต่ ...

ทุกคนรู้จักที่นี่แล้ว: เอ็นจิ้น PHP ไม่สนใจตัวอักษร

และมีการโหวตใน PHP bugtracker โดยส่วนใหญ่ระบุว่า: "ใช่ฉันเป็นมืออาชีพที่มีความอ่อนไหว"

แต่ฉันตรงกันข้ามเพราะในกรอบ MVC ของฉันฉันเรียกการกระทำของตัวควบคุม:

    $currentController = new $controller($parameters);
    $currentAction = $currentController->{$action}();

$ controller และ $ action นำมาจาก URL ตามที่เป็นอยู่

ลองคิดดูว่าหากผู้ใช้เผยแพร่ลิงก์ไปยังไซต์ของฉัน: https: // my-site / MyPartnerController / MyPartnerGallery

ในขณะที่คลาสชื่อ myPartnerController ...

หมายความว่าจะไม่มีใครได้รับหน้านี้เลยหากชื่อคลาสและฟังก์ชันของ PHP นั้นคำนึงถึงตัวพิมพ์เล็กและใหญ่

ใช่ฉันใช้ชื่อทั้งหมดในรหัสตามที่ประกาศไว้เสมอ แต่ฉันภาวนาให้พวกเขาไม่สร้างชื่อฟังก์ชันและชื่อชั้นเรียน

ขอบคุณ!


1
แย่จริงๆ ... ถ้าฉันไปที่my-site / myLogInPage / loginsuccessและเดาสิ่งที่คุณเรียกว่าฟังก์ชันความสำเร็จในการเข้าสู่ระบบของคุณที่ฉันจะเข้าหรือสามารถลบข้อมูลบางอย่างได้ ....
Tschallacka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.