เหตุใดลายเซ็นฟังก์ชัน PHP จึงไม่สอดคล้องกัน [ปิด]


17

ฉันกำลังใช้งานฟังก์ชั่น PHP อยู่และฉันไม่สามารถสังเกตเห็นสิ่งต่อไปนี้ได้:

<?php
function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>

สังเกตarray_key_exists()และproperty_exists()ฟังก์ชั่น ในอันแรกชื่อคุณสมบัติ (คีย์สำหรับอาร์เรย์) เป็นพารามิเตอร์แรกในขณะที่ในครั้งที่สองมันเป็นพารามิเตอร์ที่สอง โดยสัญชาตญาณเราคาดว่าพวกเขาจะมีลายเซ็นที่คล้ายกัน สิ่งนี้สามารถนำไปสู่ความสับสนและเวลาในการพัฒนาอาจสูญเปล่าโดยการแก้ไขประเภทนี้

PHP หรือภาษาใด ๆ สำหรับเรื่องนั้นไม่ควรพิจารณาทำให้การใช้งานที่เกี่ยวข้องนั้นสอดคล้องกัน?


2
+1 bravo นี่เป็นหนึ่งในสิ่งแรกที่ฉันสังเกตเห็นเกี่ยวกับ php และพบว่าน่ารำคาญอยู่เสมอ
Kevin

Meh ใช้ IDE
Ben Dubuisson

คำตอบ:


10

สิ่งที่คุณเสนอคือการเปลี่ยนลายเซ็นเป็นฟังก์ชั่นที่มีอยู่มากมาย ลองคิดดูสิว่าผลกระทบใดที่จะเกิดกับโค้ดปัจจุบัน ตอนนี้สมมติว่ากลุ่ม PHP ได้เปิดตัว PHP เวอร์ชัน N ที่เปลี่ยนแปลงลายเซ็นของฟังก์ชัน 30% ตอนนี้คิดว่าคุณต้องเขียนโค้ดที่รันทั้ง PHP vN และ PHP v. {N-1} - มันสนุกขนาดไหน?

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


4
+1 มันยากเมื่อคุณเริ่มสิ่งผิดปกติ แต่มีฐานผู้ใช้ขนาดใหญ่ที่ใช้มันในสถานะปัจจุบัน
Andy Fleming

4
นั่นเป็นจุดที่ดี จริง ๆ แล้วฉันก็รู้เรื่องนี้ แต่ประเด็นหลักของฉันคือพวกเขาควรจะตระหนักถึงเรื่องนี้ตั้งแต่แรก
Shamim Hafiz

7
@Shamim ทรูซึ่งเป็นส่วนหนึ่งของเหตุผล PHP มีชื่อเสียงที่ไม่ดีในสถานที่แรก;)
แอนดี้เฟลมมิ่ง

1
PHP, เหมือนหลาย ๆ อย่าง, เริ่มต้นเป็นเครื่องมือขนาดเล็กเพื่อแก้ปัญหาเล็ก ๆ , ถ้าใครออกแบบมันให้ถูกต้องแล้วมันอาจจะดีกว่า, แต่อาจจะไม่ถึงแรงฉุด, ดังนั้นจึงไม่มีใครใช้มัน ... และอีกหนึ่งเครื่องมือที่มีขนาดเล็กจะมี "ชนะ" ซึ่งเป็นเครื่องมือที่มีความไม่สอดคล้องกันแตกต่างกัน ...
ฮันเนส

3
นั่นเป็นสาเหตุที่มีเรื่องแบบนี้เกิดขึ้น คุณสร้างชื่อใหม่ที่ได้มาตรฐานและเลิกใช้ "ฟังก์ชันสลัดบาร์" อันเก่าแก่ของชื่อฟังก์ชั่น เมื่อถึงจุดหนึ่งที่มีการประชาสัมพันธ์ที่ดีคุณจะพบกับรุ่นใหญ่รุ่นใหม่ที่ออกมาพร้อมกับพวกเขา นี่คือสิ่งที่ทำ เป็นความขี้ขลาดบริสุทธิ์ในส่วนของ PHP ที่พวกเขาไม่ได้ทำ พวกเขากำลังก้าวข้ามสิ่งกีดขวางไปยังรายการที่ให้ PHP ได้เปรียบเหนือภาษาเว็บอื่น ๆ และพวกเขาประสบความสำเร็จเพราะสิ่งนั้นดังนั้นพวกเขาจึงไม่จำเป็นต้องพัฒนาภาษาหลักต่อไป
Dan Ray

10

เพราะ PHP เป็นภาษาที่ไม่มีข้อกำหนดใด ๆ

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


ไม่ใช่ทุกคนที่สามารถเพิ่มฟังก์ชั่นได้
StasM

@StasM: ใครสามารถกลุ่ม DEV ลิงก์ใดที่ฉันสามารถค้นหาวิธีการทำงานของกลุ่มนั้น
Shamim Hafiz

@ ขั้นตอน: โอเคฉันพูดเกินจริงไปหน่อย ปัญหาที่แท้จริงคือการขาดการประชุมตั้งแต่เริ่มต้นหรือหนึ่งคนรับผิดชอบการทำงานร่วมกันของรหัส สายเกินไปแล้ว ฉันสงสัยว่าสิ่งนี้สามารถเปลี่ยนแปลงได้โดยไม่ต้องใช้ PHP เป็นภาษาอื่นอย่างแท้จริง
ts01

@ Samim Dev กลุ่มหลักการของการดำเนินงานเป็นสอง: ฉันทามติและความเชื่อมั่น ซึ่งเจ๋งมาก แต่ฉันกลัวว่าจะไม่เพียงพอสำหรับการพัฒนาภาษาที่ดี
ts01

