Tại sao chữ ký hàm PHP không nhất quán như vậy? [đóng cửa]


17

Tôi đã trải qua một số chức năng PHP và tôi không thể không chú ý những điều sau:

<?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)
?>

Lưu ý array_key_exists()property_exists()chức năng. Trong cái đầu tiên, tên thuộc tính (khóa cho một mảng) là tham số đầu tiên trong khi ở cái thứ hai, nó là tham số thứ hai. Theo trực giác, người ta sẽ mong muốn họ có chữ ký tương tự. Điều này có thể dẫn đến sự nhầm lẫn và thời gian phát triển có thể bị lãng phí bằng cách sửa lỗi loại này.

Không nên PHP, hoặc bất kỳ ngôn ngữ nào cho vấn đề đó, xem xét làm cho chữ ký của các chức năng liên quan nhất quán?


2
+1 bravo, đây là một trong những điều đầu tiên tôi nhận thấy về php và luôn thấy khó chịu
Kevin

Meh. Sử dụng một IDE.
Ben Dubuisson

Câu trả lời:


10

Những gì bạn đề xuất về cơ bản là thay đổi chữ ký cho nhiều chức năng hiện có. Hãy suy nghĩ trong một phút có ảnh hưởng gì đến mã hiện có. Bây giờ giả sử nhóm PHP đã phát hành phiên bản PHP N thay đổi chữ ký của 30% các chức năng. Bây giờ hãy tưởng tượng bạn phải viết mã chạy trên cả PHP vN và PHP v. {N-1} - điều đó sẽ vui đến mức nào?

Bây giờ hãy tưởng tượng bạn là một người quản lý trung tâm dữ liệu tập trung hoặc dữ liệu - bạn có động lực gì để hỗ trợ PHP vN, với điều kiện là một khi bạn chuyển đổi, tất cả các mã sẽ bị phá vỡ và người dùng sẽ đến văn phòng của bạn với cây chĩa và đèn pin?


4
+1 Thật khó khi bạn bắt đầu một cái gì đó sai cách, nhưng có một cơ sở người dùng lớn như vậy sử dụng nó trong trạng thái hiện tại.
Andy Fleming

4
Đó là một điểm hay. Tôi đã thực sự nhận thức được điều này, nhưng điểm chính của tôi là họ nên nhận thức được điều này ngay từ đầu.
Shamim Hafiz

7
@Shamim Đúng, đó là một phần lý do tại sao PHP có tiếng xấu ngay từ đầu;)
Andy Fleming

1
PHP, giống như rất nhiều thứ, bắt đầu như một công cụ nhỏ để giải quyết một vấn đề nhỏ, nếu người ta đã thiết kế nó "đúng" thì nó có thể đẹp hơn, nhưng có lẽ sẽ không đạt được lực kéo, vì vậy không ai sẽ sử dụng nó ... và một công cụ nhỏ khác sẽ "thắng", một công cụ có sự không nhất quán khác nhau ...
johannes

3
Đó là lý do tại sao có một điều như là sự phản đối. Bạn tạo các tên mới, được tiêu chuẩn hóa và loại bỏ "thanh xà lách" cũ của các tên hàm nhưng để chúng ở lại cho một vài bản phát hành. Tại một số điểm được công bố rộng rãi, bạn sẽ phát hành phiên bản chính mới đi kèm với chúng. Đây là cách nó được thực hiện. Đó là sự hèn nhát thuần túy trên phần của các nhà phát triển PHP mà họ đã không làm điều này. Họ đang vượt qua rào cản thấp để gia nhập PHP mang lại lợi thế cho các ngôn ngữ web khác và họ đã thành công vì điều đó, vì vậy họ KHÔNG NÊN tiếp tục cải thiện ngôn ngữ cốt lõi.
Dan Ray

10

Bởi vì PHP là ngôn ngữ không có đặc điểm kỹ thuật.

Và theo nghĩa đen, mọi người đều có thể thêm một vài chức năng, và không có câu hỏi về tính nhất quán ngay từ đầu. VẬY, sự lộn xộn.


không phải ai cũng có thể thêm chức năng
StasM

@StasM: Ai có thể, nhóm DEV? Bất kỳ liên kết nơi tôi có thể tìm thấy làm thế nào nhóm đó hoạt động?
Shamim Hafiz

@StasM: ok, tôi hơi phóng đại một chút. vấn đề thực sự là thiếu các quy ước kể từ khi bắt đầu hoặc một người có thể chịu trách nhiệm về sự gắn kết mã. Bây giờ là quá muộn. Tôi nghi ngờ nếu điều đó có thể được thay đổi mà không thực sự buộc PHP là ngôn ngữ khác.
ts01

@Shamim Dev nguyên tắc hoạt động của nhóm là hai: đồng thuận và tự tin. Điều này thật tuyệt, nhưng tôi sợ không đủ để phát triển ngôn ngữ tốt
ts01