@Shamim: เริ่มต้นด้วย php.net และ wiki.php.net
StasM

4

ภาษาที่ดีที่สุดคือและพยายามให้สอดคล้อง

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

ฉันคิดว่าโปรแกรมเมอร์ PHP ที่ประสบความสำเร็จอาจจำไวยากรณ์เฉพาะหรือใช้ซอฟต์แวร์ที่บอกไวยากรณ์ให้พวกเขาโดยอัตโนมัติ


ฟังก์ชั่นการเลิกใช้เป็นสิ่งหนึ่งที่ง่าย การเปลี่ยนลำดับอาร์กิวเมนต์มากขึ้นยากขึ้น
ts01

@ ts01 ตอกย้ำปัญหาที่สำคัญ ด้วยพารามิเตอร์ตำแหน่งเท่านั้นจึงไม่มีทางรู้ได้ว่าคุณมีอยู่foo(a,b)แล้วในตอนนี้foo(b,a)เพราะมีคนเปลี่ยนลายเซ็นของ foo
Frank Shearar

@ TS01, @Frank: คุณจะต้องเปลี่ยนชื่อของฟังก์ชั่นที่มากเกินไป ... ไม่ได้เป็นความคิดที่ดีโดยเฉพาะอย่างยิ่งสำหรับสิ่งที่ชอบ "property_exists" ที่มีคือไม่มีชื่อที่ดีอื่น ๆ โดยส่วนตัวฉันต้องการเห็นอาร์เรย์กลายเป็นวัตถุจริงเพื่อให้คุณสามารถพูดได้$array->key_exists('whatever')แต่ meh :-)
Dean Harding

ที่จริงแล้วสิ่งที่ PHP dev สามารถทำได้คือการสร้างฟังก์ชั่นใหม่ของตัวเองเพื่อห่อสิ่งเหล่านี้ โปรดทราบว่า isset () มีไวยากรณ์สากลสำหรับทั้งสองตัวอย่างที่กล่าวถึง แต่ก็ไม่ได้ถูกคัดค้านในฐานะเป็นส่วนหนึ่งของข้อมูลจำเพาะที่รวบรวม
user1122069

3

แหล่งที่มาหลักของความไม่สอดคล้องกันคือ php ในฟังก์ชั่นที่สร้างขึ้นจำนวนมาก (ส่วนใหญ่?) สร้างขึ้นในไลบรารี C บางตัว ความคิดเริ่มต้นคือ "ฉันกำลังหุ้มฟังก์ชั่น C xxxx ดังนั้นฉันจึงควรรักษาลำดับพารามิเตอร์ไว้เหมือนเดิม" เมื่อมันมาถึงการเขียนฟังก์ชั่น "pure php" ความคิดนี้ได้ขยายไปถึง "xxxx ใช้ไฟล์และตัวเลือกฟังก์ชั่นใหม่ใช้ชื่อไฟล์และตัวเลือกดังนั้นจึงเหมาะสมที่ yyyy จะใช้พารามิเตอร์เดียวกันในลำดับเดียวกัน

ข้อบกพร่องใหญ่ที่นี่คือไลบรารี C พื้นฐานนั้นไม่สอดคล้องกันมากในการเริ่มต้น


พวกเขายังคงชื่อฟังก์ชั่น C ที่พวกเขาห่อในบางกรณี (ฟังก์ชั่น str โดยเฉพาะ) ในขณะที่แตกต่างอย่างรุนแรงจากอนุสัญญาการตั้งชื่อของ C (เช่นพวกเขา) สำหรับชื่อฟังก์ชั่นอื่น ๆ
Dan Ray

2

เหตุผล (?) คือการเข้ากันได้กับ PHP รุ่นก่อนหน้า แทนที่จะเปลี่ยนชื่อฟังก์ชันที่จะทำลายแอปพลิเคชั่นจำนวนมากฟังก์ชันยังคงอยู่ อย่างไรก็ตามโดยสัญชาตญาณการตั้งชื่อฟังก์ชั่นที่สอดคล้องกันควรนำมาพิจารณาสำหรับภาษาใหม่

ฉันต้องไม่เห็นด้วยกับคุณในการพัฒนาความเป็นจริงเสียเวลา การเรียนรู้ PHP อาจใช้เวลานานกว่าในการทำความเข้าใจการตั้งชื่อของฟังก์ชั่นบางอย่าง แต่เมื่อเข้าใจ (หรืออย่างน้อยก็รู้) มันจะกลายเป็นปัญหา

ความเข้ากันได้> ความสอดคล้อง (อย่างน้อยต้อง PHP)


1
ภาษาอื่นฉันสามารถเขียนได้โดยไม่ต้องอ้างอิงเอกสาร PHP ฉันต้องกังวลเสมอ ... ฟังก์ชั่นนี้สะกด "str_" หรือเพียงแค่ "str"? นี่คือ "array _" - อะไรบางอย่างหรือเราไม่พูดถึงอาร์เรย์? "length ()" ทำอะไรเมื่อได้รับสตริง โอ้นรกไม่มันคือ "strlen ()" ฉันอยากได้จริงๆ ... มันคือ "เข็ม, กองหญ้า" หรือ "กองหญ้า, เข็ม" หรือไม่? ไม่มีภาษาอื่นใดที่ทำให้ฉันรู้
Dan Ray

เช่นเดียวกับคุณฉันรู้สึกรำคาญที่ @DanRay นี้ตลอดเวลา ฉันเริ่มใช้ NetBeans PHP IDE แล้วในขณะนี้ซึ่งให้ข้อมูลที่ถูกต้องที่ฉันต้องการในตัวแก้ไข
deed02392
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.