@Shamim: bắt đầu với php.net và wiki.php.net.
StasM

4

Hầu hết các ngôn ngữ tốt là và phấn đấu để được nhất quán.

Nó chỉ là thực tế của trạng thái của PHP. Như StasM đã đề cập, sẽ là một cơn ác mộng khi thử và chuyển đổi những thứ như thế sau khi thực tế. Nó sẽ ảnh hưởng đến quá nhiều mã hiện có. Thông thường PHP chỉ đơn giản là phản đối các hàm và tạo ra các hàm mới tốt hơn phù hợp hơn, nhưng điều đó có thể mất nhiều thời gian.

Tôi nghĩ rằng các lập trình viên PHP thành công có thể nhớ cú pháp cụ thể hoặc sử dụng phần mềm tự động cho họ biết cú pháp.


chức năng phản đối là một điều, một điều dễ dàng. Thay đổi thứ tự đối số là nhiều hơn, khó khăn hơn
ts01

@ ts01 móng vấn đề thiết yếu. Chỉ với các tham số vị trí, không có cách nào để biết rằng hiện tại bạn có foo(a,b)thể là foo(b,a)do ai đó đã thay đổi chữ ký của foo.
Frank Shearar

@ TS01, @Frank: Bạn sẽ phải thay đổi tên của hàm, quá ... không phải là một ý tưởng đặc biệt tốt cho những thứ như "property_exists", nơi có không có tên đàng hoàng khác. Cá nhân, tôi muốn thấy các mảng trở thành các đối tượng thực tế để bạn có thể nói $array->key_exists('whatever')nhưng, meh :-)
Dean Harding

Trên thực tế, điều mà bất kỳ nhà phát triển PHP nào cũng có thể làm là tạo ra các hàm mới của riêng họ để bọc chúng. Cũng lưu ý rằng ngay lập tức có một cú pháp chung cho cả hai ví dụ được đề cập, nhưng chúng không bị phản đối như là một phần của thông số kỹ thuật được biên dịch.
dùng1122069

3

Nguồn không nhất quán chính là nhiều (hầu hết?) Của php trong các hàm dựng sẵn thực sự là các hàm bao quanh một số thư viện C. Suy nghĩ ban đầu là "Tôi đang gói hàm C xxxx do đó tôi nên giữ nguyên thứ tự tham số". Khi nói đến việc viết một hàm "php thuần túy", suy nghĩ này đã được mở rộng thành "xxxx lấy tệp và các tùy chọn, hàm mới có một tên tệp và các tùy chọn để có ý nghĩa là yyyy sẽ lấy các tham số tương tự theo cùng một thứ tự.

Lỗ hổng lớn ở đây là các thư viện C bên dưới rất không phù hợp để bắt đầu.


Họ cũng giữ các tên hàm C mà họ đang gói trong một số trường hợp (cụ thể là các hàm str) trong khi chuyển hướng mạnh mẽ từ các quy ước đặt tên của C (chẳng hạn như chúng) cho các tên hàm khác.
Dan Ray

2

Lý do (a?) Là vẫn tương thích với các phiên bản trước của PHP. Thay vì thay đổi tên hàm sẽ phá vỡ nhiều ứng dụng, các hàm vẫn còn. Tuy nhiên, bằng trực giác, có nên đặt tên chức năng nhất quán cho các ngôn ngữ mới.

Tôi phải không đồng ý với bạn về thời gian phát triển thực tế là lãng phí. Học PHP có thể mất nhiều thời gian hơn để hiểu cách đặt tên của các hàm nhất định, nhưng một khi đã thành thạo (hoặc ít nhất là nhận thức được) thì nó trở thành một vấn đề không phải là vấn đề.

Khả năng tương thích> Tính nhất quán (ít nhất là với PHP)


1
Các ngôn ngữ khác, tôi có thể viết mà không cần tham khảo liên tục đến các tài liệu. PHP Tôi luôn phải lo lắng về ... chức năng này được đánh vần là "str_" hay chỉ là "str"? Đây có phải là "mảng _" - một cái gì đó hoặc chúng ta không đề cập đến mảng? "Length ()" làm gì khi được cung cấp một chuỗi? Ôi trời, không, đó là "strlen ()" Tôi thực sự muốn ... Đó là "kim, haystack" hay "haystack, kim"? Không có ngôn ngữ khác đặt tôi qua tất cả điều đó.
Dan Ray

Giống như bạn, tôi liên tục bị làm phiền bởi điều này @DanRay. Bây giờ tôi đã bắt đầu sử dụng NetBeans PHP IDE mặc dù nó cung cấp cho tôi thông tin chính xác tôi cần ngay trong trình chỉnh sửa.
deed02392
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.